@t2000/sdk 1.22.1 → 1.23.0
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/adapters/index.cjs +53 -29
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.js +53 -29
- package/dist/adapters/index.js.map +1 -1
- package/dist/index.cjs +74 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -5
- package/dist/index.d.ts +36 -5
- package/dist/index.js +74 -33
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/.pnpm/lodash.camelcase@4.3.0/node_modules/lodash.camelcase/index.js","../../src/errors.ts","../../src/constants.ts","../../src/adapters/registry.ts","../../src/utils/format.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/uleb.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/reader.ts","../../../../node_modules/.pnpm/@scure+base@2.0.0/node_modules/@scure/base/index.ts","../../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/b58.ts","../../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/b64.ts","../../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/hex.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/utils.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/writer.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/bcs-type.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/bcs.ts","../../../../node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.mjs","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/bcs.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/ua.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/utils.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/pool.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/market.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/config.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/emode.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/account.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/oracle.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/reward.ts","../../src/protocols/navi.ts","../../src/adapters/descriptors.ts","../../src/adapters/navi.ts"],"names":["exports","Symbol","b","x","vector","BcsType","options","#bytes","name","k","P","BigNumber","alphabet","compare","q","ne","xe","ye","format","z","Address","bcs","val","fromHex","toHex","IncentivePoolInfo","UserStateInfo","sdkVersion","packageJson","getNodeInfo","os","nodeVersion","osType","osArch","getUserAgent","environmentInfo","userAgent","suiClient","SuiClient","getFullnodeUrl","argsKey","args","serializergs","option","index","isLast","client","disableCache","cacheTime","rest","withSingleton","fn","promiseMap","key","withCache","cache","cacheData","result","parseTxValue","value","parseTxPoolValue","tx","parseDevInspectResult","data","parseTypes","item","normalizeCoinType","coinType","normalizeStructTag","processContractHealthFactor","hf","healthFactor","SuiPriceServiceConnection","Rate_Decimals","rayMathMulIndex","amount","ray","halfRay","requestHeaders","getPoolsMap","pools","acc","pool","poolToEModePool","emodeIdentity","emode","emodeAsset","asset","parsePoolUID","uid","marketKey","poolId","uuid","getPools","markets","MARKETS","identity","getMarketConfig","url","market","res","emodes","poolSupplyAmount","poolBorrowAmount","poolSupplyValue","poolBorrowValue","poolSupplyCapAmount","poolBorrowCapAmount","poolSupplyCapValue","poolBorrowCapValue","getPool","identifier","parsedUID","DEFAULT_MARKET_IDENTITY","DEFAULT_CACHE_TIME","p","depositCoinPTB","coinObject","config","getConfig","isGasCoin","depositAmount","withdrawCoinPTB","withdrawAmount","withdrawBalance","ret","borrowCoinPTB","borrowAmount","borrowBalance","repayCoinPTB","repayAmount","marketIdentity","marketConfig","getUserEModeCaps","address","Transaction","values","marketIds","emodeIds","accountCaps","marketId","getSimulatedHealthFactorPTB","estimatedSupply","estimatedBorrow","isIncrease","getHealthFactorPTB","getLendingStateBatch","tasks","poolsMap","task","stateList","states","state","supplyBalance","getHealthFactor","getLendingPositions","positions","emodeCaps","e","cap","emodeCap","lendingState","supplyAmount","emodePool","suiPythConnection","getOnChainPriceInfo","pythInfos","priceInfos","priceInfoObjectIds","priceInfoObjects","obj","pythInfo","v","objectFields","magnitude","negative","conf","timestamp","err","getPythStalePriceFeedIdV2","returnData","latestPriceFeeds","currentTimestamp","priceFeed","maxTime","error","updatePythPriceFeeds","priceFeedIds","priceUpdateData","SuiPythClient","updateOraclePricesPTB","priceFeeds","feed","stalePriceFeedIds","getPriceFeeds","filterPriceFeeds","feeds","filters","position","updateOraclePriceBeforeUserOperationPTB","allPriceFeeds","lendingPositions","relevantFeeds","getLendingRewardsBatch","rewardsList","rewardsData","count","i","getUserAvailableLendingRewards","summaryLendingRewards","rewards","agg","reward","assetId","rewardType","groupMap","total","groupKey","rewardMap","group","available","claimLendingRewardsPTB","rewardCoinType","ruleIds","owner","emodeId","ruleId","rewardCoins","assetIds","isEMode","matchedRewardFund","rewardBalance","rewardCoin"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',\n rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',\n rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,\n rsUpper + '+' + rsOptUpperContr,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 'ss'\n};\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\n/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n});\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = camelCase;\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'CHAIN_MODE_INVALID'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail no matter how many times you retry.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import { T2000Error } from './errors.js';\n\nexport const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\n// ---------------------------------------------------------------------------\n// Operation → allowed asset rules (single source of truth)\n// ---------------------------------------------------------------------------\n\n// [v0.51.0] Saveable/borrowable set: USDC + USDsui.\n// USDC is the canonical default; USDsui is a strategic exception backed by an\n// existing NAVI pool. See `.cursor/rules/savings-usdc-only.mdc` for the\n// rationale and the rule that gates additional stables (don't add more here\n// without updating that file).\nexport const OPERATION_ASSETS = {\n save: ['USDC', 'USDsui'],\n borrow: ['USDC', 'USDsui'],\n withdraw: '*',\n repay: '*',\n send: '*',\n swap: '*',\n} as const;\n\nexport type Operation = keyof typeof OPERATION_ASSETS;\n\nexport function isAllowedAsset(op: Operation, asset: string): boolean {\n const allowed = OPERATION_ASSETS[op];\n if (allowed === '*') return true;\n // [v0.51.0] Mixed-case canonical keys (USDsui, suiUSDT) need case-insensitive\n // membership. Pre-v0.51 we only had USDC ↔ USDC (uppercase identity), so\n // a one-sided uppercase compare looked correct. Now that USDsui is in the\n // set, normalize both sides.\n const target = asset.toLowerCase();\n return (allowed as readonly string[]).some((a) => a.toLowerCase() === target);\n}\n\n/**\n * Throws if the asset is not permitted for the given operation.\n * Passing `undefined` (omitted) is always valid — defaults to USDC.\n */\nexport function assertAllowedAsset(op: Operation, asset: string | undefined): void {\n if (!asset) return;\n if (!isAllowedAsset(op, asset)) {\n const allowed = OPERATION_ASSETS[op];\n const list = Array.isArray(allowed) ? allowed.join(', ') : 'any';\n throw new T2000Error(\n 'INVALID_ASSET',\n `${op} only supports ${list}. Cannot use ${asset}.${op === 'save' ? ' Swap to USDC or USDsui first.' : ''}`,\n );\n }\n}\n\n// All protocol fees route here as a regular USDC wallet transfer. Audric's\n// prepare/route.ts adds `addFeeTransfer(...)` inline for save/borrow and passes\n// `overlayFee.receiver = T2000_OVERLAY_FEE_WALLET` for swaps. The CLI/SDK never\n// charge fees — this constant is exported for consumer apps only.\n//\n// Address corresponds to the treasury admin wallet. Override via env for local dev /\n// testnet only — production must use the canonical mainnet address below.\nexport const T2000_OVERLAY_FEE_WALLET = process.env.T2000_OVERLAY_FEE_WALLET\n ?? '0x5366efbf2b4fe5767fe2e78eb197aa5f5d138d88ac3333fbf3f80a1927da473a';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports saving ${asset}`);\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async bestBorrowRate(asset: string, opts?: { requireSameAssetBorrow?: boolean }): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('borrow')) continue;\n if (opts?.requireSameAssetBorrow && !adapter.supportsSameAssetBorrow) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports borrowing ${asset}`);\n }\n\n candidates.sort((a, b) => a.rate.borrowApy - b.rate.borrowApy);\n return candidates[0];\n }\n\n async bestSaveRateAcrossAssets(): Promise<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> = [];\n\n for (const asset of STABLE_ASSETS) {\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate, asset });\n } catch { /* skip */ }\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'No lending adapter found for any stablecoin');\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async allRatesAcrossAssets(): Promise<Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }> = [];\n const seen = new Set<string>();\n for (const asset of STABLE_ASSETS) {\n if (seen.has(asset)) continue;\n seen.add(asset);\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n if (rates.saveApy > 0 || rates.borrowApy > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, asset, rates });\n }\n } catch { /* skip */ }\n }\n }\n return results;\n }\n\n async allRates(asset: string): Promise<Array<{ protocol: string; protocolId: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; rates: LendingRates }> = [];\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n results.push({ protocol: adapter.name, protocolId: adapter.id, rates });\n } catch {\n // skip\n }\n }\n return results;\n }\n\n async allPositions(address: string): Promise<Array<{ protocol: string; protocolId: string; positions: AdapterPositions }>> {\n const results: Array<{ protocol: string; protocolId: string; positions: AdapterPositions }> = [];\n const errors: string[] = [];\n for (const adapter of this.lending.values()) {\n try {\n const positions = await adapter.getPositions(address);\n if (positions.supplies.length > 0 || positions.borrows.length > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, positions });\n }\n } catch (err) {\n errors.push(`${adapter.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (results.length === 0 && errors.length > 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol queries failed (${errors.length}/${this.lending.size}): ${errors.join('; ')}`);\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// Helper utility: write number as an ULEB array.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebEncode(num: number | bigint): number[] {\n\tlet bigNum = BigInt(num);\n\tconst arr: number[] = [];\n\tlet len = 0;\n\n\tif (bigNum === 0n) {\n\t\treturn [0];\n\t}\n\n\twhile (bigNum > 0) {\n\t\tarr[len] = Number(bigNum & 0x7fn);\n\t\tbigNum >>= 7n;\n\t\tif (bigNum > 0n) {\n\t\t\tarr[len] |= 0x80;\n\t\t}\n\t\tlen += 1;\n\t}\n\n\treturn arr;\n}\n\n// Helper utility: decode ULEB as an array of numbers.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebDecode(arr: number[] | Uint8Array): {\n\tvalue: number;\n\tlength: number;\n} {\n\tlet total = 0n;\n\tlet shift = 0n;\n\tlet len = 0;\n\n\twhile (true) {\n\t\tif (len >= arr.length) {\n\t\t\tthrow new Error('ULEB decode error: buffer overflow');\n\t\t}\n\n\t\tconst byte = arr[len];\n\t\tlen += 1;\n\t\ttotal += BigInt(byte & 0x7f) << shift;\n\t\tif ((byte & 0x80) === 0) {\n\t\t\tbreak;\n\t\t}\n\t\tshift += 7n;\n\t}\n\n\t// TODO: return bigint in next major version\n\tif (total > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new Error('ULEB decode error: value exceeds MAX_SAFE_INTEGER');\n\t}\n\n\treturn {\n\t\tvalue: Number(total),\n\t\tlength: len,\n\t};\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ulebDecode } from './uleb.js';\n\n/**\n * Class used for reading BCS data chunk by chunk. Meant to be used\n * by some wrapper, which will make sure that data is valid and is\n * matching the desired format.\n *\n * @example\n * // data for this example is:\n * // { a: u8, b: u32, c: bool, d: u64 }\n *\n * let reader = new BcsReader(\"647f1a060001ffffe7890423c78a050102030405\");\n * let field1 = reader.read8();\n * let field2 = reader.read32();\n * let field3 = reader.read8() === '1'; // bool\n * let field4 = reader.read64();\n * // ....\n *\n * Reading vectors is another deal in bcs. To read a vector, you first need to read\n * its length using {@link readULEB}. Here's an example:\n * @example\n * // data encoded: { field: [1, 2, 3, 4, 5] }\n * let reader = new BcsReader(\"050102030405\");\n * let vec_length = reader.readULEB();\n * let elements = [];\n * for (let i = 0; i < vec_length; i++) {\n * elements.push(reader.read8());\n * }\n * console.log(elements); // [1,2,3,4,5]\n *\n * @param {String} data HEX-encoded data (serialized BCS)\n */\nexport class BcsReader {\n\tprivate dataView: DataView;\n\tprivate bytePosition: number = 0;\n\n\t/**\n\t * @param {Uint8Array} data Data to use as a buffer.\n\t */\n\tconstructor(data: Uint8Array) {\n\t\tthis.dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\t}\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number) {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Read U8 value from the buffer and shift cursor by 1.\n\t * @returns\n\t */\n\tread8(): number {\n\t\tconst value = this.dataView.getUint8(this.bytePosition);\n\t\tthis.shift(1);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U16 value from the buffer and shift cursor by 2.\n\t * @returns\n\t */\n\tread16(): number {\n\t\tconst value = this.dataView.getUint16(this.bytePosition, true);\n\t\tthis.shift(2);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U32 value from the buffer and shift cursor by 4.\n\t * @returns\n\t */\n\tread32(): number {\n\t\tconst value = this.dataView.getUint32(this.bytePosition, true);\n\t\tthis.shift(4);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U64 value from the buffer and shift cursor by 8.\n\t * @returns\n\t */\n\tread64(): string {\n\t\tconst value1 = this.read32();\n\t\tconst value2 = this.read32();\n\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(8, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 16.\n\t */\n\tread128(): string {\n\t\tconst value1 = BigInt(this.read64());\n\t\tconst value2 = BigInt(this.read64());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(16, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 32.\n\t * @returns\n\t */\n\tread256(): string {\n\t\tconst value1 = BigInt(this.read128());\n\t\tconst value2 = BigInt(this.read128());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(32, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read `num` number of bytes from the buffer and shift cursor by `num`.\n\t * @param num Number of bytes to read.\n\t */\n\treadBytes(num: number): Uint8Array {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst value = new Uint8Array(this.dataView.buffer, start, num);\n\n\t\tthis.shift(num);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read ULEB value - an integer of varying size. Used for enum indexes and\n\t * vector lengths.\n\t * @returns {Number} The ULEB value.\n\t */\n\treadULEB(): number {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst buffer = new Uint8Array(this.dataView.buffer, start);\n\t\tconst { value, length } = ulebDecode(buffer);\n\n\t\tthis.shift(length);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read a BCS vector: read a length and then apply function `cb` X times\n\t * where X is the length of the vector, defined as ULEB in BCS bytes.\n\t * @param cb Callback to process elements of vector.\n\t * @returns {Array<Any>} Array of the resulting values, returned by callback.\n\t */\n\treadVec(cb: (reader: BcsReader, i: number, length: number) => any): any[] {\n\t\tconst length = this.readULEB();\n\t\tconst result = [];\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult.push(cb(this, i, length));\n\t\t}\n\t\treturn result;\n\t}\n}\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { base58 } from '@scure/base';\n\nexport const toBase58 = (buffer: Uint8Array) => base58.encode(buffer);\nexport const fromBase58 = (str: string) => base58.decode(str) as Uint8Array<ArrayBuffer>;\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function fromBase64(base64String: string): Uint8Array<ArrayBuffer> {\n\treturn Uint8Array.from(atob(base64String), (char) => char.charCodeAt(0));\n}\n\nconst CHUNK_SIZE = 8192;\nexport function toBase64(bytes: Uint8Array): string {\n\t// Special-case the simple case for speed's sake.\n\tif (bytes.length < CHUNK_SIZE) {\n\t\treturn btoa(String.fromCharCode(...bytes));\n\t}\n\n\tlet output = '';\n\tfor (var i = 0; i < bytes.length; i += CHUNK_SIZE) {\n\t\tconst chunk = bytes.slice(i, i + CHUNK_SIZE);\n\t\toutput += String.fromCharCode(...chunk);\n\t}\n\n\treturn btoa(output);\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function fromHex(hexStr: string): Uint8Array<ArrayBuffer> {\n\tconst normalized = hexStr.startsWith('0x') ? hexStr.slice(2) : hexStr;\n\tconst padded = normalized.length % 2 === 0 ? normalized : `0${normalized}`;\n\tconst intArr = padded.match(/[0-9a-fA-F]{2}/g)?.map((byte) => parseInt(byte, 16)) ?? [];\n\n\tif (intArr.length !== padded.length / 2) {\n\t\tthrow new Error(`Invalid hex string ${hexStr}`);\n\t}\n\n\treturn Uint8Array.from(intArr);\n}\n\nexport function toHex(bytes: Uint8Array): string {\n\treturn bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, fromHex, toBase58, toBase64, toHex } from '@mysten/utils';\nimport type { Encoding } from './types.js';\n\n/**\n * Encode data with either `hex` or `base64`.\n *\n * @param {Uint8Array} data Data to encode.\n * @param {String} encoding Encoding to use: base64 or hex\n * @returns {String} Encoded value.\n */\nexport function encodeStr(data: Uint8Array, encoding: Encoding): string {\n\tswitch (encoding) {\n\t\tcase 'base58':\n\t\t\treturn toBase58(data);\n\t\tcase 'base64':\n\t\t\treturn toBase64(data);\n\t\tcase 'hex':\n\t\t\treturn toHex(data);\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported encoding, supported values are: base64, hex');\n\t}\n}\n\n/**\n * Decode either `base64` or `hex` data.\n *\n * @param {String} data Data to encode.\n * @param {String} encoding Encoding to use: base64 or hex\n * @returns {Uint8Array} Encoded value.\n */\nexport function decodeStr(data: string, encoding: Encoding): Uint8Array {\n\tswitch (encoding) {\n\t\tcase 'base58':\n\t\t\treturn fromBase58(data);\n\t\tcase 'base64':\n\t\t\treturn fromBase64(data);\n\t\tcase 'hex':\n\t\t\treturn fromHex(data);\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported encoding, supported values are: base64, hex');\n\t}\n}\n\nexport function splitGenericParameters(\n\tstr: string,\n\tgenericSeparators: [string, string] = ['<', '>'],\n) {\n\tconst [left, right] = genericSeparators;\n\tconst tok = [];\n\tlet word = '';\n\tlet nestedAngleBrackets = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst char = str[i];\n\t\tif (char === left) {\n\t\t\tnestedAngleBrackets++;\n\t\t}\n\t\tif (char === right) {\n\t\t\tnestedAngleBrackets--;\n\t\t}\n\t\tif (nestedAngleBrackets === 0 && char === ',') {\n\t\t\ttok.push(word.trim());\n\t\t\tword = '';\n\t\t\tcontinue;\n\t\t}\n\t\tword += char;\n\t}\n\n\ttok.push(word.trim());\n\n\treturn tok;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Encoding } from './types.js';\nimport { ulebEncode } from './uleb.js';\nimport { encodeStr } from './utils.js';\n\nexport interface BcsWriterOptions {\n\t/** The initial size (in bytes) of the buffer tht will be allocated */\n\tinitialSize?: number;\n\t/** The maximum size (in bytes) that the buffer is allowed to grow to */\n\tmaxSize?: number;\n\t/** The amount of bytes that will be allocated whenever additional memory is required */\n\tallocateSize?: number;\n}\n\n/**\n * Class used to write BCS data into a buffer. Initializer requires\n * some size of a buffer to init; default value for this buffer is 1KB.\n *\n * Most methods are chainable, so it is possible to write them in one go.\n *\n * @example\n * let serialized = new BcsWriter()\n * .write8(10)\n * .write32(1000000)\n * .write64(10000001000000)\n * .hex();\n */\n\n/**\n * Set of methods that allows data encoding/decoding as standalone\n * BCS value or a part of a composed structure/vector.\n */\nexport class BcsWriter {\n\tprivate dataView: DataView<ArrayBuffer>;\n\tprivate bytePosition: number = 0;\n\tprivate size: number;\n\tprivate maxSize: number;\n\tprivate allocateSize: number;\n\n\tconstructor({\n\t\tinitialSize = 1024,\n\t\tmaxSize = Infinity,\n\t\tallocateSize = 1024,\n\t}: BcsWriterOptions = {}) {\n\t\tthis.size = initialSize;\n\t\tthis.maxSize = maxSize;\n\t\tthis.allocateSize = allocateSize;\n\t\tthis.dataView = new DataView(new ArrayBuffer(initialSize));\n\t}\n\n\tprivate ensureSizeOrGrow(bytes: number) {\n\t\tconst requiredSize = this.bytePosition + bytes;\n\t\tif (requiredSize > this.size) {\n\t\t\tconst nextSize = Math.min(\n\t\t\t\tthis.maxSize,\n\t\t\t\tMath.max(this.size + requiredSize, this.size + this.allocateSize),\n\t\t\t);\n\t\t\tif (requiredSize > nextSize) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Attempting to serialize to BCS, but buffer does not have enough size. Allocated size: ${this.size}, Max size: ${this.maxSize}, Required size: ${requiredSize}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.size = nextSize;\n\t\t\tconst nextBuffer = new ArrayBuffer(this.size);\n\t\t\tnew Uint8Array(nextBuffer).set(new Uint8Array(this.dataView.buffer));\n\t\t\tthis.dataView = new DataView(nextBuffer);\n\t\t}\n\t}\n\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number): this {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite8(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(1);\n\t\tthis.dataView.setUint8(this.bytePosition, Number(value));\n\t\treturn this.shift(1);\n\t}\n\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteBytes(bytes: Uint8Array): this {\n\t\tthis.ensureSizeOrGrow(bytes.length);\n\n\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\tthis.dataView.setUint8(this.bytePosition + i, bytes[i]);\n\t\t}\n\n\t\treturn this.shift(bytes.length);\n\t}\n\t/**\n\t * Write a U16 value into a buffer and shift cursor position by 2.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite16(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(2);\n\t\tthis.dataView.setUint16(this.bytePosition, Number(value), true);\n\t\treturn this.shift(2);\n\t}\n\t/**\n\t * Write a U32 value into a buffer and shift cursor position by 4.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite32(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(4);\n\t\tthis.dataView.setUint32(this.bytePosition, Number(value), true);\n\t\treturn this.shift(4);\n\t}\n\t/**\n\t * Write a U64 value into a buffer and shift cursor position by 8.\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite64(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 8).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U128 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite128(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 16).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U256 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite256(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 32).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a ULEB value into a buffer and shift cursor position by number of bytes\n\t * written.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteULEB(value: number): this {\n\t\tulebEncode(value).forEach((el) => this.write8(el));\n\t\treturn this;\n\t}\n\t/**\n\t * Write a vector into a buffer by first writing the vector length and then calling\n\t * a callback on each passed value.\n\t *\n\t * @param {Array<Any>} vector Array of elements to write.\n\t * @param {WriteVecCb} cb Callback to call on each element of the vector.\n\t * @returns {this}\n\t */\n\twriteVec(vector: any[], cb: (writer: BcsWriter, el: any, i: number, len: number) => void): this {\n\t\tthis.writeULEB(vector.length);\n\t\tArray.from(vector).forEach((el, i) => cb(this, el, i, vector.length));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds support for iterations over the object.\n\t * @returns {Uint8Array}\n\t */\n\t// oxlint-disable-next-line require-yields\n\t*[Symbol.iterator](): Iterator<number, Iterable<number>> {\n\t\tfor (let i = 0; i < this.bytePosition; i++) {\n\t\t\tyield this.dataView.getUint8(i);\n\t\t}\n\t\treturn this.toBytes();\n\t}\n\n\t/**\n\t * Get underlying buffer taking only value bytes (in case initial buffer size was bigger).\n\t * @returns {Uint8Array} Resulting bcs.\n\t */\n\ttoBytes(): Uint8Array<ArrayBuffer> {\n\t\treturn new Uint8Array(this.dataView.buffer.slice(0, this.bytePosition));\n\t}\n\n\t/**\n\t * Represent data as 'hex' or 'base64'\n\t * @param encoding Encoding to use: 'base64' or 'hex'\n\t */\n\ttoString(encoding: Encoding): string {\n\t\treturn encodeStr(this.toBytes(), encoding);\n\t}\n}\n\nfunction toLittleEndian(bigint: bigint, size: number) {\n\tconst result = new Uint8Array(size);\n\tlet i = 0;\n\twhile (bigint > 0) {\n\t\tresult[i] = Number(bigint % BigInt(256));\n\t\tbigint = bigint / BigInt(256);\n\t\ti += 1;\n\t}\n\treturn result;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, toBase58, toBase64, fromHex, toHex } from '@mysten/utils';\nimport { BcsReader } from './reader.js';\nimport { ulebEncode } from './uleb.js';\nimport type { BcsWriterOptions } from './writer.js';\nimport { BcsWriter } from './writer.js';\nimport type { EnumInputShape, EnumOutputShape, JoinString } from './types.js';\n\nexport interface BcsTypeOptions<T, Input = T, Name extends string = string> {\n\tname?: Name;\n\tvalidate?: (value: Input) => void;\n}\n\nexport class BcsType<T, Input = T, const Name extends string = string> {\n\t$inferType!: T;\n\t$inferInput!: Input;\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserializedSize: (value: Input, options?: BcsWriterOptions) => number | null;\n\tvalidate: (value: Input) => void;\n\t#write: (value: Input, writer: BcsWriter) => void;\n\t#serialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\n\tconstructor(\n\t\toptions: {\n\t\t\tname: Name;\n\t\t\tread: (reader: BcsReader) => T;\n\t\t\twrite: (value: Input, writer: BcsWriter) => void;\n\t\t\tserialize?: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\t\t\tserializedSize?: (value: Input) => number | null;\n\t\t\tvalidate?: (value: Input) => void;\n\t\t} & BcsTypeOptions<T, Input, Name>,\n\t) {\n\t\tthis.name = options.name;\n\t\tthis.read = options.read;\n\t\tthis.serializedSize = options.serializedSize ?? (() => null);\n\t\tthis.#write = options.write;\n\t\tthis.#serialize =\n\t\t\toptions.serialize ??\n\t\t\t((value, options) => {\n\t\t\t\tconst writer = new BcsWriter({\n\t\t\t\t\tinitialSize: this.serializedSize(value) ?? undefined,\n\t\t\t\t\t...options,\n\t\t\t\t});\n\t\t\t\tthis.#write(value, writer);\n\t\t\t\treturn writer.toBytes();\n\t\t\t});\n\n\t\tthis.validate = options.validate ?? (() => {});\n\t}\n\n\twrite(value: Input, writer: BcsWriter) {\n\t\tthis.validate(value);\n\t\tthis.#write(value, writer);\n\t}\n\n\tserialize(value: Input, options?: BcsWriterOptions) {\n\t\tthis.validate(value);\n\t\treturn new SerializedBcs(this, this.#serialize(value, options));\n\t}\n\n\tparse(bytes: Uint8Array): T {\n\t\tconst reader = new BcsReader(bytes);\n\t\treturn this.read(reader);\n\t}\n\n\tfromHex(hex: string) {\n\t\treturn this.parse(fromHex(hex));\n\t}\n\n\tfromBase58(b64: string) {\n\t\treturn this.parse(fromBase58(b64));\n\t}\n\n\tfromBase64(b64: string) {\n\t\treturn this.parse(fromBase64(b64));\n\t}\n\n\ttransform<T2 = T, Input2 = Input, NewName extends string = Name>({\n\t\tname,\n\t\tinput,\n\t\toutput,\n\t\tvalidate,\n\t}: {\n\t\tinput?: (val: Input2) => Input;\n\t\toutput?: (value: T) => T2;\n\t} & BcsTypeOptions<T2, Input2, NewName>) {\n\t\treturn new BcsType<T2, Input2, NewName>({\n\t\t\tname: (name ?? this.name) as NewName,\n\t\t\tread: (reader) => (output ? output(this.read(reader)) : (this.read(reader) as never)),\n\t\t\twrite: (value, writer) => this.#write(input ? input(value) : (value as never), writer),\n\t\t\tserializedSize: (value) => this.serializedSize(input ? input(value) : (value as never)),\n\t\t\tserialize: (value, options) =>\n\t\t\t\tthis.#serialize(input ? input(value) : (value as never), options),\n\t\t\tvalidate: (value) => {\n\t\t\t\tvalidate?.(value);\n\t\t\t\tthis.validate(input ? input(value) : (value as never));\n\t\t\t},\n\t\t});\n\t}\n}\n\nconst SERIALIZED_BCS_BRAND = Symbol.for('@mysten/serialized-bcs') as never;\nexport function isSerializedBcs(obj: unknown): obj is SerializedBcs<unknown> {\n\treturn !!obj && typeof obj === 'object' && (obj as any)[SERIALIZED_BCS_BRAND] === true;\n}\n\nexport class SerializedBcs<T, Input = T> {\n\t#schema: BcsType<T, Input>;\n\t#bytes: Uint8Array<ArrayBuffer>;\n\n\t// Used to brand SerializedBcs so that they can be identified, even between multiple copies\n\t// of the @mysten/bcs package are installed\n\tget [SERIALIZED_BCS_BRAND]() {\n\t\treturn true;\n\t}\n\n\tconstructor(schema: BcsType<T, Input>, bytes: Uint8Array<ArrayBuffer>) {\n\t\tthis.#schema = schema;\n\t\tthis.#bytes = bytes;\n\t}\n\n\ttoBytes() {\n\t\treturn this.#bytes;\n\t}\n\n\ttoHex() {\n\t\treturn toHex(this.#bytes);\n\t}\n\n\ttoBase64() {\n\t\treturn toBase64(this.#bytes);\n\t}\n\n\ttoBase58() {\n\t\treturn toBase58(this.#bytes);\n\t}\n\n\tparse() {\n\t\treturn this.#schema.parse(this.#bytes);\n\t}\n}\n\nexport function fixedSizeBcsType<T, Input = T, const Name extends string = string>({\n\tsize,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\tread: (reader: BcsReader) => T;\n\twrite: (value: Input, writer: BcsWriter) => void;\n} & BcsTypeOptions<T, Input, Name>) {\n\treturn new BcsType<T, Input, Name>({\n\t\t...options,\n\t\tserializedSize: () => size,\n\t});\n}\n\nexport function uIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${8 | 16 | 32}`;\n\twriteMethod: `write${8 | 16 | 32}`;\n\tmaxValue: number;\n} & BcsTypeOptions<number, number, Name>) {\n\treturn fixedSizeBcsType<number, number, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](value),\n\t\tvalidate: (value) => {\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function bigUIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${64 | 128 | 256}`;\n\twriteMethod: `write${64 | 128 | 256}`;\n\tmaxValue: bigint;\n} & BcsTypeOptions<string, string | number | bigint>) {\n\treturn fixedSizeBcsType<string, string | number | bigint, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](BigInt(value)),\n\t\tvalidate: (val) => {\n\t\t\tconst value = BigInt(val);\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({\n\tserialize,\n\t...options\n}: {\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n} & BcsTypeOptions<T, Input>) {\n\tconst type = new BcsType<T, Input>({\n\t\t...options,\n\t\tserialize,\n\t\twrite: (value, writer) => {\n\t\t\tfor (const byte of type.serialize(value).toBytes()) {\n\t\t\t\twriter.write8(byte);\n\t\t\t}\n\t\t},\n\t});\n\n\treturn type;\n}\n\nexport function stringLikeBcsType<const Name extends string = string>({\n\ttoBytes,\n\tfromBytes,\n\t...options\n}: {\n\tname: Name;\n\ttoBytes: (value: string) => Uint8Array;\n\tfromBytes: (bytes: Uint8Array) => string;\n\tserializedSize?: (value: string) => number | null;\n} & BcsTypeOptions<string, string, Name>) {\n\treturn new BcsType<string, string, Name>({\n\t\t...options,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst bytes = reader.readBytes(length);\n\n\t\t\treturn fromBytes(bytes);\n\t\t},\n\t\twrite: (hex, writer) => {\n\t\t\tconst bytes = toBytes(hex);\n\t\t\twriter.writeULEB(bytes.length);\n\t\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\t\twriter.write8(bytes[i]);\n\t\t\t}\n\t\t},\n\t\tserialize: (value) => {\n\t\t\tconst bytes = toBytes(value);\n\t\t\tconst size = ulebEncode(bytes.length);\n\t\t\tconst result = new Uint8Array(size.length + bytes.length);\n\t\t\tresult.set(size, 0);\n\t\t\tresult.set(bytes, size.length);\n\n\t\t\treturn result;\n\t\t},\n\t\tvalidate: (value) => {\n\t\t\tif (typeof value !== 'string') {\n\t\t\t\tthrow new TypeError(`Invalid ${options.name} value: ${value}. Expected string`);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function lazyBcsType<T, Input>(cb: () => BcsType<T, Input>) {\n\tlet lazyType: BcsType<T, Input> | null = null;\n\tfunction getType() {\n\t\tif (!lazyType) {\n\t\t\tlazyType = cb();\n\t\t}\n\t\treturn lazyType;\n\t}\n\n\treturn new BcsType<T, Input>({\n\t\tname: 'lazy' as never,\n\t\tread: (data) => getType().read(data),\n\t\tserializedSize: (value) => getType().serializedSize(value),\n\t\twrite: (value, writer) => getType().write(value, writer),\n\t\tserialize: (value, options) => getType().serialize(value, options).toBytes(),\n\t});\n}\n\nexport interface BcsStructOptions<\n\tT extends Record<string, BcsType<any>>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsType<\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t},\n\tName\n> {\n\tconstructor({ name, fields, ...options }: BcsStructOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields);\n\n\t\tsuper({\n\t\t\tname,\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tconst size = type.serializedSize(values[field]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: Record<string, unknown> = {};\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tresult[field] = type.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\ttype.write(value[field], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsEnumOptions<\n\tT extends Record<string, BcsType<any> | null>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\tEnumOutputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t}>,\n\t\tEnumInputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t}>,\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string = string,\n> extends BcsType<\n\tEnumOutputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true;\n\t}>,\n\tEnumInputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t}>,\n\tName\n> {\n\tconstructor({ fields, ...options }: BcsEnumOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields as object);\n\t\tsuper({\n\t\t\tread: (reader) => {\n\t\t\t\tconst index = reader.readULEB();\n\n\t\t\t\tconst enumEntry = canonicalOrder[index];\n\t\t\t\tif (!enumEntry) {\n\t\t\t\t\tthrow new TypeError(`Unknown value ${index} for enum ${options.name}`);\n\t\t\t\t}\n\n\t\t\t\tconst [kind, type] = enumEntry;\n\n\t\t\t\treturn {\n\t\t\t\t\t[kind]: type?.read(reader) ?? true,\n\t\t\t\t\t$kind: kind,\n\t\t\t\t} as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst [name, val] = Object.entries(value).filter(([name]) =>\n\t\t\t\t\tObject.hasOwn(fields, name),\n\t\t\t\t)[0];\n\n\t\t\t\tfor (let i = 0; i < canonicalOrder.length; i++) {\n\t\t\t\t\tconst [optionName, optionType] = canonicalOrder[i];\n\t\t\t\t\tif (optionName === name) {\n\t\t\t\t\t\twriter.writeULEB(i);\n\t\t\t\t\t\toptionType?.write(val, writer);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\n\t\t\t\tconst keys = Object.keys(value).filter(\n\t\t\t\t\t(k) => value[k] !== undefined && Object.hasOwn(fields, k),\n\t\t\t\t);\n\n\t\t\t\tif (keys.length !== 1) {\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`Expected object with one key, but found ${keys.length} for type ${options.name}}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [variant] = keys;\n\n\t\t\t\tif (!Object.hasOwn(fields, variant)) {\n\t\t\t\t\tthrow new TypeError(`Invalid enum variant ${variant}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsTupleOptions<\n\tT extends readonly BcsType<any>[],\n\tName extends string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname?: Name;\n\tfields: T;\n}\n\nexport class BcsTuple<\n\tconst T extends readonly BcsType<any>[],\n\tconst Name extends string =\n\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n> extends BcsType<\n\t{\n\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t},\n\tName\n> {\n\tconstructor({ fields, name, ...options }: BcsTupleOptions<T, Name>) {\n\t\tsuper({\n\t\t\tname: name ?? (`(${fields.map((t) => t.name).join(', ')})` as never),\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tconst size = fields[i].serializedSize(values[i]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: unknown[] = [];\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tresult.push(field.read(reader));\n\t\t\t\t}\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tfields[i].write(value[i], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== fields.length) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${fields.length}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { BcsTypeOptions } from './bcs-type.js';\nimport {\n\tBcsEnum,\n\tBcsStruct,\n\tBcsTuple,\n\tBcsType,\n\tbigUIntBcsType,\n\tdynamicSizeBcsType,\n\tfixedSizeBcsType,\n\tlazyBcsType,\n\tstringLikeBcsType,\n\tuIntBcsType,\n} from './bcs-type.js';\nimport type {\n\tEnumInputShape,\n\tEnumOutputShape,\n\tInferBcsInput,\n\tInferBcsType,\n\tJoinString,\n} from './types.js';\nimport { ulebEncode } from './uleb.js';\n\nfunction fixedArray<T extends BcsType<any>, Name extends string = string>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction fixedArray<T, Input, Name extends string = string>(\n\tsize: number,\n\ttype: BcsType<T, Input>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, Name>,\n): BcsType<T[], Iterable<Input> & { length: number }, Name>;\nfunction fixedArray<T extends BcsType<any>, Name extends string = `${T['name']}[${number}]`>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst result: InferBcsType<T>[] = new Array(size);\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `${type.name}[${size}]`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t\tif (value.length !== size) {\n\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`>;\nfunction option<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n): BcsType<T | null, Input | null | undefined>;\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`> {\n\treturn bcs\n\t\t.enum(`Option<${type.name}>`, {\n\t\t\tNone: null,\n\t\t\tSome: type,\n\t\t})\n\t\t.transform({\n\t\t\tinput: (value: InferBcsInput<T> | null | undefined) => {\n\t\t\t\tif (value == null) {\n\t\t\t\t\treturn { None: true };\n\t\t\t\t}\n\n\t\t\t\treturn { Some: value };\n\t\t\t},\n\t\t\toutput: (value) => {\n\t\t\t\tif (value.$kind === 'Some') {\n\t\t\t\t\treturn value.Some as InferBcsType<T>;\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t});\n}\n\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction vector<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>,\n): BcsType<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>;\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result: InferBcsType<T>[] = new Array(length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\twriter.writeULEB(value.length);\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `vector<${type.name}>`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * Compares two byte arrays using lexicographic ordering.\n * This matches Rust's Ord implementation for Vec<u8>/[u8] which is used for BTreeMap key ordering.\n * Comparison is done byte-by-byte first, then by length if all compared bytes are equal.\n */\nexport function compareBcsBytes(a: Uint8Array, b: Uint8Array): number {\n\tfor (let i = 0; i < Math.min(a.length, b.length); i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn a[i] - b[i];\n\t\t}\n\t}\n\n\treturn a.length - b.length;\n}\n\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n>;\nfunction map<K, V, InputK = K, InputV = V>(\n\tkeyType: BcsType<K, InputK>,\n\tvalueType: BcsType<V, InputV>,\n): BcsType<Map<K, V>, Map<InputK, InputV>, `Map<${string}, ${string}>`>;\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n> {\n\treturn new BcsType({\n\t\tname: `Map<${keyType.name}, ${valueType.name}>`,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result = new Map<InferBcsType<K>, InferBcsType<V>>();\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult.set(keyType.read(reader), valueType.read(reader));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tconst entries = [...value.entries()].map(\n\t\t\t\t([key, val]) => [keyType.serialize(key).toBytes(), val] as const,\n\t\t\t);\n\t\t\tentries.sort(([a], [b]) => compareBcsBytes(a, b));\n\n\t\t\twriter.writeULEB(entries.length);\n\t\t\tfor (const [keyBytes, val] of entries) {\n\t\t\t\twriter.writeBytes(keyBytes);\n\t\t\t\tvalueType.write(val, writer);\n\t\t\t}\n\t\t},\n\t});\n}\n\nexport const bcs = {\n\t/**\n\t * Creates a BcsType that can be used to read and write an 8-bit unsigned integer.\n\t * @example\n\t * bcs.u8().serialize(255).toBytes() // Uint8Array [ 255 ]\n\t */\n\tu8(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read8',\n\t\t\twriteMethod: 'write8',\n\t\t\tsize: 1,\n\t\t\tmaxValue: 2 ** 8 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u8') as 'u8',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 16-bit unsigned integer.\n\t * @example\n\t * bcs.u16().serialize(65535).toBytes() // Uint8Array [ 255, 255 ]\n\t */\n\tu16(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read16',\n\t\t\twriteMethod: 'write16',\n\t\t\tsize: 2,\n\t\t\tmaxValue: 2 ** 16 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u16') as 'u16',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 32-bit unsigned integer.\n\t * @example\n\t * bcs.u32().serialize(4294967295).toBytes() // Uint8Array [ 255, 255, 255, 255 ]\n\t */\n\tu32(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read32',\n\t\t\twriteMethod: 'write32',\n\t\t\tsize: 4,\n\t\t\tmaxValue: 2 ** 32 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u32') as 'u32',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 64-bit unsigned integer.\n\t * @example\n\t * bcs.u64().serialize(1).toBytes() // Uint8Array [ 1, 0, 0, 0, 0, 0, 0, 0 ]\n\t */\n\tu64(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read64',\n\t\t\twriteMethod: 'write64',\n\t\t\tsize: 8,\n\t\t\tmaxValue: 2n ** 64n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u64') as 'u64',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 128-bit unsigned integer.\n\t * @example\n\t * bcs.u128().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu128(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read128',\n\t\t\twriteMethod: 'write128',\n\t\t\tsize: 16,\n\t\t\tmaxValue: 2n ** 128n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u128') as 'u128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 256-bit unsigned integer.\n\t * @example\n\t * bcs.u256().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu256(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read256',\n\t\t\twriteMethod: 'write256',\n\t\t\tsize: 32,\n\t\t\tmaxValue: 2n ** 256n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u256') as 'u256',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write boolean values.\n\t * @example\n\t * bcs.bool().serialize(true).toBytes() // Uint8Array [ 1 ]\n\t */\n\tbool(options?: BcsTypeOptions<boolean>) {\n\t\treturn fixedSizeBcsType({\n\t\t\tsize: 1,\n\t\t\tread: (reader) => reader.read8() === 1,\n\t\t\twrite: (value, writer) => writer.write8(value ? 1 : 0),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'bool') as 'bool',\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'boolean') {\n\t\t\t\t\tthrow new TypeError(`Expected boolean, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write unsigned LEB encoded integers\n\t * @example\n\t *\n\t */\n\tuleb128(options?: BcsTypeOptions<number>) {\n\t\treturn dynamicSizeBcsType({\n\t\t\tread: (reader) => reader.readULEB(),\n\t\t\tserialize: (value) => {\n\t\t\t\treturn Uint8Array.from(ulebEncode(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'uleb128') as 'uleb128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a fixed length byte array\n\t * @param size The number of bytes this types represents\n\t * @example\n\t * bcs.bytes(3).serialize(new Uint8Array([1, 2, 3])).toBytes() // Uint8Array [1, 2, 3]\n\t */\n\tbytes<T extends number>(size: T, options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn fixedSizeBcsType<Uint8Array, Iterable<number>, `bytes[${T}]`>({\n\t\t\tsize,\n\t\t\tread: (reader) => reader.readBytes(size),\n\t\t\twrite: (value, writer) => {\n\t\t\t\twriter.writeBytes(new Uint8Array(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? `bytes[${size}]`) as `bytes[${T}]`,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== size) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a variable length byte array\n\t *\n\t * @example\n\t * bcs.byteVector().serialize([1, 2, 3]).toBytes() // Uint8Array [3, 1, 2, 3]\n\t */\n\tbyteVector(options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn new BcsType<Uint8Array, Iterable<number>, 'vector<u8>'>({\n\t\t\tread: (reader) => {\n\t\t\t\tconst length = reader.readULEB();\n\n\t\t\t\treturn reader.readBytes(length);\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst array = new Uint8Array(value);\n\t\t\t\twriter.writeULEB(array.length);\n\t\t\t\twriter.writeBytes(array);\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'vector<u8>') as 'vector<u8>',\n\t\t\tserializedSize: (value) => {\n\t\t\t\tconst length = 'length' in value ? (value.length as number) : null;\n\t\t\t\treturn length == null ? null : ulebEncode(length).length + length;\n\t\t\t},\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can ser/de string values. Strings will be UTF-8 encoded\n\t * @example\n\t * bcs.string().serialize('a').toBytes() // Uint8Array [ 1, 97 ]\n\t */\n\tstring(options?: BcsTypeOptions<string>) {\n\t\treturn stringLikeBcsType({\n\t\t\ttoBytes: (value) => new TextEncoder().encode(value),\n\t\t\tfromBytes: (bytes) => new TextDecoder().decode(bytes),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'string') as 'string',\n\t\t});\n\t},\n\t/**\n\t * Creates a BcsType that represents a fixed length array of a given type\n\t * @param size The number of elements in the array\n\t * @param type The BcsType of each element in the array\n\t * @example\n\t * bcs.fixedArray(3, bcs.u8()).serialize([1, 2, 3]).toBytes() // Uint8Array [ 1, 2, 3 ]\n\t */\n\tfixedArray,\n\n\t/**\n\t * Creates a BcsType representing an optional value\n\t * @param type The BcsType of the optional value\n\t * @example\n\t * bcs.option(bcs.u8()).serialize(null).toBytes() // Uint8Array [ 0 ]\n\t * bcs.option(bcs.u8()).serialize(1).toBytes() // Uint8Array [ 1, 1 ]\n\t */\n\toption,\n\n\t/**\n\t * Creates a BcsType representing a variable length vector of a given type\n\t * @param type The BcsType of each element in the vector\n\t *\n\t * @example\n\t * bcs.vector(bcs.u8()).toBytes([1, 2, 3]) // Uint8Array [ 3, 1, 2, 3 ]\n\t */\n\tvector,\n\n\t/**\n\t * Creates a BcsType representing a tuple of a given set of types\n\t * @param types The BcsTypes for each element in the tuple\n\t *\n\t * @example\n\t * const tuple = bcs.tuple([bcs.u8(), bcs.string(), bcs.bool()])\n\t * tuple.serialize([1, 'a', true]).toBytes() // Uint8Array [ 1, 1, 97, 1 ]\n\t */\n\ttuple<\n\t\tconst T extends readonly BcsType<any, any>[],\n\t\tconst Name extends string =\n\t\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n\t>(\n\t\tfields: T,\n\t\toptions?: BcsTypeOptions<\n\t\t\t{\n\t\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t\t},\n\t\t\t{\n\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t\t},\n\t\t\tName\n\t\t>,\n\t) {\n\t\treturn new BcsTuple<T, Name>({\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a struct of a given set of fields\n\t * @param name The name of the struct\n\t * @param fields The fields of the struct. The order of the fields affects how data is serialized and deserialized\n\t *\n\t * @example\n\t * const struct = bcs.struct('MyStruct', {\n\t * a: bcs.u8(),\n\t * b: bcs.string(),\n\t * })\n\t * struct.serialize({ a: 1, b: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t */\n\tstruct<T extends Record<string, BcsType<any>>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t\t\t}\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsStruct<T>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing an enum of a given set of options\n\t * @param name The name of the enum\n\t * @param values The values of the enum. The order of the values affects how data is serialized and deserialized.\n\t * null can be used to represent a variant with no data.\n\t *\n\t * @example\n\t * const enum = bcs.enum('MyEnum', {\n\t * A: bcs.u8(),\n\t * B: bcs.string(),\n\t * C: null,\n\t * })\n\t * enum.serialize({ A: 1 }).toBytes() // Uint8Array [ 0, 1 ]\n\t * enum.serialize({ B: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t * enum.serialize({ C: true }).toBytes() // Uint8Array [ 2 ]\n\t */\n\tenum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\tEnumOutputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t\t\t}>,\n\t\t\t\tEnumInputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t\t\t}>,\n\t\t\t\tName\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsEnum<T, Name>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a map of a given key and value type\n\t * @param keyType The BcsType of the key\n\t * @param valueType The BcsType of the value\n\t * @example\n\t * const map = bcs.map(bcs.u8(), bcs.string())\n\t * map.serialize(new Map([[2, 'a']])).toBytes() // Uint8Array [ 1, 2, 1, 97 ]\n\t */\n\tmap,\n\n\t/**\n\t * Creates a BcsType that wraps another BcsType which is lazily evaluated. This is useful for creating recursive types.\n\t * @param cb A callback that returns the BcsType\n\t */\n\tlazy<T extends BcsType<any>>(cb: () => T): T {\n\t\treturn lazyBcsType(cb) as T;\n\t},\n};\n","/*\r\n * bignumber.js v9.1.2\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2022 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;\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","/**\n * BCS (Binary Canonical Serialization) Schemas for Lending Protocol\n *\n * This module defines the BCS schemas for serializing and deserializing\n * lending protocol data structures. BCS is used for efficient binary\n * encoding of complex data types for blockchain transactions and storage.\n */\n\nimport { bcs, fromHex, toHex } from '@mysten/bcs'\n\n/**\n * BCS schema for Sui addresses with hex transformation\n * Converts between hex string representation and byte arrays\n */\nexport const Address = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n})\n\n/**\n * BCS schema for incentive APY information\n * Contains asset ID, APY value, and supported coin types\n */\nexport const IncentiveAPYInfo = bcs.struct('IncentiveAPYInfo', {\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** Annual Percentage Yield as a 256-bit integer */\n apy: bcs.u256(),\n /** List of supported coin types for this incentive */\n coin_types: bcs.vector(bcs.string())\n})\n\n/**\n * BCS schema for incentive pool information\n * Contains comprehensive details about a lending incentive pool\n */\nexport const IncentivePoolInfo = bcs.struct('IncentivePoolInfo', {\n /** Unique pool identifier */\n pool_id: Address,\n /** Address holding the incentive funds */\n funds: Address,\n /** Current phase of the incentive program */\n phase: bcs.u64(),\n /** Timestamp when the incentive started */\n start_at: bcs.u64(),\n /** Timestamp when the incentive ends */\n end_at: bcs.u64(),\n /** Timestamp when the incentive was closed */\n closed_at: bcs.u64(),\n /** Total supply of incentive tokens */\n total_supply: bcs.u64(),\n /** Asset identifier for the incentive */\n asset_id: bcs.u8(),\n /** Option type for the incentive */\n option: bcs.u8(),\n /** Factor used in incentive calculations */\n factor: bcs.u256(),\n /** Amount of incentives already distributed */\n distributed: bcs.u64(),\n /** Amount of incentives currently available */\n available: bcs.u256(),\n /** Total amount of incentives */\n total: bcs.u256()\n})\n\n/**\n * BCS schema for incentive pool information grouped by phase\n * Contains phase number and list of pools in that phase\n */\nexport const IncentivePoolInfoByPhase = bcs.struct('IncentivePoolInfoByPhase', {\n /** Phase number */\n phase: bcs.u64(),\n /** List of incentive pools in this phase */\n pools: bcs.vector(IncentivePoolInfo)\n})\n\n/**\n * BCS schema for oracle price information\n * Contains price data from external price feeds\n */\nexport const OracleInfo = bcs.struct('OracleInfo', {\n /** Oracle identifier */\n oracle_id: bcs.u8(),\n /** Current price as a 256-bit integer */\n price: bcs.u256(),\n /** Number of decimal places for the price */\n decimals: bcs.u8(),\n /** Whether the oracle data is valid */\n valid: bcs.bool()\n})\n\n/**\n * BCS schema for flash loan asset configuration\n * Contains parameters for flash loan functionality\n */\nexport const FlashLoanAssetConfig = bcs.struct('FlashLoanAssetConfig', {\n /** Unique identifier for the flash loan asset */\n id: bcs.string(),\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** Coin type for the asset */\n coin_type: bcs.string(),\n /** Pool identifier for the flash loan */\n pool_id: bcs.string(),\n /** Rate paid to suppliers for flash loans */\n rate_to_supplier: bcs.u64(),\n /** Rate paid to treasury for flash loans */\n rate_to_treasury: bcs.u64(),\n /** Maximum flash loan amount */\n max: bcs.u64(),\n /** Minimum flash loan amount */\n min: bcs.u64()\n})\n\n/**\n * BCS schema for reserve data information\n * Contains comprehensive details about a lending reserve\n */\nexport const ReserveDataInfo = bcs.struct('ReserveDataInfo', {\n /** Reserve identifier */\n id: bcs.u8(),\n /** Oracle identifier for price feeds */\n oracle_id: bcs.u8(),\n /** Coin type for the reserve */\n coin_type: bcs.string(),\n /** Maximum supply capacity */\n supply_cap: bcs.u256(),\n /** Maximum borrow capacity */\n borrow_cap: bcs.u256(),\n /** Current supply interest rate */\n supply_rate: bcs.u256(),\n /** Current borrow interest rate */\n borrow_rate: bcs.u256(),\n /** Current supply index for interest calculation */\n supply_index: bcs.u256(),\n /** Current borrow index for interest calculation */\n borrow_index: bcs.u256(),\n /** Total amount supplied to the reserve */\n total_supply: bcs.u256(),\n /** Total amount borrowed from the reserve */\n total_borrow: bcs.u256(),\n /** Timestamp of last update */\n last_update_at: bcs.u64(),\n /** Loan-to-Value ratio for collateral */\n ltv: bcs.u256(),\n /** Treasury factor for fee calculations */\n treasury_factor: bcs.u256(),\n /** Current treasury balance */\n treasury_balance: bcs.u256(),\n /** Base interest rate */\n base_rate: bcs.u256(),\n /** Interest rate multiplier */\n multiplier: bcs.u256(),\n /** Jump rate multiplier for high utilization */\n jump_rate_multiplier: bcs.u256(),\n /** Reserve factor for protocol fees */\n reserve_factor: bcs.u256(),\n /** Optimal utilization rate */\n optimal_utilization: bcs.u256(),\n /** Liquidation ratio threshold */\n liquidation_ratio: bcs.u256(),\n /** Liquidation bonus for liquidators */\n liquidation_bonus: bcs.u256(),\n /** Liquidation threshold */\n liquidation_threshold: bcs.u256()\n})\n\n/**\n * BCS schema for user state information\n * Contains user's borrowing and supplying balances for an asset\n */\nexport const UserStateInfo = bcs.struct('UserStateInfo', {\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** User's current borrow balance */\n borrow_balance: bcs.u256(),\n /** User's current supply balance */\n supply_balance: bcs.u256()\n})\n","import packageJson from '../package.json'\n\nconst sdkVersion = packageJson.version\n\nconst getNodeInfo = (): string => {\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n try {\n const os = require('os')\n const nodeVersion: string = process.version\n const osType: string = os.type()\n const osArch: string = os.arch()\n\n const formattedNodeVersion: string = nodeVersion.startsWith('v')\n ? nodeVersion.substring(1)\n : nodeVersion\n\n return `Node.js ${formattedNodeVersion}; ${osType}/${osArch}`\n } catch (e) {\n return `Node.js ${process.version}; OS/Unknown (Error)`\n }\n }\n return 'Node/Unknown'\n}\n\nexport const getUserAgent = (): string => {\n let environmentInfo: string = ''\n\n const isNode = typeof process !== 'undefined' && process.versions && process.versions.node\n\n if (isNode) {\n environmentInfo = `lending/${sdkVersion} (${getNodeInfo()})`\n }\n\n return environmentInfo\n}\n\nexport const userAgent = getUserAgent()\n","/**\n * Lending Utilities\n *\n * This module provides utility functions for the lending protocol, including\n * caching mechanisms, data transformation, transaction parsing, and blockchain\n * interaction helpers.\n *\n * @module LendingUtils\n */\n\nimport type { CacheOption, EMode, EModeIdentity, EModePool, Pool, TransactionResult } from './types'\nimport type { DevInspectResults } from '@mysten/sui/client'\nimport { SuiClient, getFullnodeUrl } from '@mysten/sui/client'\nimport camelCase from 'lodash.camelcase'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { BcsType } from '@mysten/sui/bcs'\nimport { normalizeStructTag } from '@mysten/sui/utils'\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js'\nimport BigNumber from 'bignumber.js'\nimport { userAgent } from './ua'\n\n/**\n * Default Sui client instance configured for mainnet\n */\nexport const suiClient = new SuiClient({\n url: getFullnodeUrl('mainnet')\n})\n\n/**\n * Generates a cache key from function arguments\n *\n * This function creates a unique key for caching by serializing the arguments\n * and removing cache-specific options that shouldn't affect the cache key.\n *\n * @param args - Function arguments to generate key from\n * @returns JSON string representing the arguments\n */\nfunction argsKey(args: any[]) {\n const serializergs = [] as any[]\n args.forEach((option: any, index) => {\n const isLast = index === args.length - 1\n if (typeof option === 'object' && option !== null && isLast) {\n const { client, disableCache, cacheTime, ...rest } = option\n serializergs.push(rest)\n } else {\n serializergs.push(option)\n }\n })\n return JSON.stringify(serializergs)\n}\n\n/**\n * Wraps a function with singleton behavior to prevent duplicate concurrent calls\n *\n * This decorator ensures that if the same function is called with the same arguments\n * while a previous call is still pending, it returns the existing promise instead\n * of making a new call.\n *\n * @param fn - Function to wrap with singleton behavior\n * @returns Wrapped function with singleton behavior\n */\nexport function withSingleton<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n const promiseMap: Record<string, Promise<any> | null> = {}\n\n return ((...args: any[]) => {\n const key = argsKey(args)\n if (promiseMap[key]) {\n return promiseMap[key]\n }\n promiseMap[key] = fn(...args).finally(() => {\n delete promiseMap[key]\n })\n return promiseMap[key]\n }) as T\n}\n\n/**\n * Wraps a function with caching behavior\n *\n * This decorator caches function results based on arguments and cache options.\n * It respects cache time settings and can be disabled per call.\n *\n * @param fn - Function to wrap with caching behavior\n * @returns Wrapped function with caching behavior\n */\nexport function withCache<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n let cache: Record<\n string,\n {\n data: undefined\n cacheAt: number\n }\n > = {}\n\n return ((...args: any[]) => {\n const options = args[args.length - 1] as Partial<CacheOption>\n const key = argsKey(args)\n const cacheData = cache[key]\n\n // Check if cache is valid and not disabled\n if (!options?.disableCache && typeof cacheData?.data !== 'undefined') {\n if (\n typeof options?.cacheTime === 'undefined' ||\n options.cacheTime > Date.now() - cacheData.cacheAt\n ) {\n return cacheData.data\n }\n }\n\n // Execute function and cache result\n return fn(...args).then((result) => {\n cache[key] = {\n data: result,\n cacheAt: Date.now()\n }\n return result\n })\n }) as T\n}\n\n/**\n * Converts object keys from snake_case to camelCase recursively\n *\n * This function transforms all keys in an object (including nested objects and arrays)\n * from snake_case format to camelCase format.\n *\n * @param obj - Object to transform\n * @returns Object with camelCase keys\n */\nexport function camelize<T extends Record<string, any>>(obj: T): T {\n if (Array.isArray(obj)) {\n return obj.map((v) => camelize(v)) as unknown as T\n } else if (obj != null && typeof obj === 'object') {\n return Object.keys(obj).reduce(\n (result, key) => ({\n ...result,\n [camelCase(key)]: camelize(obj[key])\n }),\n {} as T\n )\n }\n return obj\n}\n\n/**\n * Parses a value for use in transaction building\n *\n * This function converts various value types into the appropriate format\n * for transaction building, handling both primitive types and existing\n * transaction results.\n *\n * @param value - Value to parse (string, number, boolean, or object)\n * @param format - Format function to apply to the value\n * @returns Transaction result in the appropriate format\n */\nexport function parseTxValue(\n value: string | number | boolean | object,\n format: any\n): TransactionResult {\n if (typeof value === 'object') {\n return value as TransactionResult\n }\n return format(value) as TransactionResult\n}\n\n/**\n * Parses a pool value for use in transaction building\n *\n * This function handles different pool representations and converts them\n * to the appropriate transaction object format.\n *\n * @param tx - Transaction object to build\n * @param value - Pool value (string, Pool object, or TransactionResult)\n * @returns Transaction result representing the pool\n */\nexport function parseTxPoolValue(tx: Transaction, value: string | Pool | TransactionResult) {\n if (typeof value === 'string') {\n return tx.object(value)\n }\n if (typeof value === 'object' && (value as TransactionResult).$kind) {\n return value as TransactionResult\n }\n return tx.object((value as Pool).contract.pool)\n}\n\n/**\n * Parses the result of a devInspectTransactionBlock call\n *\n * This function extracts and parses return values from transaction inspection\n * results using BCS (Binary Canonical Serialization) types.\n *\n * @param data - DevInspectResults from transaction inspection\n * @param parseTypes - Array of BCS types to parse the return values\n * @param options - Optional configuration including error handling\n * @returns Parsed result data\n */\nexport function parseDevInspectResult<T>(\n data: DevInspectResults,\n parseTypes: BcsType<any>[],\n options?: {\n throwError?: boolean\n }\n): T {\n if (data.results && data.results.length > 0) {\n if (data.results[0].returnValues && data.results[0].returnValues.length > 0) {\n return data.results[0].returnValues.map((item, index) => {\n const parseType = parseTypes[index] || parseTypes[0]\n return parseType.parse(Uint8Array.from(item[0]))\n }) as T\n }\n } else if (data.error) {\n console.log(`Get an error, msg: ${data.error}`)\n if (options?.throwError) {\n throw new Error(data.error)\n }\n return [] as T\n }\n return [] as T\n}\n\n/**\n * Normalizes a coin type string using Sui's struct tag normalization\n *\n * @param coinType - Coin type string to normalize\n * @returns Normalized coin type string\n */\nexport function normalizeCoinType(coinType: string) {\n return normalizeStructTag(coinType)\n}\n\n/**\n * Processes health factor values from contract format to human-readable format\n *\n * This function converts the raw health factor value from the contract\n * (which is typically a large integer) to a more readable decimal format.\n *\n * @param hf - Raw health factor value from contract\n * @returns Processed health factor value\n */\nexport function processContractHealthFactor(hf: number) {\n const healthFactor = (hf || 0) / Math.pow(10, 27)\n if (healthFactor > Math.pow(10, 5)) {\n return Infinity\n }\n return healthFactor\n}\n\n/**\n * Pyth price service connection for oracle price feeds\n *\n * This connection is used to fetch real-time price data from the Pyth network\n * for various assets in the lending protocol.\n */\nexport const suiPythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 20000\n})\n\nexport const Rate_Decimals = 27\n\nexport const rayMathMulIndex = (amount: string | number, index: string | number) => {\n if (!Number(amount) || !Number(index)) return new BigNumber(0)\n const ray = new BigNumber(1).shiftedBy(1 * Rate_Decimals)\n const halfRay = ray.multipliedBy(new BigNumber(0.5))\n return new BigNumber(amount)\n .multipliedBy(new BigNumber(index))\n .plus(halfRay)\n .dividedBy(ray)\n .integerValue(BigNumber.ROUND_DOWN)\n}\n\nexport const requestHeaders = !!userAgent\n ? {\n 'User-Agent': userAgent\n }\n : ({} as HeadersInit)\n\nexport function getPoolsMap(pools: Pool[], key: 'uniqueId' | 'id' = 'uniqueId') {\n return pools.reduce(\n (acc, pool) => {\n acc[pool[key]] = pool\n return acc\n },\n {} as Record<string, Pool>\n )\n}\n\nexport function getEmodesMap(emodes: EMode[], key: 'uniqueId' | 'emodeId' = 'uniqueId') {\n return emodes.reduce(\n (acc, emode) => {\n acc[emode[key]] = emode\n return acc\n },\n {} as Record<string, EMode>\n )\n}\n\nexport function poolToEModePool(pool: Pool, emodeIdentity: EModeIdentity): EModePool {\n const emode = pool.emodes.find((emode) => emode.emodeId === emodeIdentity.emodeId)\n if (!emode) {\n throw new Error('EMode not found in pool')\n }\n const emodeAsset = emode.assets.find((asset) => asset.assetId === pool.id)!\n return {\n ...pool,\n emode: {\n ...emodeAsset,\n emodeId: emode.emodeId\n },\n isEMode: true\n }\n}\n\nexport function parsePoolUID(uid: string) {\n const [marketKey, poolId] = uid.split('-')\n if (!marketKey || !poolId) {\n return null\n }\n return {\n marketKey: marketKey,\n poolId: parseInt(poolId)\n }\n}\n\nexport function uuid() {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)\n}\n","/**\n * Lending Pool Operations\n *\n * This module provides comprehensive pool management functionality for the lending protocol.\n * It handles pool information retrieval, deposit/withdraw operations, borrow/repay operations,\n * and various pool-related utilities and statistics.\n *\n * @module LendingPool\n */\n\nimport { DEFAULT_CACHE_TIME, getConfig } from './config'\nimport type {\n EnvOption,\n CacheOption,\n Pool,\n AssetIdentifier,\n PoolStats,\n FeeDetail,\n CoinObject,\n TransactionResult,\n AccountCapOption,\n BorrowFeeOption,\n SuiClientOption,\n MarketOption,\n EMode,\n MarketsOption\n} from './types'\nimport {\n normalizeCoinType,\n withCache,\n withSingleton,\n parseTxValue,\n suiClient,\n requestHeaders,\n parsePoolUID\n} from './utils'\nimport { Transaction } from '@mysten/sui/transactions'\nimport BigNumber from 'bignumber.js'\nimport { parseDevInspectResult } from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\n\n/**\n * Enumeration of pool operations\n *\n * This enum defines the different types of operations that can be performed\n * on lending pools, used for health factor calculations and operation tracking.\n */\nexport enum PoolOperator {\n /** Supply/deposit operation */\n Supply = 1,\n /** Withdraw operation */\n Withdraw = 2,\n /** Borrow operation */\n Borrow = 3,\n /** Repay operation */\n Repay = 4\n}\n\n/**\n * Fetches all available lending pools\n *\n * This function retrieves the complete list of lending pools from the Navi protocol API.\n * It's wrapped with caching and singleton behavior for efficient data access.\n *\n * @param options - Optional environment and caching options\n * @returns Promise<Pool[]> - Array of all available lending pools\n */\nexport const getPools = withCache(\n withSingleton(\n async (options?: Partial<EnvOption & CacheOption & MarketsOption>): Promise<Pool[]> => {\n const markets = (options?.markets || [MARKETS.main]).map((identity) => {\n return getMarketConfig(identity)\n })\n const url = `https://open-api.naviprotocol.io/api/navi/pools?env=${options?.env || 'prod'}&sdk=${packageJson.version}&market=${markets.map(\n (market) => {\n return market.key\n }\n )}`\n const res: {\n data: Pool[]\n meta: {\n emodes: EMode[]\n }\n } = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n\n res.data.forEach((pool) => {\n const filterEmodes = res.meta.emodes.filter((emode) => {\n const market = getMarketConfig(emode.marketId)\n return pool.market === market.key && emode.isActive\n })\n const emodes = filterEmodes.filter((emode) => {\n return !!emode.assets.find((asset) => asset.assetId === pool.id)\n })\n pool.emodes = emodes\n const poolSupplyAmount = BigNumber(pool.totalSupplyAmount)\n .div(Math.pow(10, 9))\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowAmount = BigNumber(pool.borrowedAmount)\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyValue = BigNumber(poolSupplyAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowValue = BigNumber(poolBorrowAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolSupplyCapAmount = BigNumber(pool.supplyCapCeiling)\n .shiftedBy(-27)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowCapAmount = BigNumber.max(\n BigNumber(pool.borrowedAmount),\n BigNumber(pool.validBorrowAmount)\n )\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyCapValue = BigNumber(poolSupplyCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowCapValue = BigNumber(poolBorrowCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n pool.poolSupplyAmount = poolSupplyAmount\n pool.poolBorrowAmount = poolBorrowAmount\n pool.poolSupplyValue = poolSupplyValue\n pool.poolBorrowValue = poolBorrowValue\n pool.poolSupplyCapAmount = poolSupplyCapAmount\n pool.poolBorrowCapAmount = poolBorrowCapAmount\n pool.poolSupplyCapValue = poolSupplyCapValue\n pool.poolBorrowCapValue = poolBorrowCapValue\n })\n return res.data\n }\n )\n)\n\n/**\n * Gets information for a specific lending pool\n *\n * This function retrieves pool information based on various identifier types:\n * - Pool object (returns directly)\n * - String (coin type - normalized for comparison)\n * - Number (pool ID)\n *\n * @param identifier - Asset identifier (string, Pool object, or number)\n * @param options - Optional environment options\n * @returns Promise<Pool> - Pool information\n * @throws Error if pool is not found\n */\nexport async function getPool(\n identifier: AssetIdentifier,\n options?: Partial<EnvOption & MarketOption>\n): Promise<Pool> {\n let market = options?.market\n if (typeof identifier === 'string') {\n const parsedUID = parsePoolUID(identifier)\n if (parsedUID) {\n market = parsedUID.marketKey\n identifier = parsedUID.poolId\n }\n }\n const pools = await getPools({\n ...options,\n markets: [market || DEFAULT_MARKET_IDENTITY],\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // If identifier is already a pool object, return it directly\n if (typeof identifier === 'object') {\n return identifier\n }\n\n // Find pool by identifier\n const pool = pools.find((p) => {\n if (typeof identifier === 'string') {\n return normalizeCoinType(p.suiCoinType) === normalizeCoinType(identifier)\n }\n if (typeof identifier === 'number') {\n return p.id === identifier\n }\n return false\n })\n\n if (!pool) {\n throw new Error(`Pool not found`)\n }\n\n if (pool.isDeprecated) {\n console.log(`The lending pool for coinType ${pool.suiCoinType} is going to be deprecated.`)\n }\n return pool\n}\n\n/**\n * Fetches protocol statistics\n *\n * This function retrieves overall protocol statistics including TVL,\n * total borrow amounts, and other key metrics.\n *\n * @param options - Optional caching options\n * @returns Promise<PoolStats> - Protocol statistics\n */\nexport const getStats = withCache(\n withSingleton(async (options?: Partial<CacheOption>): Promise<PoolStats> => {\n const url = `https://open-api.naviprotocol.io/api/navi/stats?sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n })\n)\n\n/**\n * Fetches protocol fee information\n *\n * This function retrieves detailed fee information including:\n * - Total fee value\n * - V3 borrow fees\n * - Borrow interest fees\n * - Flash loan and liquidation fees\n *\n * @param options - Optional caching options\n * @returns Promise with detailed fee breakdown\n */\nexport const getFees = withCache(\n withSingleton(\n async (\n options?: Partial<CacheOption>\n ): Promise<{\n totalValue: number\n v3BorrowFee: {\n totalValue: number\n details: FeeDetail[]\n }\n borrowInterestFee: {\n totalValue: number\n details: FeeDetail[]\n }\n flashloanAndLiquidationFee: {\n totalValue: number\n details: FeeDetail[]\n }\n }> => {\n const url = `https://open-api.naviprotocol.io/api/navi/fee?sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res\n }\n )\n)\n\n/**\n * Builds a deposit transaction for a lending pool\n *\n * This function creates a transaction block for depositing coins into a lending pool.\n * It handles both regular deposits and deposits with account capabilities,\n * and includes special handling for SUI gas coins.\n *\n * @param tx - Transaction object to build\n * @param identifier - Asset identifier for the pool\n * @param coinObject - Coin object to deposit\n * @param options - Optional parameters including environment, account capability, and amount\n * @returns Promise<Transaction> - Transaction with deposit operation\n */\nexport async function depositCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n const isGasCoin = typeof coinObject === 'object' && coinObject.$kind === 'GasCoin'\n\n // Handle SUI gas coin deposits\n if (normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') && isGasCoin) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n // Determine deposit amount\n let depositAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n depositAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n depositAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // Build deposit transaction based on account capability\n if (options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::incentive_v3::deposit_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n depositAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // refresh stake for sui pool to balance the stake after deposit\n if (config.version === 2 && pool.id === 0 && (!options?.env || options?.env === 'prod')) {\n tx.moveCall({\n target: `${config.package}::pool::refresh_stake`,\n arguments: [tx.object(pool.contract.pool), tx.object('0x05')]\n })\n }\n\n return tx\n}\n\n/**\n * Builds a withdraw transaction for a lending pool\n *\n * Constructs and adds withdrawal operations to a transaction object.\n * This function supports standard withdrawal and withdrawal using account capability.\n *\n * @param tx - The transaction builder to append operations to\n * @param identifier - Asset identifier for the pool\n * @param amount - Amount to withdraw\n * @param options - Optional parameters including environment and account capability\n * @returns Transaction result representing the withdrawn coins\n */\nexport async function withdrawCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n const withdrawAmount = parseTxValue(amount, tx.pure.u64)\n\n let withdrawBalance\n\n if (config.version === 1) {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n } else {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n }\n\n const withdrawCoin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [withdrawBalance],\n typeArguments: [pool.suiCoinType]\n })\n\n return withdrawCoin\n}\n\nexport async function borrowCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n const borrowAmount = parseTxValue(amount, tx.pure.u64)\n\n let borrowBalance\n\n if (config.version === 1) {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n } else {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n }\n\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [tx.object(borrowBalance)],\n typeArguments: [pool.suiCoinType]\n })\n\n return coin\n}\n\n/**\n * Builds a repay transaction for a lending pool debt\n *\n * Constructs and adds repayment operations to an existing transaction object.\n * This function handles loan repayments, supporting both standard user\n * repayments and privileged operations via account capabilities.\n *\n *\n * @param tx - The transaction builder to append repayment operations to\n * @param identifier - Unique identifier for the lending pool asset (e.g., \"USDC\", \"SUI\")\n * @param coinObject - The coin object to use for repayment, or GasCoin for SUI payments\n * @param options - Configuration options for the repayment\n * - `amount` - Specific amount to repay (required for SUI gas coin, otherwise uses value of specified coinObject)\n * - `accountCap` - Optional account capability object for privileged repayments\n * - `env` - Environment configuration\n * - `cacheTime` - Cache duration for configuration data\n *\n * @returns Promise<Transaction | TransactionResult> - The modified transaction object with repayment operations added\n *\n * @throws {Error} When amount is not provided for SUI gas coin repayments\n * @throws Will throw if pool doesn't exist or repayment validation fails\n */\nexport async function repayCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction | TransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n const isGasCoin = typeof coinObject === 'object' && coinObject.$kind === 'GasCoin'\n\n if (normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') && isGasCoin) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n let repayAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n repayAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n repayAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::repay_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [ret],\n typeArguments: [pool.suiCoinType]\n })\n return coin\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n repayAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n return tx\n }\n}\n\n/**\n * Fetches the current borrow fee rate\n *\n * This function can retrieve borrow fee rates in two ways:\n * - If `address` and `asset` are provided, it calculates the specific borrow fee rate\n * for a given address and asset by calling the on-chain `get_borrow_fee_v2` function\n * - Otherwise, it returns the global borrow fee rate from the incentive V3 contract\n *\n * @param options - Optional configuration options\n * - `address` - User address to calculate specific borrow fee (requires `asset` to be set)\n * - `asset` - Asset identifier to calculate specific borrow fee (requires `address` to be set)\n * - `env` - Environment setting ('dev' or 'prod')\n * - `client` - Sui client instance for on-chain queries\n * - `cacheTime` - Cache expiration time in milliseconds\n * - `disableCache` - Whether to disable caching for this operation\n * @returns Promise<number> - Borrow fee rate as a decimal number\n * - When `address` and `asset` are provided: returns the specific fee rate (divided by 10000)\n * - Otherwise: returns the global fee rate (divided by 100)\n */\nexport const getBorrowFee = withCache(\n withSingleton(\n async (\n options?: Partial<EnvOption & CacheOption & BorrowFeeOption & SuiClientOption & MarketOption>\n ): Promise<number> => {\n const config = await getConfig({\n ...options\n })\n if (options?.address && typeof options?.asset !== 'undefined') {\n try {\n const pool = await getPool(options.asset, options)\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n tx.moveCall({\n target: `${config.package}::incentive_v3::get_borrow_fee_v2`,\n arguments: [\n tx.object(config.incentiveV3),\n tx.pure.address(options.address),\n tx.pure.u8(pool.id),\n tx.pure.u64(10000)\n ],\n typeArguments: []\n })\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: options.address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u64()])\n return (Number(res[0]) || 0) / 100\n } catch (error) {\n console.error(error)\n }\n }\n const rawData: any = await suiClient.getObject({\n id: config.incentiveV3,\n options: { showType: true, showOwner: true, showContent: true }\n })\n const borrowFee = rawData.data.content.fields.borrow_fee_rate\n return Number(borrowFee) / 100\n }\n )\n)\n","import { withCache, withSingleton, getPoolsMap, getEmodesMap } from './utils'\nimport type {\n MarketIdentity,\n EnvOption,\n CacheOption,\n EMode,\n MarketConfig,\n Pool,\n EModePool\n} from './types'\nimport { getPools } from './pool'\nimport BigNumber from 'bignumber.js'\n\nexport const DEFAULT_MARKET_IDENTITY = 'main'\n\nexport const MARKETS = {\n main: {\n id: 0,\n key: 'main',\n name: 'Main Market'\n }\n}\n\nexport class Market {\n private poolMap = {} as Record<string, Pool>\n private emodeMap = {} as Record<string, EMode>\n readonly config: MarketConfig\n readonly pools: Pool[] = []\n readonly emodes: EMode[] = []\n readonly emodePools: EModePool[] = []\n emodeBorrowablePools: Pool[] = []\n emodeSupplyablePools: Pool[] = []\n\n private _overview = {\n marketTotalSupplyValue: '0',\n marketTotalBorrowValue: '0'\n }\n\n get overview() {\n return this._overview\n }\n\n constructor(marketIdentity: MarketIdentity, pools: Pool[]) {\n this.config = getMarketConfig(marketIdentity)\n this.initPools(pools)\n }\n\n private initPools(pools: Pool[]) {\n const poolsMap = getPoolsMap(this.pools)\n const emodesMap = getEmodesMap(this.emodes)\n const emodeBorrowablePoolIds = new Set<string>()\n const emodeSupplyablePoolIds = new Set<string>()\n let marketTotalSupplyValue = BigNumber(0)\n let marketTotalBorrowValue = BigNumber(0)\n\n pools.forEach((pool) => {\n const isMatch = this.checkMarket(pool.market)\n if (!isMatch) {\n console.warn(`Pool is not in market ${this.config.name}`, pool)\n return\n }\n if (!poolsMap[pool.uniqueId]) {\n this.pools.push(pool)\n }\n pool?.emodes?.forEach((emode) => {\n if (!emodesMap[emode.uniqueId]) {\n this.emodes.push(emode)\n }\n emode.assets.forEach((asset) => {\n if (asset.isDebt) {\n const debtAsset = emode.assets.find(\n (a) => a.isCollateral && a.ltv > 0 && a.assetId !== pool.id\n )\n if (debtAsset) {\n emodeBorrowablePoolIds.add(pool.uniqueId)\n }\n }\n if (asset.isCollateral) {\n const supplyAsset = emode.assets.find((a) => a.isDebt && a.assetId !== pool.id)\n if (supplyAsset) {\n emodeSupplyablePoolIds.add(pool.uniqueId)\n }\n }\n })\n })\n marketTotalBorrowValue = marketTotalBorrowValue.plus(pool.poolBorrowValue)\n marketTotalSupplyValue = marketTotalSupplyValue.plus(pool.poolSupplyValue)\n })\n this.poolMap = getPoolsMap(this.pools, 'id')\n this.emodeMap = getEmodesMap(this.emodes, 'emodeId')\n this.emodes.forEach((emode) => {\n const emodePools = this.getEModePools(emode.emodeId)\n this.emodePools.push(...emodePools)\n })\n this._overview = {\n marketTotalSupplyValue: marketTotalSupplyValue.toString(),\n marketTotalBorrowValue: marketTotalBorrowValue.toString()\n }\n this.emodeBorrowablePools = this.pools.filter((pool) => {\n return emodeBorrowablePoolIds.has(pool.uniqueId)\n })\n this.emodeSupplyablePools = this.pools.filter((pool) => {\n return emodeSupplyablePoolIds.has(pool.uniqueId)\n })\n }\n\n public getEMode(emodeId: number): EMode | null {\n const emode = this.emodeMap[emodeId]\n return emode || null\n }\n\n public getEModeRelatePools(\n pool: Pool,\n options?: {\n collateral?: boolean\n debt?: boolean\n emodeId?: number\n }\n ): Pool[] {\n const { collateral, debt, emodeId } = options || {}\n const relatePools = [] as Pool[]\n pool.emodes.forEach((emode) => {\n if (typeof emodeId === 'number' && emodeId !== emode.emodeId) {\n return\n }\n emode.assets.forEach((asset) => {\n if (\n typeof collateral === 'boolean' &&\n collateral &&\n asset.isCollateral &&\n asset.assetId === pool.id\n ) {\n relatePools.push(this.poolMap[asset.assetId])\n }\n if (typeof debt === 'boolean' && debt && asset.isDebt && asset.assetId === pool.id) {\n relatePools.push(this.poolMap[asset.assetId])\n }\n })\n })\n return relatePools\n }\n\n public getEModePools(emodeId: number): EModePool[] {\n const emode = this.getEMode(emodeId)\n if (!emode) {\n return []\n }\n const pools = emode.assets\n .map((asset) => asset.assetId)\n .map((id) => {\n return this.poolMap[id]\n })\n .filter((pool) => !!pool)\n return pools.map((pool) => {\n const asset = emode.assets.find((asset) => asset.assetId === pool.id)!\n return {\n ...pool,\n emode: {\n ...asset,\n emodeId: emode.emodeId\n },\n isEMode: true\n }\n })\n }\n\n private checkMarket(marketIdentity: MarketIdentity) {\n let isMatch = false\n if (typeof marketIdentity === 'number' && marketIdentity === this.config.id) {\n isMatch = true\n }\n if (typeof marketIdentity === 'string' && marketIdentity === this.config.key) {\n isMatch = true\n }\n if (typeof marketIdentity === 'object' && marketIdentity.id === this.config.id) {\n isMatch = true\n }\n return isMatch\n }\n}\n\nexport const getMarketConfig = (marketIdentity: MarketIdentity) => {\n const configs = Object.values(MARKETS)\n const config = configs.find((marketConfig) => {\n if (typeof marketIdentity === 'number') {\n return marketConfig.id === marketIdentity\n }\n if (typeof marketIdentity === 'string') {\n return marketConfig.key === marketIdentity\n }\n return marketConfig.id === marketIdentity.id\n })\n if (!config) {\n throw new Error(`Market not found`)\n }\n return config\n}\n\nexport const getMarkets = withCache(\n withSingleton(\n async (\n markets: MarketIdentity[],\n options?: Partial<EnvOption & CacheOption>\n ): Promise<Market[]> => {\n const pools = await getPools({\n cacheTime: 1000 * 60,\n ...options,\n markets\n })\n return markets.map((market) => {\n const marketConfig = getMarketConfig(market)\n const marketPools = pools.filter((pool) => {\n return pool.market === marketConfig.key\n })\n return new Market(market, marketPools)\n })\n }\n )\n)\n\nexport const getMarket = withCache(\n withSingleton(\n async (market: MarketIdentity, options?: Partial<EnvOption & CacheOption>): Promise<Market> => {\n const markets = await getMarkets([market], options)\n return markets[0]\n }\n )\n)\n","/**\n * Lending Configuration Management\n *\n * This module provides configuration management for the lending protocol.\n * It handles fetching configuration from the Navi protocol API and provides\n * caching mechanisms for efficient configuration retrieval.\n *\n * @module LendingConfig\n */\n\nimport type { LendingConfig, EnvOption, CacheOption, MarketOption } from './types'\nimport { withCache, withSingleton, requestHeaders } from './utils'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig } from './market'\n\n/**\n * Fetches lending protocol configuration from the API\n *\n * This function retrieves the current configuration for the lending protocol\n * from the Navi protocol API. It's wrapped with both caching and singleton\n * behavior to ensure efficient and consistent configuration access.\n *\n * The configuration includes:\n * - Contract addresses for all protocol components\n * - Oracle configuration and price feed information\n * - Pool and incentive contract addresses\n * - Environment-specific settings\n *\n * @param options - Optional environment and caching options\n * @returns Promise<LendingConfig> - Complete lending protocol configuration\n */\nexport const getConfig = withCache(\n withSingleton(\n async (options?: Partial<EnvOption & CacheOption & MarketOption>): Promise<LendingConfig> => {\n const market = getMarketConfig(options?.market || DEFAULT_MARKET_IDENTITY)\n const url = `https://open-api.naviprotocol.io/api/navi/config?env=${options?.env || 'prod'}&sdk=${packageJson.version}&market=${market.key}`\n\n // Fetch configuration from API\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n )\n)\n\n/**\n * Default cache time for configuration data\n *\n * Configuration is cached for 5 minutes to reduce API calls\n * while ensuring reasonably fresh configuration data.\n */\nexport const DEFAULT_CACHE_TIME = 1000 * 60 * 5\n","import {\n CacheOption,\n EnvOption,\n EModeCap,\n AccountCapOption,\n MarketOption,\n TransactionResult,\n SuiClientOption,\n EModeIdentity\n} from './types'\nimport { withSingleton, withCache, parseTxValue, suiClient } from './utils'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig } from './market'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { createAccountCapPTB, getAccountCapOwnerPTB } from './account-cap'\nimport { bcs } from '@mysten/sui/bcs'\n\nexport async function enterEModePTB(\n tx: Transaction,\n emodeId: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (!options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::lending::enter_emode`,\n arguments: [tx.object(config.storage), parseTxValue(emodeId, tx.pure.u64)]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::lending::enter_emode_with_account_cap`,\n arguments: [\n tx.object(config.storage),\n parseTxValue(emodeId, tx.pure.u64),\n parseTxValue(options.accountCap, tx.object)\n ]\n })\n }\n\n return tx\n}\n\nexport async function exitEModePTB(\n tx: Transaction,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (!options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::lending::exit_emode`,\n arguments: [tx.object(config.storage)]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::lending::exit_emode_with_account_cap`,\n arguments: [tx.object(config.storage), parseTxValue(options.accountCap, tx.object)]\n })\n }\n return tx\n}\n\nexport async function createEModeCapPTB(\n tx: Transaction,\n emodeId: number | TransactionResult,\n options?: Partial<EnvOption & MarketOption>\n) {\n const config = await getConfig({\n cacheTime: DEFAULT_CACHE_TIME,\n ...options\n })\n const accountCap = await createAccountCapPTB(tx, options)\n await enterEModePTB(tx, emodeId, {\n ...options,\n accountCap: accountCap\n })\n const market = await getMarketConfig(options?.market || DEFAULT_MARKET_IDENTITY)\n const accountCapOwner = await getAccountCapOwnerPTB(tx, accountCap, options)\n tx.moveCall({\n target: `${config.emode.contract.registryPackage}::registry::register_emode_for_account_cap`,\n arguments: [\n tx.object(config.emode.contract.registryObject),\n accountCapOwner,\n parseTxValue(market.id, tx.pure.u64),\n parseTxValue(emodeId, tx.pure.u64)\n ]\n })\n return accountCap\n}\n\nexport const getUserEModeCaps = withCache(\n withSingleton(\n async (\n address: string,\n options?: Partial<SuiClientOption & EnvOption & CacheOption>\n ): Promise<EModeCap[]> => {\n const config = await getConfig({\n cacheTime: DEFAULT_CACHE_TIME,\n ...options\n })\n const tx = new Transaction()\n const client = options?.client ?? suiClient\n\n tx.moveCall({\n target: `${config.emode.contract.registryPackage}::registry::find_user_emode_account_caps`,\n arguments: [tx.object(config.emode.contract.registryObject), tx.pure.address(address!)]\n })\n\n const result: any = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const values = result.results[0].returnValues\n\n const marketIds = bcs.vector(bcs.u64()).parse(Uint8Array.from(values[0][0]))\n const emodeIds = bcs.vector(bcs.u64()).parse(Uint8Array.from(values[1][0]))\n const accountCaps = bcs.vector(bcs.Address).parse(Uint8Array.from(values[2][0]))\n\n return marketIds.map((marketId, index) => ({\n marketId: Number(marketId),\n emodeId: Number(emodeIds[index]),\n accountCap: accountCaps[index].toString()\n }))\n }\n )\n)\n\nexport function emodeIdentityId(identifier: EModeIdentity) {\n const market = getMarketConfig(identifier.marketId)\n return `${market.key}-${identifier.emodeId}`\n}\n","/**\n * Lending Account Management\n *\n * This module provides comprehensive account management functionality for the lending protocol.\n * It includes coin merging, health factor calculations, user state management, and various\n * lending operations like supply, borrow, withdraw, and repay.\n *\n * @module LendingAccount\n */\n\nimport type {\n UserLendingInfo,\n SuiClientOption,\n EnvOption,\n Pool,\n Transaction as NAVITransaction,\n AssetIdentifier,\n TransactionResult,\n CacheOption,\n AccountCap,\n MarketOption,\n LendingPosition,\n MarketsOption,\n EModePool,\n EModeCap\n} from './types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { UserStateInfo } from './bcs'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport {\n suiClient,\n camelize,\n parseDevInspectResult,\n withSingleton,\n processContractHealthFactor,\n parseTxValue,\n parseTxPoolValue,\n withCache,\n normalizeCoinType,\n rayMathMulIndex,\n requestHeaders,\n poolToEModePool,\n getPoolsMap,\n uuid\n} from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport { CoinStruct, PaginatedCoins } from '@mysten/sui/client'\nimport { getPool, PoolOperator, getPools } from './pool'\nimport packageJson from '../package.json'\nimport { getUserEModeCaps } from './emode'\nimport BigNumber from 'bignumber.js'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\n\n/**\n * Merges multiple coins into a single coin for transaction building\n *\n * This function takes multiple coin objects and merges them into a single coin\n * that can be used in a transaction. It supports optional splitting to create\n * a specific balance amount.\n *\n * @param tx - Transaction object to add merge operations to\n * @param coins - Array of coin objects to merge\n * @param options - Optional parameters for balance splitting and gas coin usage\n * - `balance` - If provided, splits this amount from the resulting coin object\n * - `useGasCoin` - If true, uses the gas coin for the operation\n * @returns Transaction result representing the merged coin\n */\nexport function mergeCoinsPTB(\n tx: Transaction,\n coins: ({\n balance: string | number | bigint\n coinObjectId: string\n coinType: string\n } & CoinStruct)[],\n options?: {\n balance?: number\n useGasCoin?: boolean\n }\n) {\n const needSplit = typeof options?.balance === 'number'\n const splitBalance = needSplit ? options.balance! : 0\n let mergedBalance = 0\n const mergeList: string[] = []\n let coinType = ''\n\n // Sort coins by balance (highest first) and collect valid coins\n coins\n .sort((a, b) => Number(b.balance) - Number(a.balance))\n .forEach((coin) => {\n if (needSplit && mergedBalance >= splitBalance) {\n return\n }\n if (Number(coin.balance) === 0) {\n return\n }\n if (!coinType) {\n coinType = coin.coinType\n }\n if (coinType !== coin.coinType) {\n throw new Error('All coins must be of the same type')\n }\n mergedBalance += Number(coin.balance)\n mergeList.push(coin.coinObjectId)\n })\n\n if (mergeList.length === 0) {\n throw new Error('No coins to merge')\n }\n if (needSplit && mergedBalance < splitBalance) {\n throw new Error(\n `Balance is less than the specified balance: ${mergedBalance} < ${splitBalance}`\n )\n }\n\n // Handle SUI gas coin specially\n if (normalizeCoinType(coinType) === normalizeCoinType('0x2::sui::SUI') && options?.useGasCoin) {\n return needSplit ? tx.splitCoins(tx.gas, [tx.pure.u64(splitBalance)]) : tx.gas\n }\n\n // Merge coins and optionally split\n\n mergeList.length === 1 ? tx.object(mergeList[0]) : tx.mergeCoins(mergeList[0], mergeList.slice(1))\n\n return needSplit ? tx.splitCoins(mergeList[0], [tx.pure.u64(splitBalance)]) : mergeList[0]\n}\n\n/**\n * Calculates dynamic health factor for a user after potential operations\n *\n * This function creates a transaction call to calculate the health factor\n * that would result after performing supply/borrow operations.\n *\n * @param tx - Transaction object to append calculation to\n * @param address - User address or transaction result\n * @param identifier - Asset identifier\n * @param estimatedSupply - Estimated supply amount\n * @param estimatedBorrow - Estimated borrow amount\n * @param isIncrease - Whether this is an increase operation\n * @param options - Environment options\n * @returns Transaction result for health factor calculation\n */\nexport async function getSimulatedHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n identifier: AssetIdentifier,\n estimatedSupply: number | TransactionResult,\n estimatedBorrow: number | TransactionResult,\n isIncrease: boolean | TransactionResult,\n options?: Partial<EnvOption & MarketOption>\n): Promise<TransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n return tx.moveCall({\n target: `${config.uiGetter}::calculator_unchecked::dynamic_health_factor`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(config.oracle.priceOracle),\n parseTxPoolValue(tx, pool),\n parseTxValue(address, tx.pure.address),\n parseTxValue(pool.id, tx.pure.u8),\n parseTxValue(estimatedSupply, tx.pure.u64),\n parseTxValue(estimatedBorrow, tx.pure.u64),\n parseTxValue(isIncrease, tx.pure.bool)\n ],\n typeArguments: [pool.suiCoinType]\n })\n}\n\n/**\n * Gets the current health factor for a user\n *\n * @param tx - The transaction object to add health factor query operation to\n * @param address - User address or account cap or transaction result\n * @param options - Environment options\n * @returns Transaction result for health factor calculation\n */\nexport async function getHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n options?: Partial<EnvOption>\n): Promise<TransactionResult> {\n return getSimulatedHealthFactorPTB(tx, address, 0, 0, 0, false, options)\n}\n\nasync function getLendingStateBatch(\n address: string,\n tasks: {\n address: string\n market: string\n emodeId?: number\n }[],\n options?: Partial<\n SuiClientOption &\n EnvOption &\n CacheOption & {\n includeZeroBalanceEmodePositions?: boolean\n }\n >\n): Promise<UserLendingInfo[]> {\n const tx = new Transaction()\n const client = options?.client ?? suiClient\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS)\n })\n const poolsMap = getPoolsMap(pools)\n\n for (let task of tasks) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market: task.market\n })\n tx.moveCall({\n target: `${config.uiGetter}::getter_unchecked::get_user_state`,\n arguments: [tx.object(config.storage), tx.pure.address(task.address)]\n })\n }\n\n const resp = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const stateList = (resp.results || []).map((result) => {\n return (\n result.returnValues?.map((item) => {\n return bcs.vector(UserStateInfo as any).parse(Uint8Array.from(item[0]))\n })[0] || []\n )\n }) as {\n supply_balance: string\n borrow_balance: string\n asset_id: number\n }[][]\n\n const result = [] as UserLendingInfo[]\n\n stateList.forEach((states, index) => {\n const task = tasks[index]\n const market = getMarketConfig(task.market)\n states.forEach((state) => {\n if (state.supply_balance === '0' && state.borrow_balance === '0') {\n if (task.emodeId === undefined) {\n return\n }\n if (!options?.includeZeroBalanceEmodePositions) {\n return\n }\n }\n const pool = poolsMap[`${market.key}-${state.asset_id}`]\n if (!pool) {\n return\n }\n const supplyBalance = rayMathMulIndex(\n state.supply_balance,\n pool!.currentSupplyIndex\n ).toString()\n const borrowBalance = rayMathMulIndex(\n state.borrow_balance,\n pool!.currentBorrowIndex\n ).toString()\n result.push({\n supplyBalance,\n borrowBalance,\n assetId: state.asset_id,\n market: market.key,\n pool,\n emodeId: task.emodeId\n })\n })\n })\n\n return result\n}\n\n/**\n * Retrieves the current lending state for a user\n *\n * This function fetches all active lending positions for a user, including\n * supply and borrow balances for different assets.\n *\n * @param address - User wallet address or account cap\n * @param options - Options for client, environment, and caching\n * @returns Promise<UserLendingInfo[]> - Array of user lending positions\n */\nexport const getLendingState = withCache(\n async (\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption & CacheOption & MarketsOption>\n ): Promise<UserLendingInfo[]> => {\n const markets = (options?.markets || Object.keys(MARKETS)).map((item) => {\n return getMarketConfig(item)\n })\n\n const tasks = markets.map((market) => {\n return {\n address,\n market: market.key\n }\n })\n\n return await getLendingStateBatch(address, tasks, options)\n }\n)\n\n/**\n * Calculates the current health factor for a user\n *\n * @param address - User wallet address or account cap\n * @param options - Options for client and environment\n * @returns Promise<number> - Health factor value\n */\nexport async function getHealthFactor(\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<number> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n await getHealthFactorPTB(tx, address, options)\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u256()])\n return processContractHealthFactor(Number(res[0]) || 0)\n}\n\n/**\n * Calculates the health factor after performing lending operations\n *\n * This function simulates the health factor that would result after\n * performing a series of supply, withdraw, borrow, or repay operations.\n *\n * @param address - User wallet address or account cap\n * @param identifier - Asset identifier\n * @param operations - Array of operations to simulate\n * @param options - Options for client and environment\n * @returns Promise<number> - Projected health factor\n */\nexport async function getSimulatedHealthFactor(\n address: string | AccountCap,\n identifier: AssetIdentifier,\n operations: {\n type: PoolOperator\n amount: number\n }[],\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<number> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n let estimatedSupply = 0\n let estimatedBorrow = 0\n const pool = await getPool(identifier, options)\n\n // Calculate estimated changes from operations\n operations.forEach((operation) => {\n if (operation.type === PoolOperator.Supply) {\n estimatedSupply += operation.amount\n } else if (operation.type === PoolOperator.Withdraw) {\n estimatedSupply -= operation.amount\n } else if (operation.type === PoolOperator.Borrow) {\n estimatedBorrow += operation.amount\n } else if (operation.type === PoolOperator.Repay) {\n estimatedBorrow -= operation.amount\n }\n })\n\n // Validate operation consistency\n if (estimatedSupply * estimatedBorrow < 0) {\n throw new Error('Invalid operations')\n }\n\n // Determine if this is an increase operation\n const isIncrease = estimatedSupply > 0 || estimatedBorrow > 0\n\n // Calculate the dynamic health factor\n await getSimulatedHealthFactorPTB(\n tx,\n address,\n pool,\n Math.abs(estimatedSupply),\n Math.abs(estimatedBorrow),\n isIncrease,\n options\n )\n\n // Execute dry run to get the result\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u256()])\n return processContractHealthFactor(Number(res[0]) || 0)\n}\n\n/**\n * Retrieves transaction history for a user from the Navi protocol API\n *\n * This function fetches the transaction history for a specific user address\n * from the Navi protocol's open API. It supports pagination through cursor-based navigation.\n *\n * @param address - User wallet address or account cap\n * @param options - Optional parameters including cursor for pagination\n * @returns Promise with transaction data and optional cursor for next page\n */\nexport const getTransactions = withSingleton(\n async (\n address: string | AccountCap,\n options?: {\n cursor?: string\n }\n ): Promise<{\n data: NAVITransaction[]\n cursor?: string\n }> => {\n // Build query parameters for the API request\n const params = new URLSearchParams()\n if (options?.cursor) {\n params.set('cursor', options.cursor)\n }\n params.set('userAddress', address)\n\n // Fetch transaction history from Navi protocol API\n const url = `https://open-api.naviprotocol.io/api/navi/user/transactions?${params.toString()}&sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n)\n\n/**\n * Retrieves all coins owned by a user address\n *\n * This function fetches all coin objects owned by a specific address from the Sui blockchain.\n * It supports filtering by coin type and handles pagination automatically to retrieve all coins.\n *\n * @param address - User wallet address\n * @param options - Optional parameters including coin type filter and client options\n * - `coinType` - If specified, retrieves only coins of this type\n * - `client` - If provided, uses this `SuiClient` instance instead of the default client\n * @returns Promise<CoinStruct[]> - Array of coin objects owned by the address\n */\nexport async function getCoins(\n address: string,\n options?: Partial<\n {\n coinType?: string\n } & SuiClientOption\n >\n): Promise<CoinStruct[]> {\n let cursor: string | undefined | null = null\n const allCoinDatas: CoinStruct[] = []\n const client = options?.client ?? suiClient\n\n // Fetch all coins using pagination\n do {\n let res: PaginatedCoins\n\n // Use specific coin type filter if provided, otherwise get all coins\n if (options?.coinType) {\n res = await client.getCoins({\n owner: address,\n coinType: options?.coinType,\n cursor,\n limit: 100\n })\n } else {\n res = await client.getAllCoins({\n owner: address,\n cursor,\n limit: 100\n })\n }\n\n // Break if no more data\n if (!res.data || !res.data.length) {\n break\n }\n\n // Collect coin data and continue with next page\n allCoinDatas.push(...res.data)\n cursor = res.nextCursor\n } while (cursor)\n\n return allCoinDatas\n}\n\nexport const getLendingPositions = withCache(\n async (\n address: string,\n options?: Partial<\n SuiClientOption &\n EnvOption &\n CacheOption &\n MarketsOption & {\n includeZeroBalanceEmodePositions?: boolean\n }\n >\n ): Promise<LendingPosition[]> => {\n const positions: LendingPosition[] = []\n const markets = (options?.markets || Object.keys(MARKETS)).map((item) => {\n return getMarketConfig(item)\n })\n\n let emodeCaps: EModeCap[] = []\n\n try {\n emodeCaps = await getUserEModeCaps(address, options)\n } catch (e) {\n console.error(e)\n }\n\n const tasks = markets\n .map((market) => {\n return {\n address,\n market: market.key\n }\n })\n .concat(\n emodeCaps\n .filter((cap) => {\n return !!markets.find((market) => market.id === cap.marketId)\n })\n .map((emodeCap) => {\n return {\n address: emodeCap.accountCap,\n market: getMarketConfig(emodeCap.marketId).key,\n emodeId: emodeCap.emodeId\n }\n })\n )\n\n const lendingStates = await getLendingStateBatch(address, tasks, options)\n\n lendingStates.forEach((lendingState) => {\n const emodeCap =\n typeof lendingState.emodeId === 'number'\n ? emodeCaps.find((cap) => {\n const market = getMarketConfig(lendingState.market)\n return cap.emodeId === lendingState.emodeId && cap.marketId === market.id\n })\n : undefined\n if (emodeCap) {\n const inEmode = lendingState.pool.emodes.find((emode) => emode.emodeId === emodeCap.emodeId)\n if (!inEmode) {\n return\n }\n if (BigNumber(lendingState.supplyBalance).gte(0)) {\n const supplyAmount = BigNumber(lendingState.supplyBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n\n const emodePool = poolToEModePool(lendingState.pool, emodeCap)\n\n if (supplyAmount.gt(0) || emodePool.emode.isCollateral) {\n try {\n positions.push({\n id: `${lendingState.pool.uniqueId}_${emodeCap.emodeId}_navi-lending-emode-supply-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: supplyAmount.toString(),\n pool: poolToEModePool(lendingState.pool, emodeCap),\n token: lendingState.pool.token,\n valueUSD: supplyAmount.multipliedBy(lendingState.pool.oracle.price).toString(),\n emodeCap: emodeCap\n }\n })\n } catch (e) {\n console.error(e)\n }\n }\n }\n if (BigNumber(lendingState.borrowBalance).gte(0)) {\n const borrowAmount = BigNumber(lendingState.borrowBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n\n const emodePool = poolToEModePool(lendingState.pool, emodeCap)\n\n if (borrowAmount.gt(0) || emodePool.emode.isDebt) {\n try {\n positions.push({\n id: `${lendingState.pool.uniqueId}_${emodeCap.emodeId}_navi-lending-emode-borrow-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: borrowAmount.toString(),\n pool: poolToEModePool(lendingState.pool, emodeCap),\n token: lendingState.pool.token,\n valueUSD: borrowAmount.multipliedBy(lendingState.pool.oracle.price).toString(),\n emodeCap: emodeCap\n }\n })\n } catch (e) {\n console.error(e)\n }\n }\n }\n } else {\n if (BigNumber(lendingState.supplyBalance).gt(0)) {\n const supplyAmount = BigNumber(lendingState.supplyBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n positions.push({\n id: `${lendingState.pool.uniqueId}_navi-lending-supply-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n type: 'navi-lending-supply',\n market: lendingState.market,\n 'navi-lending-supply': {\n amount: supplyAmount.toString(),\n pool: lendingState.pool,\n token: lendingState.pool.token,\n valueUSD: supplyAmount.multipliedBy(lendingState.pool.oracle.price).toString()\n }\n })\n }\n if (BigNumber(lendingState.borrowBalance).gt(0)) {\n const borrowAmount = BigNumber(lendingState.borrowBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n positions.push({\n id: `${lendingState.pool.uniqueId}_navi-lending-borrow-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: borrowAmount.toString(),\n pool: lendingState.pool,\n token: lendingState.pool.token,\n valueUSD: borrowAmount.multipliedBy(lendingState.pool.oracle.price).toString()\n }\n })\n }\n }\n })\n return positions\n }\n)\n\nexport class UserPositions {\n private _positions: LendingPosition[] = []\n private _overview = {\n hf: Infinity,\n netVaule: '0',\n netWorthApr: '0',\n totalSupplyValue: '0',\n totalBorrowValue: '0',\n totalsupplyApy: '0',\n totalBorrowApy: '0',\n maxLiquidationValue: '0',\n maxLoanToVaule: '0',\n supply: {} as Record<string, string>,\n borrow: {} as Record<string, string>\n }\n\n get positions() {\n return this._positions\n }\n\n get overview() {\n return this._overview\n }\n\n set positions(positions: LendingPosition[]) {\n this._positions = positions\n this._overview = this.getPositionsOverview(positions)\n }\n\n constructor(positions: LendingPosition[]) {\n this.positions = positions\n }\n\n public filterPositionsByPool(pool: Pool | EModePool) {\n const isEmode = !!(pool as EModePool).isEMode\n const types = isEmode\n ? ['navi-lending-emode-supply', 'navi-lending-emode-borrow']\n : ['navi-lending-supply', 'navi-lending-borrow']\n return new UserPositions(\n this.positions.filter((position) => {\n const positionData = position[position.type]!\n return types.includes(position.type) && positionData.pool.uniqueId === pool.uniqueId\n })\n )\n }\n\n public deposit(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-supply',\n 'navi-lending-supply': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public withdraw(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-supply',\n 'navi-lending-supply': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public borrow(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public repay(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n getPositionsOverview(positions: LendingPosition[]) {\n const supply = {} as Record<string, string>\n const borrow = {} as Record<string, string>\n let totalSupplyValue = new BigNumber(0)\n let totalBorrowValue = new BigNumber(0)\n let totalsupplyApy = new BigNumber(0)\n let totalBorrowApy = new BigNumber(0)\n let maxLiquidationValue = new BigNumber(0)\n let maxLoanToVaule = new BigNumber(0)\n positions.forEach((position) => {\n if (position.type === 'navi-lending-supply') {\n const data = position['navi-lending-supply']!\n totalSupplyValue = totalSupplyValue.plus(data.valueUSD)\n maxLiquidationValue = maxLiquidationValue.plus(\n new BigNumber(data.valueUSD).multipliedBy(data.pool.liquidationFactor.threshold)\n )\n maxLoanToVaule = maxLoanToVaule.plus(\n new BigNumber(data.valueUSD).multipliedBy(data.pool.ltvValue)\n )\n } else if (position.type === 'navi-lending-borrow') {\n totalBorrowValue = totalBorrowValue.plus(position['navi-lending-borrow']!.valueUSD)\n } else if (position.type === 'navi-lending-emode-supply') {\n const data = position['navi-lending-emode-supply']!\n totalSupplyValue = totalSupplyValue.plus(data.valueUSD)\n const poolEmodeConfig = data.pool.emode\n maxLiquidationValue = maxLiquidationValue.plus(\n new BigNumber(data.valueUSD).multipliedBy(poolEmodeConfig.lt)\n )\n maxLoanToVaule = maxLoanToVaule.plus(\n new BigNumber(data.valueUSD).multipliedBy(poolEmodeConfig.ltv)\n )\n } else if (position.type === 'navi-lending-emode-borrow') {\n totalBorrowValue = totalBorrowValue.plus(position['navi-lending-emode-borrow']!.valueUSD)\n }\n })\n\n totalBorrowValue = BigNumber.max(totalBorrowValue, 0)\n totalSupplyValue = BigNumber.max(totalSupplyValue, 0)\n maxLiquidationValue = BigNumber.max(maxLiquidationValue, 0)\n maxLoanToVaule = BigNumber.max(maxLoanToVaule, 0)\n\n positions.forEach((position) => {\n if (position.type === 'navi-lending-supply') {\n const data = position['navi-lending-supply']!\n const apy = data.pool.supplyIncentiveApyInfo.apy\n if (totalSupplyValue.gt(0)) {\n totalsupplyApy = totalsupplyApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalSupplyValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n supply[data.pool.suiCoinType] = BigNumber(supply[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-borrow') {\n const data = position['navi-lending-borrow']!\n const apy = data.pool.borrowIncentiveApyInfo.apy\n if (totalBorrowValue.gt(0)) {\n totalBorrowApy = totalBorrowApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalBorrowValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n borrow[data.pool.suiCoinType] = BigNumber(borrow[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-emode-supply') {\n const data = position['navi-lending-emode-supply']!\n const apy = data.pool.supplyIncentiveApyInfo.apy\n if (totalSupplyValue.gt(0)) {\n totalsupplyApy = totalsupplyApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalSupplyValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n supply[data.pool.suiCoinType] = BigNumber(supply[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-emode-borrow') {\n const data = position['navi-lending-emode-borrow']!\n const apy = data.pool.borrowIncentiveApyInfo.apy\n if (totalBorrowValue.gt(0)) {\n totalBorrowApy = totalBorrowApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalBorrowValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n borrow[data.pool.suiCoinType] = BigNumber(borrow[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n }\n })\n\n const netVaule = totalSupplyValue.minus(totalBorrowValue)\n const netWorthApr = totalSupplyValue.minus(totalBorrowValue).eq(0)\n ? new BigNumber(0)\n : totalSupplyValue\n .multipliedBy(totalsupplyApy)\n .minus(totalBorrowValue.multipliedBy(totalBorrowApy))\n .div(totalSupplyValue.minus(totalBorrowValue))\n const hf =\n totalBorrowValue.toNumber() !== 0\n ? maxLiquidationValue.dividedBy(totalBorrowValue).toNumber()\n : Infinity\n\n return {\n hf,\n netVaule: netVaule.toString(),\n netWorthApr: netWorthApr.toString(),\n totalSupplyValue: totalSupplyValue.toString(),\n totalBorrowValue: totalBorrowValue.toString(),\n totalsupplyApy: totalsupplyApy.toString(),\n totalBorrowApy: totalBorrowApy.toString(),\n maxLiquidationValue: maxLiquidationValue.toString(),\n maxLoanToVaule: maxLoanToVaule.toString(),\n supply,\n borrow\n }\n }\n}\n\nexport async function verifyHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n hf: number,\n options?: Partial<EnvOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (config.limter) {\n tx.moveCall({\n target: `${config.limter}::navi_adaptor::verify_navi_position_healthy`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(config.priceOracle),\n parseTxValue(address, tx.pure.address),\n tx.pure.u256(new BigNumber(hf).shiftedBy(27).toNumber())\n ]\n })\n }\n}\n","/**\n * Oracle Price Feed Management for Lending Protocol\n *\n * This module provides oracle price feed functionality for the lending protocol.\n * It integrates with Pyth Network for real-time price data and manages price updates\n * for various assets used in lending operations.\n */\n\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport type {\n OraclePriceFeed,\n EnvOption,\n UserLendingInfo,\n Pool,\n SuiClientOption,\n MarketOption,\n LendingPosition\n} from './types'\nimport { SuiPriceServiceConnection, SuiPythClient } from '@pythnetwork/pyth-sui-js'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { suiClient } from './utils'\nimport { getPools } from './pool'\nimport { getLendingPositions } from './account'\n\ntype PythInfo = {\n priceFeedId: string\n priceInfoObject: string\n expiration?: number\n}\n\nexport type PythPriceInfo = {\n priceFeedId: string\n priceInfoObject: string\n price: string\n conf: string\n publishTime: number\n expiration?: number\n}\n\n/**\n * Pyth Network connection for price feed data\n * Connects to the Hermes endpoint for real-time price updates\n */\nconst suiPythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 10000\n})\n\n/**\n * Get stale price feed IDs from Pyth Network\n *\n * Identifies price feeds that have not been updated recently (more than 30 seconds old).\n * This helps ensure that only fresh price data is used for lending operations.\n *\n * @param priceIds - Array of Pyth price feed IDs to check\n * @returns Array of stale price feed IDs that need updating\n * @throws Error if failed to fetch price feed data\n */\nexport async function getPythStalePriceFeedId(priceIds: string[]): Promise<string[]> {\n try {\n const returnData: string[] = []\n const latestPriceFeeds = await suiPythConnection.getLatestPriceFeeds(priceIds)\n if (!latestPriceFeeds) return returnData\n\n const currentTimestamp = Math.floor(new Date().valueOf() / 1000)\n for (const priceFeed of latestPriceFeeds) {\n const uncheckedPrice = priceFeed.getPriceUnchecked()\n if (uncheckedPrice.publishTime > currentTimestamp) {\n console.warn(\n `pyth price feed is invalid, id: ${priceFeed.id}, publish time: ${uncheckedPrice.publishTime}, current timestamp: ${currentTimestamp}`\n )\n continue\n }\n\n // From pyth state is 60, but setting it to 30 makes more sense.\n if (currentTimestamp - priceFeed.getPriceUnchecked().publishTime > 30) {\n console.info(\n `stale price feed, id: ${priceFeed.id}, publish time: ${uncheckedPrice.publishTime}, current timestamp: ${currentTimestamp}`\n )\n returnData.push(priceFeed.id)\n }\n }\n return returnData\n } catch (error) {\n throw new Error(`failed to get pyth stale price feed id, msg: ${(error as Error).message}`)\n }\n}\n\nasync function getOnChainPriceInfo(\n pythInfos: PythInfo[],\n options?: Partial<SuiClientOption>\n): Promise<PythPriceInfo[] | undefined> {\n try {\n const priceInfos: PythPriceInfo[] = []\n const client = options?.client ?? suiClient\n\n const priceInfoObjectIds = pythInfos.map((k) => k.priceInfoObject)\n const priceInfoObjects = await client.multiGetObjects({\n ids: Array.from(new Set(priceInfoObjectIds)),\n options: { showContent: true }\n })\n for (const obj of priceInfoObjects) {\n const data = obj.data\n if (!data || !data.content || data.content.dataType !== 'moveObject') {\n console.warn(`fetched object ${data?.objectId} datatype should be moveObject`)\n continue\n }\n\n const pythInfo = pythInfos.find((v) => v.priceInfoObject == data.objectId)\n if (!pythInfo) {\n console.warn(`unable to find pyth info from array, priceInfoObject: ${data.objectId}`)\n continue\n }\n\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n const objectFields = data.content.fields.price_info.fields.price_feed.fields.price.fields\n const { magnitude, negative } = objectFields.price.fields\n const conf = objectFields.conf\n const timestamp = objectFields.timestamp\n\n priceInfos.push({\n priceFeedId: pythInfo.priceFeedId,\n priceInfoObject: pythInfo.priceInfoObject,\n price: negative ? '-' + magnitude : magnitude,\n conf,\n publishTime: Number(timestamp),\n expiration: pythInfo.expiration\n })\n }\n return priceInfos\n } catch (err) {\n console.error(err, `Polling Sui on-chain price for ${pythInfos} failed.`)\n return undefined\n }\n}\n\nexport async function getPythStalePriceFeedIdV2(\n pythInfos: PythInfo[],\n options?: Partial<SuiClientOption>\n): Promise<string[]> {\n try {\n const returnData: string[] = []\n const latestPriceFeeds = await getOnChainPriceInfo(pythInfos, options)\n if (!latestPriceFeeds) return returnData\n\n const currentTimestamp = Math.floor(new Date().valueOf() / 1000)\n\n for (const priceFeed of latestPriceFeeds) {\n if (priceFeed.publishTime > currentTimestamp) {\n console.warn(\n `pyth price feed is invalid, id: ${priceFeed.priceFeedId}, publish time: ${priceFeed.publishTime}, current timestamp: ${currentTimestamp}`\n )\n continue\n }\n\n const maxTime = priceFeed.expiration || 60\n // 3s is the margin of error for the price feed.\n if (currentTimestamp - priceFeed.publishTime > maxTime) {\n console.info(\n `stale price feed, id: ${priceFeed.priceFeedId}, publish time: ${priceFeed.publishTime}, current timestamp: ${currentTimestamp}`\n )\n returnData.push(priceFeed.priceFeedId)\n }\n }\n return returnData\n } catch (error) {\n throw new Error(`failed to get pyth stale price feed id, msg: ${(error as Error).message}`)\n }\n}\n\n/**\n * Update Pyth price feeds in a transaction\n *\n * Fetches the latest price update data from Pyth Network and adds the update\n * operations to the transaction block.\n *\n * @param tx - The transaction block to add price feed updates to\n * @param priceFeedIds - Array of Pyth price feed IDs to update\n * @param options - Optional client and environment configuration\n * @returns Promise that resolves when price feeds are updated\n * @throws Error if failed to update price feeds\n */\nexport async function updatePythPriceFeeds(\n tx: Transaction,\n priceFeedIds: string[],\n options?: Partial<SuiClientOption & EnvOption & MarketOption>\n) {\n const client = options?.client ?? suiClient\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n try {\n const priceUpdateData = await suiPythConnection.getPriceFeedsUpdateData(priceFeedIds)\n const suiPythClient = new SuiPythClient(\n client as any,\n config.oracle.pythStateId,\n config.oracle.wormholeStateId\n )\n\n return await suiPythClient.updatePriceFeeds(tx as any, priceUpdateData, priceFeedIds)\n } catch (error) {\n throw new Error(`failed to update pyth price feeds, msg: ${(error as Error).message}`)\n }\n}\n\n/**\n * Update oracle prices in the PTB (Programmable Transaction Block)\n *\n * This function updates price feeds for the lending protocol. It can optionally\n * update Pyth price feeds first if they are stale, then updates individual\n * price feeds in the oracle contract.\n *\n * @param tx - The transaction block to add price update operations to\n * @param priceFeeds - Array of oracle price feeds to update\n * @param options - Optional configuration including whether to update Pyth feeds\n * @returns The updated transaction block\n */\nexport async function updateOraclePricesPTB(\n tx: Transaction,\n priceFeeds: OraclePriceFeed[],\n options?: Partial<\n EnvOption &\n SuiClientOption &\n MarketOption & {\n updatePythPriceFeeds?: boolean\n }\n >\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // Optionally update Pyth price feeds if they are stale\n if (options?.updatePythPriceFeeds) {\n const pythInfos = priceFeeds\n .filter((feed) => !!feed.pythPriceFeedId && !!feed.pythPriceInfoObject)\n .map((feed) => ({\n priceFeedId: feed.pythPriceFeedId,\n priceInfoObject: feed.pythPriceInfoObject,\n expiration: 30\n }))\n\n try {\n const stalePriceFeedIds = await getPythStalePriceFeedIdV2(pythInfos, options)\n if (stalePriceFeedIds.length > 0) {\n await updatePythPriceFeeds(tx, stalePriceFeedIds, options)\n }\n } catch (e) {\n console.error(`Failed to update Pyth price feeds`)\n }\n }\n\n // Update individual price feeds in the oracle contract\n for (const priceFeed of priceFeeds) {\n if (options?.env === 'dev') {\n tx.moveCall({\n target: `${config.oracle.packageId}::oracle_pro::update_single_price`,\n arguments: [\n tx.object('0x6'), // Clock object\n tx.object(config.oracle.oracleConfig), // Oracle configuration\n tx.object(config.oracle.priceOracle), // Price oracle contract\n tx.object(config.oracle.supraOracleHolder), // Supra oracle holder\n tx.object(priceFeed.pythPriceInfoObject), // Pyth price info object\n tx.pure.address(priceFeed.feedId) // Price feed ID\n ]\n })\n } else {\n tx.moveCall({\n target: `${config.oracle.packageId}::oracle_pro::update_single_price_v2`,\n arguments: [\n tx.object('0x6'), // Clock object\n tx.object(config.oracle.oracleConfig), // Oracle configuration\n tx.object(config.oracle.priceOracle), // Price oracle contract\n tx.object(config.oracle.supraOracleHolder), // Supra oracle holder\n tx.object(priceFeed.pythPriceInfoObject), // Pyth price info object\n tx.object(config.oracle.switchboardAggregator),\n tx.pure.address(priceFeed.feedId) // Price feed ID\n ]\n })\n }\n }\n return tx\n}\n\n/**\n * Get all available price feeds from the configuration\n *\n * @param options - Optional environment configuration\n * @returns Array of oracle price feed configurations\n */\nexport async function getPriceFeeds(options?: Partial<EnvOption>): Promise<OraclePriceFeed[]> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n return config.oracle.feeds\n}\n\n/**\n * Filter price feeds based on lending state and pools\n *\n * This function filters price feeds to only include those that are relevant\n * to the current lending state or available pools.\n *\n * @param feeds - Array of price feeds to filter\n * @param filters - Filter criteria including lending state and pools\n * @returns Filtered array of price feeds\n */\nexport function filterPriceFeeds(\n feeds: OraclePriceFeed[],\n filters: {\n lendingState?: UserLendingInfo[]\n pools?: Pool[]\n lendingPositions?: LendingPosition[]\n }\n): OraclePriceFeed[] {\n return feeds.filter((feed) => {\n // Filter by lending state (user's current positions)\n if (filters?.lendingState) {\n const inState = filters.lendingState.find((state) => {\n return state.assetId === feed.assetId\n })\n if (inState) {\n return true\n }\n }\n\n if (filters?.lendingPositions) {\n const inPosition = filters.lendingPositions.find((position) => {\n const availableTypes = [\n 'navi-lending-supply',\n 'navi-lending-borrow',\n 'navi-lending-emode-supply',\n 'navi-lending-emode-borrow'\n ]\n if (!availableTypes.includes(position.type)) {\n return false\n }\n const pool = position[position.type]?.pool\n return pool?.id === feed.assetId\n })\n if (inPosition) {\n return true\n }\n }\n\n // Filter by available pools\n if (filters?.pools) {\n const inPool = filters.pools.find((pool) => {\n return pool.id === feed.assetId\n })\n if (inPool) {\n return true\n }\n }\n return false\n })\n}\n\nexport async function updateOraclePriceBeforeUserOperationPTB(\n tx: Transaction,\n address: string,\n pools: Pool[],\n options?: Partial<\n EnvOption &\n SuiClientOption &\n MarketOption & {\n throws?: boolean\n }\n >\n) {\n try {\n const allPriceFeeds = await getPriceFeeds({\n ...options\n })\n\n const markets = [] as string[]\n\n pools.forEach((pool) => {\n if (!markets.includes(pool.market)) {\n markets.push(pool.market)\n }\n })\n\n const lendingPositions = await getLendingPositions(address, {\n ...options,\n markets\n })\n\n const relevantFeeds = filterPriceFeeds(allPriceFeeds, {\n lendingPositions,\n pools\n })\n\n const updatedTx = await updateOraclePricesPTB(tx, relevantFeeds, {\n updatePythPriceFeeds: true,\n ...options\n })\n return updatedTx\n } catch (e) {\n if (options?.throws) {\n throw e\n }\n console.error(e)\n return tx\n }\n}\n","/**\n * Lending Reward Management for Lending Protocol\n *\n * This module provides comprehensive reward functionality for the lending protocol.\n * It handles reward calculations, claiming, and management for users who participate\n * in lending activities such as supplying assets or borrowing.\n */\n\nimport type {\n SuiClientOption,\n EnvOption,\n LendingRewardSummary,\n LendingReward,\n HistoryClaimedReward,\n LendingClaimedReward,\n TransactionResult,\n AccountCapOption,\n AccountCap,\n MarketOption,\n MarketsOption,\n EModeCap\n} from './types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport {\n suiClient,\n camelize,\n parseDevInspectResult,\n normalizeCoinType,\n withSingleton,\n parseTxValue,\n requestHeaders\n} from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport { getPriceFeeds } from './oracle'\nimport { getPools, depositCoinPTB } from './pool'\nimport BigNumber from 'bignumber.js'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\nimport { getUserEModeCaps } from './emode'\n\nasync function getLendingRewardsBatch(\n address: string,\n tasks: {\n address: string\n market: string\n owner: string\n emodeId?: number\n }[],\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<LendingReward[]> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS),\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n const feeds = await getPriceFeeds(options)\n\n for (let task of tasks) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market: task.market\n })\n tx.moveCall({\n target: `${config.uiGetter}::incentive_v3_getter::get_user_atomic_claimable_rewards`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.storage), // Protocol storage\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.pure.address(task.address) // User address\n ]\n })\n }\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const data = [] as [string[], string[], number[], string[], number[]][]\n\n result?.results?.forEach((item) => {\n data.push(\n parseDevInspectResult<[string[], string[], number[], string[], number[]]>(\n {\n results: [item]\n } as any,\n [\n bcs.vector(bcs.string()), // Asset coin types\n bcs.vector(bcs.string()), // Reward coin types\n bcs.vector(bcs.u8()), // Reward options\n bcs.vector(bcs.Address), // Rule IDs\n bcs.vector(bcs.u256()) // Claimable amounts\n ]\n )\n )\n })\n\n const rewardsList: {\n userClaimableReward: number\n userClaimedReward?: string\n option: number\n ruleIds: string[]\n assetCoinType: string\n rewardCoinType: string\n assetId: number\n market: string\n owner: string\n address: string\n emodeId?: number\n }[] = []\n\n data.forEach((rewardsData, index) => {\n const task = tasks[index]\n if (rewardsData.length === 5 && Array.isArray(rewardsData[0])) {\n const count = rewardsData[0].length\n for (let i = 0; i < count; i++) {\n const feed = feeds.find(\n (feed) => normalizeCoinType(feed.coinType) === normalizeCoinType(rewardsData[1][i])\n )\n const pool = pools.find(\n (pool) =>\n normalizeCoinType(pool.coinType) === normalizeCoinType(rewardsData[0][i]) &&\n pool.market === task.market\n )\n if (!feed || !pool) {\n continue\n }\n rewardsList.push({\n assetId: pool.id,\n assetCoinType: normalizeCoinType(rewardsData[0][i]),\n rewardCoinType: normalizeCoinType(rewardsData[1][i]),\n option: Number(rewardsData[2][i]),\n userClaimableReward: Number(rewardsData[4][i]) / Math.pow(10, feed.priceDecimal),\n ruleIds: Array.isArray(rewardsData[3][i])\n ? (rewardsData[3][i] as any)\n : [rewardsData[3][i]],\n market: task.market,\n owner: task.owner,\n address: task.address,\n emodeId: task.emodeId\n })\n }\n }\n })\n\n return rewardsList\n}\n\n/**\n * Get user's available lending rewards\n *\n * This function retrieves all available rewards for a user from the lending protocol.\n * It uses devInspect to simulate the reward calculation and returns detailed\n * information about claimable rewards for each asset and reward type.\n *\n * @param address - User's wallet address or account cap\n * @param options - Optional client and environment configuration\n * @returns Array of lending rewards available for claiming\n */\nexport async function getUserAvailableLendingRewards(\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption & MarketsOption>\n): Promise<LendingReward[]> {\n const markets = (options?.markets || [MARKETS.main]).map((identity) => {\n return getMarketConfig(identity)\n })\n\n let emodeCaps: EModeCap[] = []\n\n try {\n emodeCaps = await getUserEModeCaps(address, options)\n } catch (e) {\n console.error(e)\n }\n\n const tasks = markets\n .map((market) => {\n return {\n address,\n owner: address,\n market: market.key\n }\n })\n .concat(\n emodeCaps\n .filter((cap) => {\n return !!markets.find((market) => market.id === cap.marketId)\n })\n .map((cap) => {\n const market = getMarketConfig(cap.marketId)\n return {\n address: cap.accountCap,\n owner: address,\n market: market.key,\n emodeId: cap.emodeId\n }\n })\n )\n\n return await getLendingRewardsBatch(address, tasks, options)\n}\n\n/**\n * Summarize lending rewards by asset and reward type\n *\n * This function aggregates rewards by asset ID and reward type, providing\n * a summary view of all available rewards for easier display and management.\n *\n * @param rewards - Array of lending rewards to summarize\n * @returns Array of summarized reward information grouped by asset and type\n */\nexport function summaryLendingRewards(rewards: LendingReward[]): LendingRewardSummary[] {\n // Aggregate rewards by asset ID, reward type, and coin type\n const agg = new Map<\n string,\n { assetId: number; rewardType: number; coinType: string; total: number; market: string }\n >()\n\n rewards.forEach((reward) => {\n const assetId = reward.assetId\n const rewardType = reward.option\n const key = `${assetId}-${rewardType}-${reward.rewardCoinType}-${reward.market}`\n if (agg.has(key)) {\n agg.get(key)!.total += reward.userClaimableReward\n } else {\n agg.set(key, {\n assetId,\n rewardType,\n coinType: reward.rewardCoinType,\n total: Number(reward.userClaimableReward),\n market: reward.market\n })\n }\n })\n\n // Group rewards by asset ID and reward type\n const groupMap = new Map<\n string,\n { assetId: number; rewardType: number; market: string; rewards: Map<string, number> }\n >()\n for (const { assetId, rewardType, coinType, total, market } of agg.values()) {\n const groupKey = `${assetId}-${rewardType}-${market}`\n if (!groupMap.has(groupKey)) {\n groupMap.set(groupKey, { assetId, rewardType, market, rewards: new Map<string, number>() })\n }\n const rewardMap = groupMap.get(groupKey)!\n rewardMap.rewards.set(coinType, (rewardMap.rewards.get(coinType) || 0) + total)\n }\n\n // Convert to summary format\n return Array.from(groupMap.values()).map((group) => ({\n assetId: group.assetId,\n rewardType: group.rewardType,\n market: group.market,\n rewards: Array.from(group.rewards.entries()).map(([coinType, available]) => ({\n coinType,\n available: available.toFixed(6)\n }))\n }))\n}\n\n/**\n * Get user's total claimed rewards in USD value\n *\n * Fetches the total amount of rewards that a user has claimed historically,\n * converted to USD value for easy comparison and display.\n *\n * @param address - User's wallet address or account cap\n * @returns Object containing total claimed rewards in USD\n */\nexport const getUserTotalClaimedReward = withSingleton(\n async (\n address: string | AccountCap,\n options?: Partial<MarketOption>\n ): Promise<{\n USDValue: number\n }> => {\n const url = `https://open-api.naviprotocol.io/api/navi/user/total_claimed_reward?userAddress=${address}&sdk=${packageJson.version}&market=${options?.market || DEFAULT_MARKET_IDENTITY}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n)\n\n/**\n * Get user's claimed reward history\n *\n * Retrieves a paginated list of all rewards that a user has claimed historically.\n * Useful for tracking reward history and generating reports.\n *\n * @param address - User's wallet address or account cap\n * @param options - Pagination options (page number and size)\n * @returns Object containing claimed reward history and pagination cursor\n */\nexport const getUserClaimedRewardHistory = withSingleton(\n async (\n address: string | AccountCap,\n options?: Partial<\n MarketOption & {\n page: number\n size: number\n }\n >\n ): Promise<{\n data: HistoryClaimedReward[]\n cursor?: string\n }> => {\n const endpoint = `https://open-api.naviprotocol.io/api/navi/user/rewards?userAddress=${address}&page=${options?.page || 1}&pageSize=${options?.size || 400}&sdk=${packageJson.version}&market=${options?.market || DEFAULT_MARKET_IDENTITY}`\n const res = await fetch(endpoint, { headers: requestHeaders }).then((res) => res.json())\n return camelize({\n data: res.data.rewards\n })\n }\n)\n\n/**\n * Claim lending rewards in the PTB (Programmable Transaction Block)\n *\n * This function adds operations to a transaction block to claim rewards from the lending protocol.\n * It supports different claiming methods including direct claiming, claiming with\n * account capabilities, and custom coin handling (transfer or deposit).\n *\n * @param tx - The transaction block to add reward claiming operations to\n * @param rewards - Array of rewards to claim\n * @param options - Optional configuration including account capabilities and custom coin handling\n * @param options.customCoinReceive.type - The type of custom coin handling, can be 'transfer', 'depositNAVI' or 'skip'\n * @param options.customCoinReceive.transfer - The address to transfer the reward to, only used when options.customCoinReceive.type is 'transfer'\n * @param options.customCoinReceive.depositNAVI.fallbackReceiveAddress - The address to transfer the reward to if the pool is full, only used when options.customCoinReceive.type is 'depositNAVI'\n * @returns Array of claimed reward coins and their identifiers\n * @throws Error if reward fund not found or invalid configuration\n */\nexport async function claimLendingRewardsPTB(\n tx: Transaction,\n rewards: LendingReward[],\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n customCoinReceive?: {\n type: 'transfer' | 'depositNAVI' | 'skip'\n transfer?: string | TransactionResult\n depositNAVI?: {\n fallbackReceiveAddress?: string\n }\n }\n }\n >\n) {\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS),\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // Group rewards by reward coin type and collect asset IDs and rule IDs\n const rewardMap = new Map<\n string,\n {\n assetIds: string[]\n ruleIds: string[]\n amount: number\n market: string\n owner: string\n address: string\n isEMode: boolean\n }\n >()\n\n for (const reward of rewards) {\n const { rewardCoinType, ruleIds, market, owner, address, emodeId } = reward\n\n const key = `${rewardCoinType}___${address}`\n\n for (const ruleId of ruleIds) {\n if (!rewardMap.has(key)) {\n rewardMap.set(key, {\n assetIds: [],\n ruleIds: [],\n amount: 0,\n market,\n owner,\n address,\n isEMode: typeof emodeId !== 'undefined'\n })\n }\n\n const group = rewardMap.get(key)!\n group.assetIds.push(reward.assetCoinType.replace('0x', ''))\n group.ruleIds.push(ruleId)\n group.amount += reward.userClaimableReward\n }\n }\n\n const rewardCoins = [] as LendingClaimedReward[]\n\n // Process each reward coin type\n for (const [\n rewardCoinType,\n { assetIds, ruleIds, amount, market, owner, address, isEMode }\n ] of rewardMap) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market\n })\n const coinType = rewardCoinType.split('___')[0]\n const pool = pools.find(\n (p) => normalizeCoinType(p.suiCoinType) === normalizeCoinType(coinType) && p.market === market\n )\n if (!pool || !pool.contract.rewardFundId) {\n throw new Error(`No matching rewardFund found for reward coin: ${coinType} ${market}`)\n }\n const matchedRewardFund = pool.contract.rewardFundId\n\n // Validate configuration\n if (options?.accountCap && !options.customCoinReceive) {\n throw new Error('customCoinReceive is required when accountCap is provided')\n }\n\n // Handle custom coin receiving logic\n if (options?.customCoinReceive) {\n let rewardBalance\n\n // Claim rewards with or without account capability\n if (options.accountCap) {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(options.accountCap, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n } else if (isEMode) {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(address, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n } else {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds) // Rule IDs\n ],\n typeArguments: [coinType]\n })\n }\n\n // Convert balance to coin object\n const [rewardCoin]: any = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [rewardBalance],\n typeArguments: [coinType]\n })\n\n // Handle different custom coin receiving types\n if (options?.customCoinReceive.type === 'transfer') {\n if (!options.customCoinReceive.transfer) {\n throw new Error('customCoinReceive.transfer is required')\n }\n tx.transferObjects(\n [rewardCoin],\n parseTxValue(options.customCoinReceive.transfer, tx.pure.address)\n )\n }\n if (options?.customCoinReceive.type === 'depositNAVI') {\n const supplyAmount = BigNumber(pool.totalSupplyAmount).shiftedBy(-9)\n const cap = BigNumber(pool.supplyCapCeiling).shiftedBy(-27)\n\n // if the pool is full, transfer the reward to the fallback receive address\n if (\n supplyAmount.plus(amount).isGreaterThan(cap) &&\n !!options?.customCoinReceive.depositNAVI?.fallbackReceiveAddress\n ) {\n tx.transferObjects(\n [rewardCoin],\n tx.pure.address(options.customCoinReceive.depositNAVI.fallbackReceiveAddress)\n )\n } else {\n await depositCoinPTB(tx, pool, rewardCoin, options)\n }\n } else {\n rewardCoins.push({\n coin: rewardCoin,\n identifier: pool,\n owner,\n isEMode\n })\n }\n } else {\n // Standard reward claiming without custom handling\n if (!!options?.accountCap || isEMode) {\n const rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(options?.accountCap || address, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n\n const [rewardCoin]: any = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [rewardBalance],\n typeArguments: [coinType]\n })\n\n tx.transferObjects(\n [rewardCoin],\n parseTxValue(options?.accountCap || owner, tx.pure.address)\n )\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_entry`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds) // Rule IDs\n ],\n typeArguments: [coinType]\n })\n }\n }\n }\n return rewardCoins\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, ALL_NAVI_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw } from '../utils/format.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\n\n// NAVI SDK expects SuiClient (v1 name), our code uses SuiJsonRpcClient (v2 name).\n// They're the same runtime class, so the cast is safe.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sdkOptions(client: SuiJsonRpcClient): { env: 'prod'; client: any; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean; skipOracle?: boolean },\n): Promise<void> {\n if (options?.skipOracle) return;\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n WAL: 'WAL',\n NAVX: 'NAVX',\n ETH: 'ETH',\n GOLD: 'GOLD',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = (isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0')) / 100;\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of ALL_NAVI_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p: Pool) => {\n const poolSuffix = (p.suiCoinType || p.coinType || '').split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n });\n if (!pool) continue;\n\n const saveApy = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0') / 100;\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0') / 100;\n\n if (saveApy >= 0 && saveApy < 2.0) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 2.0 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 0.04, borrowApy: 0.06 };\n return result;\n } catch {\n return { USDC: { saveApy: 0.04, borrowApy: 0.06 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n // [B5 v2 / 2026-04-30] No fee collection here. SDK + CLI are fee-free by design.\n // Consumer apps (Audric) collect fees by calling `addFeeTransfer(tx, coinObj, ...)`\n // BEFORE invoking this builder. See packages/sdk/src/protocols/protocolFee.ts.\n\n const rawAmount = Math.min(Number(stableToRaw(amount, assetInfo.decimals)), Number(totalBalance));\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coinObj as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // skipPythUpdate=true is required for sponsored builds (Enoki):\n // Pyth's SuiPythClient.updatePriceFeeds uses tx.splitCoins(tx.gas, ...)\n // for the oracle fee. Sponsored txes can't reference tx.gas as an\n // argument — Sui rejects with \"Cannot use GasCoin as a transaction\n // argument\". Skipping the client-side Pyth update still adds NAVI's\n // on-chain `update_single_price_v2` moveCalls, which read Pyth's\n // on-chain state (kept fresh by Pyth keepers ~every 5s for major\n // assets). Self-funded callers (CLI) leave it false to also pay the\n // Pyth fee from tx.gas, maximizing freshness.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // See note on buildWithdrawTx for skipPythUpdate semantics.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n // [B5 v2 / 2026-04-30] No fee collection — see comment in `buildSaveTx`.\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n // skipOracle bypasses oracle entirely (safe for repay — no HF risk; debt\n // reduction never triggers liquidation). skipPythUpdate is the narrower\n // flag — preserves on-chain `update_single_price_v2` calls but skips the\n // tx.gas-using Pyth fee payment. Sponsored callers (Enoki) typically pass\n // skipOracle=true; self-funded callers can leave both undefined.\n // See note on buildWithdrawTx for sponsored-build details.\n options: { asset?: string; skipPythUpdate?: boolean; skipOracle?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address, {\n skipPythUpdate: options.skipPythUpdate,\n skipOracle: options.skipOracle,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // See note on buildWithdrawTx for skipPythUpdate semantics.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n // [B5 v2 / 2026-04-30] No fee collection — consumer apps that want to\n // charge a fee should use `addBorrowToTx` directly, split the fee from\n // the returned coin via `addFeeTransfer`, then transfer the remainder.\n // See packages/sdk/src/protocols/protocolFee.ts.\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\n/**\n * [B5 v2] Add a NAVI borrow to an existing PTB and return the borrowed coin\n * WITHOUT transferring it to the user. Lets consumer apps interpose a fee\n * transfer (split → transfer to treasury) before the final transfer to user.\n *\n * This is the lower-level companion to `buildBorrowTx`. CLI / direct SDK\n * callers should keep using `buildBorrowTx` (it transfers to user automatically\n * and is fee-free); Audric uses this to wedge `addFeeTransfer` between the\n * borrow and the user transfer.\n */\nexport async function addBorrowToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<TransactionObjectArgument> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return borrowedCoin as TransactionObjectArgument;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // skipOracle bypasses oracle entirely (safe for repay — no HF risk).\n // skipPythUpdate is the narrower flag — preserves on-chain\n // `update_single_price_v2` calls but skips the tx.gas-using Pyth fee\n // payment. See note on buildWithdrawTx for sponsored-build details.\n options: { asset?: string; skipOracle?: boolean; skipPythUpdate?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with. Withdraw some savings first to get cash.`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n const rawRequested = Number(stableToRaw(amount, assetInfo.decimals));\n\n if (Number(totalBalance) < rawRequested && Number(totalBalance) < 1000) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Not enough ${assetInfo.displayName} to repay (need $${amount.toFixed(2)}, wallet has ~$${(Number(totalBalance) / 10 ** assetInfo.decimals).toFixed(4)}). Withdraw some savings first.`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Math.min(rawRequested, Number(totalBalance));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\n\n await refreshOracle(tx, client, address, {\n skipOracle: options.skipOracle,\n skipPythUpdate: options.skipPythUpdate,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n } catch {\n return [];\n }\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n // Capture per-reward metadata from the source `claimable` list before\n // it gets handed to the NAVI PTB builder. We previously stubbed every\n // returned reward as `{ symbol: 'REWARD', amount: 0 }`, which made\n // the engine narrate \"no pending rewards\" / \"Claimed $0.00\" even when\n // the on-chain tx successfully credited e.g. vSUI to the wallet. The\n // PTB builder's return value is just an internal opaque list of move\n // calls — the truth about which assets / amounts were claimed lives\n // in the `claimable` rows we filtered above.\n await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n\n return aggregateClaimableRewards(claimable);\n } catch {\n return [];\n }\n}\n\n/**\n * Standalone builder for the `claim_rewards` tool. Wraps the existing\n * `addClaimRewardsToTx` appender into a complete PTB so the SPEC 7\n * `composeTx` registry adapter has a single-step builder it can dispatch\n * to when `claim_rewards` is invoked alone (the chain-mode path uses\n * `addClaimRewardsToTx` directly inside a multi-step PTB).\n *\n * Multi-protocol claim flows (e.g. NAVI + Suilend in a future world)\n * still go through the `T2000` class's `claimRewards()` method, which\n * iterates every registered lending adapter via the adapter registry —\n * this standalone builder is intentionally NAVI-only to keep the shape\n * symmetric with the rest of SPEC 7's Layer 1 builders.\n *\n * Returns `{ tx, rewards }`:\n * - `tx` — built PTB with sender set; if no rewards are claimable, no\n * move calls are appended (caller should skip executing).\n * - `rewards` — what WILL be claimed by `tx`. Empty array means nothing\n * to claim.\n */\nexport async function buildClaimRewardsTx(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<{ tx: Transaction; rewards: PendingReward[] }> {\n const tx = new Transaction();\n tx.setSender(address);\n const rewards = await addClaimRewardsToTx(tx, client, address);\n return { tx, rewards };\n}\n\n/**\n * Minimal shape we read off the NAVI SDK's `LendingReward` rows. Kept\n * structural rather than imported so the tests don't have to reproduce\n * the full upstream type and the function works for any future caller\n * that has the same fields.\n */\nexport interface ClaimableRewardLike {\n userClaimableReward: number | string;\n rewardCoinType: string;\n assetId?: number | string;\n}\n\n/**\n * Aggregate raw NAVI `claimable` rows into the `PendingReward[]` shape\n * the engine surfaces to the LLM and the UI. Aggregates by reward coin\n * type so a user with rewards from multiple pools (e.g. USDC pool + SUI\n * pool both rewarding vSUI) sees a single \"0.0165 vSUI\" line rather\n * than three separate dust entries. Filters out non-finite / non-positive\n * amounts so dust noise can't sneak in as \"$0.00 REWARD\" rows.\n */\nexport function aggregateClaimableRewards(\n claimable: ClaimableRewardLike[],\n): PendingReward[] {\n const aggregated = new Map<string, PendingReward>();\n for (const c of claimable) {\n const coinType = c.rewardCoinType;\n if (!coinType) continue;\n const symbol = coinType.split('::').pop() ?? 'REWARD';\n const amount = Number(c.userClaimableReward);\n if (!Number.isFinite(amount) || amount <= 0) continue;\n\n const existing = aggregated.get(coinType);\n if (existing) {\n existing.amount += amount;\n } else {\n aggregated.set(coinType, {\n protocol: 'navi',\n asset: String(c.assetId ?? ''),\n coinType,\n symbol,\n amount,\n estimatedValueUsd: 0,\n });\n }\n }\n return Array.from(aggregated.values());\n}\n","import type { ProtocolDescriptor } from './types.js';\n\nexport type { ProtocolDescriptor } from './types.js';\n\nexport const naviDescriptor: ProtocolDescriptor = {\n id: 'navi',\n name: 'NAVI Protocol',\n packages: [],\n dynamicPackageId: true,\n actionMap: {\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n PendingReward,\n} from './types.js';\nimport { ALL_NAVI_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport { naviDescriptor as descriptor } from './descriptors.js';\n\nexport class NaviAdapter implements LendingAdapter {\n readonly id = 'navi';\n readonly name = 'NAVI Protocol';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...ALL_NAVI_ASSETS];\n readonly supportsSameAssetBorrow = true;\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n const rates = await naviProtocol.getRates(this.client);\n const normalized = normalizeAsset(asset);\n const r = rates[normalized as keyof typeof rates];\n if (!r) throw new T2000Error('ASSET_NOT_SUPPORTED', `NAVI does not support ${asset}`);\n return { asset: normalized, saveApy: r.saveApy, borrowApy: r.borrowApy };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const result = await naviProtocol.getPositions(this.client, address);\n return {\n supplies: result.positions\n .filter(p => p.type === 'save')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipOracle?: boolean; skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, {\n asset: normalized,\n skipOracle: options?.skipOracle,\n skipPythUpdate: options?.skipPythUpdate,\n });\n return { tx };\n }\n\n async maxWithdraw(address: string, _asset: string) {\n return naviProtocol.maxWithdrawAmount(this.client, address);\n }\n\n async maxBorrow(address: string, _asset: string) {\n return naviProtocol.maxBorrowAmount(this.client, address);\n }\n\n async addWithdrawToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addWithdrawToTx(tx, this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async addSaveToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addSaveToTx(tx, this.client, address, coin, { asset: normalized });\n }\n\n async addBorrowToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<TransactionObjectArgument> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addBorrowToTx(tx, this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addRepayToTx(tx, this.client, address, coin, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n return naviProtocol.getPendingRewards(this.client, address);\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n return naviProtocol.addClaimRewardsToTx(tx, this.client, address);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.pnpm/lodash.camelcase@4.3.0/node_modules/lodash.camelcase/index.js","../../src/errors.ts","../../src/constants.ts","../../src/adapters/registry.ts","../../src/utils/format.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/uleb.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/reader.ts","../../../../node_modules/.pnpm/@scure+base@2.0.0/node_modules/@scure/base/index.ts","../../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/b58.ts","../../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/b64.ts","../../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/hex.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/utils.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/writer.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/bcs-type.ts","../../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/bcs.ts","../../../../node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.mjs","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/bcs.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/ua.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/utils.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/pool.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/market.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/config.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/emode.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/account.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/oracle.ts","../../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/reward.ts","../../src/protocols/navi.ts","../../src/adapters/descriptors.ts","../../src/adapters/navi.ts"],"names":["exports","Symbol","b","x","vector","BcsType","options","#bytes","name","k","P","BigNumber","alphabet","compare","q","ne","xe","ye","format","z","Address","bcs","val","fromHex","toHex","IncentivePoolInfo","UserStateInfo","sdkVersion","packageJson","getNodeInfo","os","nodeVersion","osType","osArch","getUserAgent","environmentInfo","userAgent","suiClient","SuiClient","getFullnodeUrl","argsKey","args","serializergs","option","index","isLast","client","disableCache","cacheTime","rest","withSingleton","fn","promiseMap","key","withCache","cache","cacheData","result","parseTxValue","value","parseTxPoolValue","tx","parseDevInspectResult","data","parseTypes","item","normalizeCoinType","coinType","normalizeStructTag","processContractHealthFactor","hf","healthFactor","SuiPriceServiceConnection","Rate_Decimals","rayMathMulIndex","amount","ray","halfRay","requestHeaders","getPoolsMap","pools","acc","pool","poolToEModePool","emodeIdentity","emode","emodeAsset","asset","parsePoolUID","uid","marketKey","poolId","uuid","getPools","markets","MARKETS","identity","getMarketConfig","url","market","res","emodes","poolSupplyAmount","poolBorrowAmount","poolSupplyValue","poolBorrowValue","poolSupplyCapAmount","poolBorrowCapAmount","poolSupplyCapValue","poolBorrowCapValue","getPool","identifier","parsedUID","DEFAULT_MARKET_IDENTITY","DEFAULT_CACHE_TIME","p","depositCoinPTB","coinObject","config","getConfig","isGasCoin","depositAmount","withdrawCoinPTB","withdrawAmount","withdrawBalance","ret","borrowCoinPTB","borrowAmount","borrowBalance","repayCoinPTB","repayAmount","marketIdentity","marketConfig","getUserEModeCaps","address","Transaction","values","marketIds","emodeIds","accountCaps","marketId","getSimulatedHealthFactorPTB","estimatedSupply","estimatedBorrow","isIncrease","getHealthFactorPTB","getLendingStateBatch","tasks","poolsMap","task","stateList","states","state","supplyBalance","getHealthFactor","getLendingPositions","positions","emodeCaps","e","cap","emodeCap","lendingState","supplyAmount","emodePool","suiPythConnection","getOnChainPriceInfo","pythInfos","priceInfos","priceInfoObjectIds","priceInfoObjects","obj","pythInfo","v","objectFields","magnitude","negative","conf","timestamp","err","getPythStalePriceFeedIdV2","returnData","latestPriceFeeds","currentTimestamp","priceFeed","maxTime","error","updatePythPriceFeeds","priceFeedIds","priceUpdateData","SuiPythClient","updateOraclePricesPTB","priceFeeds","feed","stalePriceFeedIds","getPriceFeeds","filterPriceFeeds","feeds","filters","position","updateOraclePriceBeforeUserOperationPTB","allPriceFeeds","lendingPositions","relevantFeeds","getLendingRewardsBatch","rewardsList","rewardsData","count","i","getUserAvailableLendingRewards","summaryLendingRewards","rewards","agg","reward","assetId","rewardType","groupMap","total","groupKey","rewardMap","group","available","claimLendingRewardsPTB","rewardCoinType","ruleIds","owner","emodeId","ruleId","rewardCoins","assetIds","isEMode","matchedRewardFund","rewardBalance","rewardCoin"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',\n rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',\n rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,\n rsUpper + '+' + rsOptUpperContr,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 'ss'\n};\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\n/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n});\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = camelCase;\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'CHAIN_MODE_INVALID'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail no matter how many times you retry.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import { T2000Error } from './errors.js';\n\nexport const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\n// ---------------------------------------------------------------------------\n// Operation → allowed asset rules (single source of truth)\n// ---------------------------------------------------------------------------\n\n// [v0.51.0] Saveable/borrowable set: USDC + USDsui.\n// USDC is the canonical default; USDsui is a strategic exception backed by an\n// existing NAVI pool. See `.cursor/rules/savings-usdc-only.mdc` for the\n// rationale and the rule that gates additional stables (don't add more here\n// without updating that file).\nexport const OPERATION_ASSETS = {\n save: ['USDC', 'USDsui'],\n borrow: ['USDC', 'USDsui'],\n withdraw: '*',\n repay: '*',\n send: '*',\n swap: '*',\n} as const;\n\nexport type Operation = keyof typeof OPERATION_ASSETS;\n\nexport function isAllowedAsset(op: Operation, asset: string): boolean {\n const allowed = OPERATION_ASSETS[op];\n if (allowed === '*') return true;\n // [v0.51.0] Mixed-case canonical keys (USDsui, suiUSDT) need case-insensitive\n // membership. Pre-v0.51 we only had USDC ↔ USDC (uppercase identity), so\n // a one-sided uppercase compare looked correct. Now that USDsui is in the\n // set, normalize both sides.\n const target = asset.toLowerCase();\n return (allowed as readonly string[]).some((a) => a.toLowerCase() === target);\n}\n\n/**\n * Throws if the asset is not permitted for the given operation.\n * Passing `undefined` (omitted) is always valid — defaults to USDC.\n */\nexport function assertAllowedAsset(op: Operation, asset: string | undefined): void {\n if (!asset) return;\n if (!isAllowedAsset(op, asset)) {\n const allowed = OPERATION_ASSETS[op];\n const list = Array.isArray(allowed) ? allowed.join(', ') : 'any';\n throw new T2000Error(\n 'INVALID_ASSET',\n `${op} only supports ${list}. Cannot use ${asset}.${op === 'save' ? ' Swap to USDC or USDsui first.' : ''}`,\n );\n }\n}\n\n// All protocol fees route here as a regular USDC wallet transfer. Audric's\n// prepare/route.ts adds `addFeeTransfer(...)` inline for save/borrow and passes\n// `overlayFee.receiver = T2000_OVERLAY_FEE_WALLET` for swaps. The CLI/SDK never\n// charge fees — this constant is exported for consumer apps only.\n//\n// Address corresponds to the treasury admin wallet. Override via env for local dev /\n// testnet only — production must use the canonical mainnet address below.\nexport const T2000_OVERLAY_FEE_WALLET = process.env.T2000_OVERLAY_FEE_WALLET\n ?? '0x5366efbf2b4fe5767fe2e78eb197aa5f5d138d88ac3333fbf3f80a1927da473a';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports saving ${asset}`);\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async bestBorrowRate(asset: string, opts?: { requireSameAssetBorrow?: boolean }): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('borrow')) continue;\n if (opts?.requireSameAssetBorrow && !adapter.supportsSameAssetBorrow) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports borrowing ${asset}`);\n }\n\n candidates.sort((a, b) => a.rate.borrowApy - b.rate.borrowApy);\n return candidates[0];\n }\n\n async bestSaveRateAcrossAssets(): Promise<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> = [];\n\n for (const asset of STABLE_ASSETS) {\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate, asset });\n } catch { /* skip */ }\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'No lending adapter found for any stablecoin');\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async allRatesAcrossAssets(): Promise<Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }> = [];\n const seen = new Set<string>();\n for (const asset of STABLE_ASSETS) {\n if (seen.has(asset)) continue;\n seen.add(asset);\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n if (rates.saveApy > 0 || rates.borrowApy > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, asset, rates });\n }\n } catch { /* skip */ }\n }\n }\n return results;\n }\n\n async allRates(asset: string): Promise<Array<{ protocol: string; protocolId: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; rates: LendingRates }> = [];\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n results.push({ protocol: adapter.name, protocolId: adapter.id, rates });\n } catch {\n // skip\n }\n }\n return results;\n }\n\n async allPositions(address: string): Promise<Array<{ protocol: string; protocolId: string; positions: AdapterPositions }>> {\n const results: Array<{ protocol: string; protocolId: string; positions: AdapterPositions }> = [];\n const errors: string[] = [];\n for (const adapter of this.lending.values()) {\n try {\n const positions = await adapter.getPositions(address);\n if (positions.supplies.length > 0 || positions.borrows.length > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, positions });\n }\n } catch (err) {\n errors.push(`${adapter.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (results.length === 0 && errors.length > 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol queries failed (${errors.length}/${this.lending.size}): ${errors.join('; ')}`);\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// Helper utility: write number as an ULEB array.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebEncode(num: number | bigint): number[] {\n\tlet bigNum = BigInt(num);\n\tconst arr: number[] = [];\n\tlet len = 0;\n\n\tif (bigNum === 0n) {\n\t\treturn [0];\n\t}\n\n\twhile (bigNum > 0) {\n\t\tarr[len] = Number(bigNum & 0x7fn);\n\t\tbigNum >>= 7n;\n\t\tif (bigNum > 0n) {\n\t\t\tarr[len] |= 0x80;\n\t\t}\n\t\tlen += 1;\n\t}\n\n\treturn arr;\n}\n\n// Helper utility: decode ULEB as an array of numbers.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebDecode(arr: number[] | Uint8Array): {\n\tvalue: number;\n\tlength: number;\n} {\n\tlet total = 0n;\n\tlet shift = 0n;\n\tlet len = 0;\n\n\twhile (true) {\n\t\tif (len >= arr.length) {\n\t\t\tthrow new Error('ULEB decode error: buffer overflow');\n\t\t}\n\n\t\tconst byte = arr[len];\n\t\tlen += 1;\n\t\ttotal += BigInt(byte & 0x7f) << shift;\n\t\tif ((byte & 0x80) === 0) {\n\t\t\tbreak;\n\t\t}\n\t\tshift += 7n;\n\t}\n\n\t// TODO: return bigint in next major version\n\tif (total > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new Error('ULEB decode error: value exceeds MAX_SAFE_INTEGER');\n\t}\n\n\treturn {\n\t\tvalue: Number(total),\n\t\tlength: len,\n\t};\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ulebDecode } from './uleb.js';\n\n/**\n * Class used for reading BCS data chunk by chunk. Meant to be used\n * by some wrapper, which will make sure that data is valid and is\n * matching the desired format.\n *\n * @example\n * // data for this example is:\n * // { a: u8, b: u32, c: bool, d: u64 }\n *\n * let reader = new BcsReader(\"647f1a060001ffffe7890423c78a050102030405\");\n * let field1 = reader.read8();\n * let field2 = reader.read32();\n * let field3 = reader.read8() === '1'; // bool\n * let field4 = reader.read64();\n * // ....\n *\n * Reading vectors is another deal in bcs. To read a vector, you first need to read\n * its length using {@link readULEB}. Here's an example:\n * @example\n * // data encoded: { field: [1, 2, 3, 4, 5] }\n * let reader = new BcsReader(\"050102030405\");\n * let vec_length = reader.readULEB();\n * let elements = [];\n * for (let i = 0; i < vec_length; i++) {\n * elements.push(reader.read8());\n * }\n * console.log(elements); // [1,2,3,4,5]\n *\n * @param {String} data HEX-encoded data (serialized BCS)\n */\nexport class BcsReader {\n\tprivate dataView: DataView;\n\tprivate bytePosition: number = 0;\n\n\t/**\n\t * @param {Uint8Array} data Data to use as a buffer.\n\t */\n\tconstructor(data: Uint8Array) {\n\t\tthis.dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\t}\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number) {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Read U8 value from the buffer and shift cursor by 1.\n\t * @returns\n\t */\n\tread8(): number {\n\t\tconst value = this.dataView.getUint8(this.bytePosition);\n\t\tthis.shift(1);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U16 value from the buffer and shift cursor by 2.\n\t * @returns\n\t */\n\tread16(): number {\n\t\tconst value = this.dataView.getUint16(this.bytePosition, true);\n\t\tthis.shift(2);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U32 value from the buffer and shift cursor by 4.\n\t * @returns\n\t */\n\tread32(): number {\n\t\tconst value = this.dataView.getUint32(this.bytePosition, true);\n\t\tthis.shift(4);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U64 value from the buffer and shift cursor by 8.\n\t * @returns\n\t */\n\tread64(): string {\n\t\tconst value1 = this.read32();\n\t\tconst value2 = this.read32();\n\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(8, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 16.\n\t */\n\tread128(): string {\n\t\tconst value1 = BigInt(this.read64());\n\t\tconst value2 = BigInt(this.read64());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(16, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 32.\n\t * @returns\n\t */\n\tread256(): string {\n\t\tconst value1 = BigInt(this.read128());\n\t\tconst value2 = BigInt(this.read128());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(32, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read `num` number of bytes from the buffer and shift cursor by `num`.\n\t * @param num Number of bytes to read.\n\t */\n\treadBytes(num: number): Uint8Array {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst value = new Uint8Array(this.dataView.buffer, start, num);\n\n\t\tthis.shift(num);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read ULEB value - an integer of varying size. Used for enum indexes and\n\t * vector lengths.\n\t * @returns {Number} The ULEB value.\n\t */\n\treadULEB(): number {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst buffer = new Uint8Array(this.dataView.buffer, start);\n\t\tconst { value, length } = ulebDecode(buffer);\n\n\t\tthis.shift(length);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read a BCS vector: read a length and then apply function `cb` X times\n\t * where X is the length of the vector, defined as ULEB in BCS bytes.\n\t * @param cb Callback to process elements of vector.\n\t * @returns {Array<Any>} Array of the resulting values, returned by callback.\n\t */\n\treadVec(cb: (reader: BcsReader, i: number, length: number) => any): any[] {\n\t\tconst length = this.readULEB();\n\t\tconst result = [];\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult.push(cb(this, i, length));\n\t\t}\n\t\treturn result;\n\t}\n}\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { base58 } from '@scure/base';\n\nexport const toBase58 = (buffer: Uint8Array) => base58.encode(buffer);\nexport const fromBase58 = (str: string) => base58.decode(str) as Uint8Array<ArrayBuffer>;\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function fromBase64(base64String: string): Uint8Array<ArrayBuffer> {\n\treturn Uint8Array.from(atob(base64String), (char) => char.charCodeAt(0));\n}\n\nconst CHUNK_SIZE = 8192;\nexport function toBase64(bytes: Uint8Array): string {\n\t// Special-case the simple case for speed's sake.\n\tif (bytes.length < CHUNK_SIZE) {\n\t\treturn btoa(String.fromCharCode(...bytes));\n\t}\n\n\tlet output = '';\n\tfor (var i = 0; i < bytes.length; i += CHUNK_SIZE) {\n\t\tconst chunk = bytes.slice(i, i + CHUNK_SIZE);\n\t\toutput += String.fromCharCode(...chunk);\n\t}\n\n\treturn btoa(output);\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function fromHex(hexStr: string): Uint8Array<ArrayBuffer> {\n\tconst normalized = hexStr.startsWith('0x') ? hexStr.slice(2) : hexStr;\n\tconst padded = normalized.length % 2 === 0 ? normalized : `0${normalized}`;\n\tconst intArr = padded.match(/[0-9a-fA-F]{2}/g)?.map((byte) => parseInt(byte, 16)) ?? [];\n\n\tif (intArr.length !== padded.length / 2) {\n\t\tthrow new Error(`Invalid hex string ${hexStr}`);\n\t}\n\n\treturn Uint8Array.from(intArr);\n}\n\nexport function toHex(bytes: Uint8Array): string {\n\treturn bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, fromHex, toBase58, toBase64, toHex } from '@mysten/utils';\nimport type { Encoding } from './types.js';\n\n/**\n * Encode data with either `hex` or `base64`.\n *\n * @param {Uint8Array} data Data to encode.\n * @param {String} encoding Encoding to use: base64 or hex\n * @returns {String} Encoded value.\n */\nexport function encodeStr(data: Uint8Array, encoding: Encoding): string {\n\tswitch (encoding) {\n\t\tcase 'base58':\n\t\t\treturn toBase58(data);\n\t\tcase 'base64':\n\t\t\treturn toBase64(data);\n\t\tcase 'hex':\n\t\t\treturn toHex(data);\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported encoding, supported values are: base64, hex');\n\t}\n}\n\n/**\n * Decode either `base64` or `hex` data.\n *\n * @param {String} data Data to encode.\n * @param {String} encoding Encoding to use: base64 or hex\n * @returns {Uint8Array} Encoded value.\n */\nexport function decodeStr(data: string, encoding: Encoding): Uint8Array {\n\tswitch (encoding) {\n\t\tcase 'base58':\n\t\t\treturn fromBase58(data);\n\t\tcase 'base64':\n\t\t\treturn fromBase64(data);\n\t\tcase 'hex':\n\t\t\treturn fromHex(data);\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported encoding, supported values are: base64, hex');\n\t}\n}\n\nexport function splitGenericParameters(\n\tstr: string,\n\tgenericSeparators: [string, string] = ['<', '>'],\n) {\n\tconst [left, right] = genericSeparators;\n\tconst tok = [];\n\tlet word = '';\n\tlet nestedAngleBrackets = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst char = str[i];\n\t\tif (char === left) {\n\t\t\tnestedAngleBrackets++;\n\t\t}\n\t\tif (char === right) {\n\t\t\tnestedAngleBrackets--;\n\t\t}\n\t\tif (nestedAngleBrackets === 0 && char === ',') {\n\t\t\ttok.push(word.trim());\n\t\t\tword = '';\n\t\t\tcontinue;\n\t\t}\n\t\tword += char;\n\t}\n\n\ttok.push(word.trim());\n\n\treturn tok;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Encoding } from './types.js';\nimport { ulebEncode } from './uleb.js';\nimport { encodeStr } from './utils.js';\n\nexport interface BcsWriterOptions {\n\t/** The initial size (in bytes) of the buffer tht will be allocated */\n\tinitialSize?: number;\n\t/** The maximum size (in bytes) that the buffer is allowed to grow to */\n\tmaxSize?: number;\n\t/** The amount of bytes that will be allocated whenever additional memory is required */\n\tallocateSize?: number;\n}\n\n/**\n * Class used to write BCS data into a buffer. Initializer requires\n * some size of a buffer to init; default value for this buffer is 1KB.\n *\n * Most methods are chainable, so it is possible to write them in one go.\n *\n * @example\n * let serialized = new BcsWriter()\n * .write8(10)\n * .write32(1000000)\n * .write64(10000001000000)\n * .hex();\n */\n\n/**\n * Set of methods that allows data encoding/decoding as standalone\n * BCS value or a part of a composed structure/vector.\n */\nexport class BcsWriter {\n\tprivate dataView: DataView<ArrayBuffer>;\n\tprivate bytePosition: number = 0;\n\tprivate size: number;\n\tprivate maxSize: number;\n\tprivate allocateSize: number;\n\n\tconstructor({\n\t\tinitialSize = 1024,\n\t\tmaxSize = Infinity,\n\t\tallocateSize = 1024,\n\t}: BcsWriterOptions = {}) {\n\t\tthis.size = initialSize;\n\t\tthis.maxSize = maxSize;\n\t\tthis.allocateSize = allocateSize;\n\t\tthis.dataView = new DataView(new ArrayBuffer(initialSize));\n\t}\n\n\tprivate ensureSizeOrGrow(bytes: number) {\n\t\tconst requiredSize = this.bytePosition + bytes;\n\t\tif (requiredSize > this.size) {\n\t\t\tconst nextSize = Math.min(\n\t\t\t\tthis.maxSize,\n\t\t\t\tMath.max(this.size + requiredSize, this.size + this.allocateSize),\n\t\t\t);\n\t\t\tif (requiredSize > nextSize) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Attempting to serialize to BCS, but buffer does not have enough size. Allocated size: ${this.size}, Max size: ${this.maxSize}, Required size: ${requiredSize}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.size = nextSize;\n\t\t\tconst nextBuffer = new ArrayBuffer(this.size);\n\t\t\tnew Uint8Array(nextBuffer).set(new Uint8Array(this.dataView.buffer));\n\t\t\tthis.dataView = new DataView(nextBuffer);\n\t\t}\n\t}\n\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number): this {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite8(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(1);\n\t\tthis.dataView.setUint8(this.bytePosition, Number(value));\n\t\treturn this.shift(1);\n\t}\n\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteBytes(bytes: Uint8Array): this {\n\t\tthis.ensureSizeOrGrow(bytes.length);\n\n\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\tthis.dataView.setUint8(this.bytePosition + i, bytes[i]);\n\t\t}\n\n\t\treturn this.shift(bytes.length);\n\t}\n\t/**\n\t * Write a U16 value into a buffer and shift cursor position by 2.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite16(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(2);\n\t\tthis.dataView.setUint16(this.bytePosition, Number(value), true);\n\t\treturn this.shift(2);\n\t}\n\t/**\n\t * Write a U32 value into a buffer and shift cursor position by 4.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite32(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(4);\n\t\tthis.dataView.setUint32(this.bytePosition, Number(value), true);\n\t\treturn this.shift(4);\n\t}\n\t/**\n\t * Write a U64 value into a buffer and shift cursor position by 8.\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite64(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 8).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U128 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite128(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 16).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U256 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite256(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 32).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a ULEB value into a buffer and shift cursor position by number of bytes\n\t * written.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteULEB(value: number): this {\n\t\tulebEncode(value).forEach((el) => this.write8(el));\n\t\treturn this;\n\t}\n\t/**\n\t * Write a vector into a buffer by first writing the vector length and then calling\n\t * a callback on each passed value.\n\t *\n\t * @param {Array<Any>} vector Array of elements to write.\n\t * @param {WriteVecCb} cb Callback to call on each element of the vector.\n\t * @returns {this}\n\t */\n\twriteVec(vector: any[], cb: (writer: BcsWriter, el: any, i: number, len: number) => void): this {\n\t\tthis.writeULEB(vector.length);\n\t\tArray.from(vector).forEach((el, i) => cb(this, el, i, vector.length));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds support for iterations over the object.\n\t * @returns {Uint8Array}\n\t */\n\t// oxlint-disable-next-line require-yields\n\t*[Symbol.iterator](): Iterator<number, Iterable<number>> {\n\t\tfor (let i = 0; i < this.bytePosition; i++) {\n\t\t\tyield this.dataView.getUint8(i);\n\t\t}\n\t\treturn this.toBytes();\n\t}\n\n\t/**\n\t * Get underlying buffer taking only value bytes (in case initial buffer size was bigger).\n\t * @returns {Uint8Array} Resulting bcs.\n\t */\n\ttoBytes(): Uint8Array<ArrayBuffer> {\n\t\treturn new Uint8Array(this.dataView.buffer.slice(0, this.bytePosition));\n\t}\n\n\t/**\n\t * Represent data as 'hex' or 'base64'\n\t * @param encoding Encoding to use: 'base64' or 'hex'\n\t */\n\ttoString(encoding: Encoding): string {\n\t\treturn encodeStr(this.toBytes(), encoding);\n\t}\n}\n\nfunction toLittleEndian(bigint: bigint, size: number) {\n\tconst result = new Uint8Array(size);\n\tlet i = 0;\n\twhile (bigint > 0) {\n\t\tresult[i] = Number(bigint % BigInt(256));\n\t\tbigint = bigint / BigInt(256);\n\t\ti += 1;\n\t}\n\treturn result;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, toBase58, toBase64, fromHex, toHex } from '@mysten/utils';\nimport { BcsReader } from './reader.js';\nimport { ulebEncode } from './uleb.js';\nimport type { BcsWriterOptions } from './writer.js';\nimport { BcsWriter } from './writer.js';\nimport type { EnumInputShape, EnumOutputShape, JoinString } from './types.js';\n\nexport interface BcsTypeOptions<T, Input = T, Name extends string = string> {\n\tname?: Name;\n\tvalidate?: (value: Input) => void;\n}\n\nexport class BcsType<T, Input = T, const Name extends string = string> {\n\t$inferType!: T;\n\t$inferInput!: Input;\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserializedSize: (value: Input, options?: BcsWriterOptions) => number | null;\n\tvalidate: (value: Input) => void;\n\t#write: (value: Input, writer: BcsWriter) => void;\n\t#serialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\n\tconstructor(\n\t\toptions: {\n\t\t\tname: Name;\n\t\t\tread: (reader: BcsReader) => T;\n\t\t\twrite: (value: Input, writer: BcsWriter) => void;\n\t\t\tserialize?: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\t\t\tserializedSize?: (value: Input) => number | null;\n\t\t\tvalidate?: (value: Input) => void;\n\t\t} & BcsTypeOptions<T, Input, Name>,\n\t) {\n\t\tthis.name = options.name;\n\t\tthis.read = options.read;\n\t\tthis.serializedSize = options.serializedSize ?? (() => null);\n\t\tthis.#write = options.write;\n\t\tthis.#serialize =\n\t\t\toptions.serialize ??\n\t\t\t((value, options) => {\n\t\t\t\tconst writer = new BcsWriter({\n\t\t\t\t\tinitialSize: this.serializedSize(value) ?? undefined,\n\t\t\t\t\t...options,\n\t\t\t\t});\n\t\t\t\tthis.#write(value, writer);\n\t\t\t\treturn writer.toBytes();\n\t\t\t});\n\n\t\tthis.validate = options.validate ?? (() => {});\n\t}\n\n\twrite(value: Input, writer: BcsWriter) {\n\t\tthis.validate(value);\n\t\tthis.#write(value, writer);\n\t}\n\n\tserialize(value: Input, options?: BcsWriterOptions) {\n\t\tthis.validate(value);\n\t\treturn new SerializedBcs(this, this.#serialize(value, options));\n\t}\n\n\tparse(bytes: Uint8Array): T {\n\t\tconst reader = new BcsReader(bytes);\n\t\treturn this.read(reader);\n\t}\n\n\tfromHex(hex: string) {\n\t\treturn this.parse(fromHex(hex));\n\t}\n\n\tfromBase58(b64: string) {\n\t\treturn this.parse(fromBase58(b64));\n\t}\n\n\tfromBase64(b64: string) {\n\t\treturn this.parse(fromBase64(b64));\n\t}\n\n\ttransform<T2 = T, Input2 = Input, NewName extends string = Name>({\n\t\tname,\n\t\tinput,\n\t\toutput,\n\t\tvalidate,\n\t}: {\n\t\tinput?: (val: Input2) => Input;\n\t\toutput?: (value: T) => T2;\n\t} & BcsTypeOptions<T2, Input2, NewName>) {\n\t\treturn new BcsType<T2, Input2, NewName>({\n\t\t\tname: (name ?? this.name) as NewName,\n\t\t\tread: (reader) => (output ? output(this.read(reader)) : (this.read(reader) as never)),\n\t\t\twrite: (value, writer) => this.#write(input ? input(value) : (value as never), writer),\n\t\t\tserializedSize: (value) => this.serializedSize(input ? input(value) : (value as never)),\n\t\t\tserialize: (value, options) =>\n\t\t\t\tthis.#serialize(input ? input(value) : (value as never), options),\n\t\t\tvalidate: (value) => {\n\t\t\t\tvalidate?.(value);\n\t\t\t\tthis.validate(input ? input(value) : (value as never));\n\t\t\t},\n\t\t});\n\t}\n}\n\nconst SERIALIZED_BCS_BRAND = Symbol.for('@mysten/serialized-bcs') as never;\nexport function isSerializedBcs(obj: unknown): obj is SerializedBcs<unknown> {\n\treturn !!obj && typeof obj === 'object' && (obj as any)[SERIALIZED_BCS_BRAND] === true;\n}\n\nexport class SerializedBcs<T, Input = T> {\n\t#schema: BcsType<T, Input>;\n\t#bytes: Uint8Array<ArrayBuffer>;\n\n\t// Used to brand SerializedBcs so that they can be identified, even between multiple copies\n\t// of the @mysten/bcs package are installed\n\tget [SERIALIZED_BCS_BRAND]() {\n\t\treturn true;\n\t}\n\n\tconstructor(schema: BcsType<T, Input>, bytes: Uint8Array<ArrayBuffer>) {\n\t\tthis.#schema = schema;\n\t\tthis.#bytes = bytes;\n\t}\n\n\ttoBytes() {\n\t\treturn this.#bytes;\n\t}\n\n\ttoHex() {\n\t\treturn toHex(this.#bytes);\n\t}\n\n\ttoBase64() {\n\t\treturn toBase64(this.#bytes);\n\t}\n\n\ttoBase58() {\n\t\treturn toBase58(this.#bytes);\n\t}\n\n\tparse() {\n\t\treturn this.#schema.parse(this.#bytes);\n\t}\n}\n\nexport function fixedSizeBcsType<T, Input = T, const Name extends string = string>({\n\tsize,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\tread: (reader: BcsReader) => T;\n\twrite: (value: Input, writer: BcsWriter) => void;\n} & BcsTypeOptions<T, Input, Name>) {\n\treturn new BcsType<T, Input, Name>({\n\t\t...options,\n\t\tserializedSize: () => size,\n\t});\n}\n\nexport function uIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${8 | 16 | 32}`;\n\twriteMethod: `write${8 | 16 | 32}`;\n\tmaxValue: number;\n} & BcsTypeOptions<number, number, Name>) {\n\treturn fixedSizeBcsType<number, number, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](value),\n\t\tvalidate: (value) => {\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function bigUIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${64 | 128 | 256}`;\n\twriteMethod: `write${64 | 128 | 256}`;\n\tmaxValue: bigint;\n} & BcsTypeOptions<string, string | number | bigint>) {\n\treturn fixedSizeBcsType<string, string | number | bigint, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](BigInt(value)),\n\t\tvalidate: (val) => {\n\t\t\tconst value = BigInt(val);\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({\n\tserialize,\n\t...options\n}: {\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n} & BcsTypeOptions<T, Input>) {\n\tconst type = new BcsType<T, Input>({\n\t\t...options,\n\t\tserialize,\n\t\twrite: (value, writer) => {\n\t\t\tfor (const byte of type.serialize(value).toBytes()) {\n\t\t\t\twriter.write8(byte);\n\t\t\t}\n\t\t},\n\t});\n\n\treturn type;\n}\n\nexport function stringLikeBcsType<const Name extends string = string>({\n\ttoBytes,\n\tfromBytes,\n\t...options\n}: {\n\tname: Name;\n\ttoBytes: (value: string) => Uint8Array;\n\tfromBytes: (bytes: Uint8Array) => string;\n\tserializedSize?: (value: string) => number | null;\n} & BcsTypeOptions<string, string, Name>) {\n\treturn new BcsType<string, string, Name>({\n\t\t...options,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst bytes = reader.readBytes(length);\n\n\t\t\treturn fromBytes(bytes);\n\t\t},\n\t\twrite: (hex, writer) => {\n\t\t\tconst bytes = toBytes(hex);\n\t\t\twriter.writeULEB(bytes.length);\n\t\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\t\twriter.write8(bytes[i]);\n\t\t\t}\n\t\t},\n\t\tserialize: (value) => {\n\t\t\tconst bytes = toBytes(value);\n\t\t\tconst size = ulebEncode(bytes.length);\n\t\t\tconst result = new Uint8Array(size.length + bytes.length);\n\t\t\tresult.set(size, 0);\n\t\t\tresult.set(bytes, size.length);\n\n\t\t\treturn result;\n\t\t},\n\t\tvalidate: (value) => {\n\t\t\tif (typeof value !== 'string') {\n\t\t\t\tthrow new TypeError(`Invalid ${options.name} value: ${value}. Expected string`);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function lazyBcsType<T, Input>(cb: () => BcsType<T, Input>) {\n\tlet lazyType: BcsType<T, Input> | null = null;\n\tfunction getType() {\n\t\tif (!lazyType) {\n\t\t\tlazyType = cb();\n\t\t}\n\t\treturn lazyType;\n\t}\n\n\treturn new BcsType<T, Input>({\n\t\tname: 'lazy' as never,\n\t\tread: (data) => getType().read(data),\n\t\tserializedSize: (value) => getType().serializedSize(value),\n\t\twrite: (value, writer) => getType().write(value, writer),\n\t\tserialize: (value, options) => getType().serialize(value, options).toBytes(),\n\t});\n}\n\nexport interface BcsStructOptions<\n\tT extends Record<string, BcsType<any>>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsType<\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t},\n\tName\n> {\n\tconstructor({ name, fields, ...options }: BcsStructOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields);\n\n\t\tsuper({\n\t\t\tname,\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tconst size = type.serializedSize(values[field]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: Record<string, unknown> = {};\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tresult[field] = type.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\ttype.write(value[field], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsEnumOptions<\n\tT extends Record<string, BcsType<any> | null>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\tEnumOutputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t}>,\n\t\tEnumInputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t}>,\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string = string,\n> extends BcsType<\n\tEnumOutputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true;\n\t}>,\n\tEnumInputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t}>,\n\tName\n> {\n\tconstructor({ fields, ...options }: BcsEnumOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields as object);\n\t\tsuper({\n\t\t\tread: (reader) => {\n\t\t\t\tconst index = reader.readULEB();\n\n\t\t\t\tconst enumEntry = canonicalOrder[index];\n\t\t\t\tif (!enumEntry) {\n\t\t\t\t\tthrow new TypeError(`Unknown value ${index} for enum ${options.name}`);\n\t\t\t\t}\n\n\t\t\t\tconst [kind, type] = enumEntry;\n\n\t\t\t\treturn {\n\t\t\t\t\t[kind]: type?.read(reader) ?? true,\n\t\t\t\t\t$kind: kind,\n\t\t\t\t} as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst [name, val] = Object.entries(value).filter(([name]) =>\n\t\t\t\t\tObject.hasOwn(fields, name),\n\t\t\t\t)[0];\n\n\t\t\t\tfor (let i = 0; i < canonicalOrder.length; i++) {\n\t\t\t\t\tconst [optionName, optionType] = canonicalOrder[i];\n\t\t\t\t\tif (optionName === name) {\n\t\t\t\t\t\twriter.writeULEB(i);\n\t\t\t\t\t\toptionType?.write(val, writer);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\n\t\t\t\tconst keys = Object.keys(value).filter(\n\t\t\t\t\t(k) => value[k] !== undefined && Object.hasOwn(fields, k),\n\t\t\t\t);\n\n\t\t\t\tif (keys.length !== 1) {\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`Expected object with one key, but found ${keys.length} for type ${options.name}}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [variant] = keys;\n\n\t\t\t\tif (!Object.hasOwn(fields, variant)) {\n\t\t\t\t\tthrow new TypeError(`Invalid enum variant ${variant}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsTupleOptions<\n\tT extends readonly BcsType<any>[],\n\tName extends string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname?: Name;\n\tfields: T;\n}\n\nexport class BcsTuple<\n\tconst T extends readonly BcsType<any>[],\n\tconst Name extends string =\n\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n> extends BcsType<\n\t{\n\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t},\n\tName\n> {\n\tconstructor({ fields, name, ...options }: BcsTupleOptions<T, Name>) {\n\t\tsuper({\n\t\t\tname: name ?? (`(${fields.map((t) => t.name).join(', ')})` as never),\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tconst size = fields[i].serializedSize(values[i]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: unknown[] = [];\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tresult.push(field.read(reader));\n\t\t\t\t}\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tfields[i].write(value[i], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== fields.length) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${fields.length}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { BcsTypeOptions } from './bcs-type.js';\nimport {\n\tBcsEnum,\n\tBcsStruct,\n\tBcsTuple,\n\tBcsType,\n\tbigUIntBcsType,\n\tdynamicSizeBcsType,\n\tfixedSizeBcsType,\n\tlazyBcsType,\n\tstringLikeBcsType,\n\tuIntBcsType,\n} from './bcs-type.js';\nimport type {\n\tEnumInputShape,\n\tEnumOutputShape,\n\tInferBcsInput,\n\tInferBcsType,\n\tJoinString,\n} from './types.js';\nimport { ulebEncode } from './uleb.js';\n\nfunction fixedArray<T extends BcsType<any>, Name extends string = string>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction fixedArray<T, Input, Name extends string = string>(\n\tsize: number,\n\ttype: BcsType<T, Input>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, Name>,\n): BcsType<T[], Iterable<Input> & { length: number }, Name>;\nfunction fixedArray<T extends BcsType<any>, Name extends string = `${T['name']}[${number}]`>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst result: InferBcsType<T>[] = new Array(size);\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `${type.name}[${size}]`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t\tif (value.length !== size) {\n\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`>;\nfunction option<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n): BcsType<T | null, Input | null | undefined>;\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`> {\n\treturn bcs\n\t\t.enum(`Option<${type.name}>`, {\n\t\t\tNone: null,\n\t\t\tSome: type,\n\t\t})\n\t\t.transform({\n\t\t\tinput: (value: InferBcsInput<T> | null | undefined) => {\n\t\t\t\tif (value == null) {\n\t\t\t\t\treturn { None: true };\n\t\t\t\t}\n\n\t\t\t\treturn { Some: value };\n\t\t\t},\n\t\t\toutput: (value) => {\n\t\t\t\tif (value.$kind === 'Some') {\n\t\t\t\t\treturn value.Some as InferBcsType<T>;\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t});\n}\n\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction vector<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>,\n): BcsType<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>;\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result: InferBcsType<T>[] = new Array(length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\twriter.writeULEB(value.length);\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `vector<${type.name}>`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * Compares two byte arrays using lexicographic ordering.\n * This matches Rust's Ord implementation for Vec<u8>/[u8] which is used for BTreeMap key ordering.\n * Comparison is done byte-by-byte first, then by length if all compared bytes are equal.\n */\nexport function compareBcsBytes(a: Uint8Array, b: Uint8Array): number {\n\tfor (let i = 0; i < Math.min(a.length, b.length); i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn a[i] - b[i];\n\t\t}\n\t}\n\n\treturn a.length - b.length;\n}\n\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n>;\nfunction map<K, V, InputK = K, InputV = V>(\n\tkeyType: BcsType<K, InputK>,\n\tvalueType: BcsType<V, InputV>,\n): BcsType<Map<K, V>, Map<InputK, InputV>, `Map<${string}, ${string}>`>;\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n> {\n\treturn new BcsType({\n\t\tname: `Map<${keyType.name}, ${valueType.name}>`,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result = new Map<InferBcsType<K>, InferBcsType<V>>();\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult.set(keyType.read(reader), valueType.read(reader));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tconst entries = [...value.entries()].map(\n\t\t\t\t([key, val]) => [keyType.serialize(key).toBytes(), val] as const,\n\t\t\t);\n\t\t\tentries.sort(([a], [b]) => compareBcsBytes(a, b));\n\n\t\t\twriter.writeULEB(entries.length);\n\t\t\tfor (const [keyBytes, val] of entries) {\n\t\t\t\twriter.writeBytes(keyBytes);\n\t\t\t\tvalueType.write(val, writer);\n\t\t\t}\n\t\t},\n\t});\n}\n\nexport const bcs = {\n\t/**\n\t * Creates a BcsType that can be used to read and write an 8-bit unsigned integer.\n\t * @example\n\t * bcs.u8().serialize(255).toBytes() // Uint8Array [ 255 ]\n\t */\n\tu8(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read8',\n\t\t\twriteMethod: 'write8',\n\t\t\tsize: 1,\n\t\t\tmaxValue: 2 ** 8 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u8') as 'u8',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 16-bit unsigned integer.\n\t * @example\n\t * bcs.u16().serialize(65535).toBytes() // Uint8Array [ 255, 255 ]\n\t */\n\tu16(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read16',\n\t\t\twriteMethod: 'write16',\n\t\t\tsize: 2,\n\t\t\tmaxValue: 2 ** 16 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u16') as 'u16',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 32-bit unsigned integer.\n\t * @example\n\t * bcs.u32().serialize(4294967295).toBytes() // Uint8Array [ 255, 255, 255, 255 ]\n\t */\n\tu32(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read32',\n\t\t\twriteMethod: 'write32',\n\t\t\tsize: 4,\n\t\t\tmaxValue: 2 ** 32 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u32') as 'u32',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 64-bit unsigned integer.\n\t * @example\n\t * bcs.u64().serialize(1).toBytes() // Uint8Array [ 1, 0, 0, 0, 0, 0, 0, 0 ]\n\t */\n\tu64(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read64',\n\t\t\twriteMethod: 'write64',\n\t\t\tsize: 8,\n\t\t\tmaxValue: 2n ** 64n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u64') as 'u64',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 128-bit unsigned integer.\n\t * @example\n\t * bcs.u128().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu128(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read128',\n\t\t\twriteMethod: 'write128',\n\t\t\tsize: 16,\n\t\t\tmaxValue: 2n ** 128n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u128') as 'u128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 256-bit unsigned integer.\n\t * @example\n\t * bcs.u256().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu256(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read256',\n\t\t\twriteMethod: 'write256',\n\t\t\tsize: 32,\n\t\t\tmaxValue: 2n ** 256n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u256') as 'u256',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write boolean values.\n\t * @example\n\t * bcs.bool().serialize(true).toBytes() // Uint8Array [ 1 ]\n\t */\n\tbool(options?: BcsTypeOptions<boolean>) {\n\t\treturn fixedSizeBcsType({\n\t\t\tsize: 1,\n\t\t\tread: (reader) => reader.read8() === 1,\n\t\t\twrite: (value, writer) => writer.write8(value ? 1 : 0),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'bool') as 'bool',\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'boolean') {\n\t\t\t\t\tthrow new TypeError(`Expected boolean, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write unsigned LEB encoded integers\n\t * @example\n\t *\n\t */\n\tuleb128(options?: BcsTypeOptions<number>) {\n\t\treturn dynamicSizeBcsType({\n\t\t\tread: (reader) => reader.readULEB(),\n\t\t\tserialize: (value) => {\n\t\t\t\treturn Uint8Array.from(ulebEncode(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'uleb128') as 'uleb128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a fixed length byte array\n\t * @param size The number of bytes this types represents\n\t * @example\n\t * bcs.bytes(3).serialize(new Uint8Array([1, 2, 3])).toBytes() // Uint8Array [1, 2, 3]\n\t */\n\tbytes<T extends number>(size: T, options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn fixedSizeBcsType<Uint8Array, Iterable<number>, `bytes[${T}]`>({\n\t\t\tsize,\n\t\t\tread: (reader) => reader.readBytes(size),\n\t\t\twrite: (value, writer) => {\n\t\t\t\twriter.writeBytes(new Uint8Array(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? `bytes[${size}]`) as `bytes[${T}]`,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== size) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a variable length byte array\n\t *\n\t * @example\n\t * bcs.byteVector().serialize([1, 2, 3]).toBytes() // Uint8Array [3, 1, 2, 3]\n\t */\n\tbyteVector(options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn new BcsType<Uint8Array, Iterable<number>, 'vector<u8>'>({\n\t\t\tread: (reader) => {\n\t\t\t\tconst length = reader.readULEB();\n\n\t\t\t\treturn reader.readBytes(length);\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst array = new Uint8Array(value);\n\t\t\t\twriter.writeULEB(array.length);\n\t\t\t\twriter.writeBytes(array);\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'vector<u8>') as 'vector<u8>',\n\t\t\tserializedSize: (value) => {\n\t\t\t\tconst length = 'length' in value ? (value.length as number) : null;\n\t\t\t\treturn length == null ? null : ulebEncode(length).length + length;\n\t\t\t},\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can ser/de string values. Strings will be UTF-8 encoded\n\t * @example\n\t * bcs.string().serialize('a').toBytes() // Uint8Array [ 1, 97 ]\n\t */\n\tstring(options?: BcsTypeOptions<string>) {\n\t\treturn stringLikeBcsType({\n\t\t\ttoBytes: (value) => new TextEncoder().encode(value),\n\t\t\tfromBytes: (bytes) => new TextDecoder().decode(bytes),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'string') as 'string',\n\t\t});\n\t},\n\t/**\n\t * Creates a BcsType that represents a fixed length array of a given type\n\t * @param size The number of elements in the array\n\t * @param type The BcsType of each element in the array\n\t * @example\n\t * bcs.fixedArray(3, bcs.u8()).serialize([1, 2, 3]).toBytes() // Uint8Array [ 1, 2, 3 ]\n\t */\n\tfixedArray,\n\n\t/**\n\t * Creates a BcsType representing an optional value\n\t * @param type The BcsType of the optional value\n\t * @example\n\t * bcs.option(bcs.u8()).serialize(null).toBytes() // Uint8Array [ 0 ]\n\t * bcs.option(bcs.u8()).serialize(1).toBytes() // Uint8Array [ 1, 1 ]\n\t */\n\toption,\n\n\t/**\n\t * Creates a BcsType representing a variable length vector of a given type\n\t * @param type The BcsType of each element in the vector\n\t *\n\t * @example\n\t * bcs.vector(bcs.u8()).toBytes([1, 2, 3]) // Uint8Array [ 3, 1, 2, 3 ]\n\t */\n\tvector,\n\n\t/**\n\t * Creates a BcsType representing a tuple of a given set of types\n\t * @param types The BcsTypes for each element in the tuple\n\t *\n\t * @example\n\t * const tuple = bcs.tuple([bcs.u8(), bcs.string(), bcs.bool()])\n\t * tuple.serialize([1, 'a', true]).toBytes() // Uint8Array [ 1, 1, 97, 1 ]\n\t */\n\ttuple<\n\t\tconst T extends readonly BcsType<any, any>[],\n\t\tconst Name extends string =\n\t\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n\t>(\n\t\tfields: T,\n\t\toptions?: BcsTypeOptions<\n\t\t\t{\n\t\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t\t},\n\t\t\t{\n\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t\t},\n\t\t\tName\n\t\t>,\n\t) {\n\t\treturn new BcsTuple<T, Name>({\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a struct of a given set of fields\n\t * @param name The name of the struct\n\t * @param fields The fields of the struct. The order of the fields affects how data is serialized and deserialized\n\t *\n\t * @example\n\t * const struct = bcs.struct('MyStruct', {\n\t * a: bcs.u8(),\n\t * b: bcs.string(),\n\t * })\n\t * struct.serialize({ a: 1, b: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t */\n\tstruct<T extends Record<string, BcsType<any>>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t\t\t}\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsStruct<T>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing an enum of a given set of options\n\t * @param name The name of the enum\n\t * @param values The values of the enum. The order of the values affects how data is serialized and deserialized.\n\t * null can be used to represent a variant with no data.\n\t *\n\t * @example\n\t * const enum = bcs.enum('MyEnum', {\n\t * A: bcs.u8(),\n\t * B: bcs.string(),\n\t * C: null,\n\t * })\n\t * enum.serialize({ A: 1 }).toBytes() // Uint8Array [ 0, 1 ]\n\t * enum.serialize({ B: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t * enum.serialize({ C: true }).toBytes() // Uint8Array [ 2 ]\n\t */\n\tenum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\tEnumOutputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t\t\t}>,\n\t\t\t\tEnumInputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t\t\t}>,\n\t\t\t\tName\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsEnum<T, Name>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a map of a given key and value type\n\t * @param keyType The BcsType of the key\n\t * @param valueType The BcsType of the value\n\t * @example\n\t * const map = bcs.map(bcs.u8(), bcs.string())\n\t * map.serialize(new Map([[2, 'a']])).toBytes() // Uint8Array [ 1, 2, 1, 97 ]\n\t */\n\tmap,\n\n\t/**\n\t * Creates a BcsType that wraps another BcsType which is lazily evaluated. This is useful for creating recursive types.\n\t * @param cb A callback that returns the BcsType\n\t */\n\tlazy<T extends BcsType<any>>(cb: () => T): T {\n\t\treturn lazyBcsType(cb) as T;\n\t},\n};\n","/*\r\n * bignumber.js v9.1.2\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2022 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;\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","/**\n * BCS (Binary Canonical Serialization) Schemas for Lending Protocol\n *\n * This module defines the BCS schemas for serializing and deserializing\n * lending protocol data structures. BCS is used for efficient binary\n * encoding of complex data types for blockchain transactions and storage.\n */\n\nimport { bcs, fromHex, toHex } from '@mysten/bcs'\n\n/**\n * BCS schema for Sui addresses with hex transformation\n * Converts between hex string representation and byte arrays\n */\nexport const Address = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n})\n\n/**\n * BCS schema for incentive APY information\n * Contains asset ID, APY value, and supported coin types\n */\nexport const IncentiveAPYInfo = bcs.struct('IncentiveAPYInfo', {\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** Annual Percentage Yield as a 256-bit integer */\n apy: bcs.u256(),\n /** List of supported coin types for this incentive */\n coin_types: bcs.vector(bcs.string())\n})\n\n/**\n * BCS schema for incentive pool information\n * Contains comprehensive details about a lending incentive pool\n */\nexport const IncentivePoolInfo = bcs.struct('IncentivePoolInfo', {\n /** Unique pool identifier */\n pool_id: Address,\n /** Address holding the incentive funds */\n funds: Address,\n /** Current phase of the incentive program */\n phase: bcs.u64(),\n /** Timestamp when the incentive started */\n start_at: bcs.u64(),\n /** Timestamp when the incentive ends */\n end_at: bcs.u64(),\n /** Timestamp when the incentive was closed */\n closed_at: bcs.u64(),\n /** Total supply of incentive tokens */\n total_supply: bcs.u64(),\n /** Asset identifier for the incentive */\n asset_id: bcs.u8(),\n /** Option type for the incentive */\n option: bcs.u8(),\n /** Factor used in incentive calculations */\n factor: bcs.u256(),\n /** Amount of incentives already distributed */\n distributed: bcs.u64(),\n /** Amount of incentives currently available */\n available: bcs.u256(),\n /** Total amount of incentives */\n total: bcs.u256()\n})\n\n/**\n * BCS schema for incentive pool information grouped by phase\n * Contains phase number and list of pools in that phase\n */\nexport const IncentivePoolInfoByPhase = bcs.struct('IncentivePoolInfoByPhase', {\n /** Phase number */\n phase: bcs.u64(),\n /** List of incentive pools in this phase */\n pools: bcs.vector(IncentivePoolInfo)\n})\n\n/**\n * BCS schema for oracle price information\n * Contains price data from external price feeds\n */\nexport const OracleInfo = bcs.struct('OracleInfo', {\n /** Oracle identifier */\n oracle_id: bcs.u8(),\n /** Current price as a 256-bit integer */\n price: bcs.u256(),\n /** Number of decimal places for the price */\n decimals: bcs.u8(),\n /** Whether the oracle data is valid */\n valid: bcs.bool()\n})\n\n/**\n * BCS schema for flash loan asset configuration\n * Contains parameters for flash loan functionality\n */\nexport const FlashLoanAssetConfig = bcs.struct('FlashLoanAssetConfig', {\n /** Unique identifier for the flash loan asset */\n id: bcs.string(),\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** Coin type for the asset */\n coin_type: bcs.string(),\n /** Pool identifier for the flash loan */\n pool_id: bcs.string(),\n /** Rate paid to suppliers for flash loans */\n rate_to_supplier: bcs.u64(),\n /** Rate paid to treasury for flash loans */\n rate_to_treasury: bcs.u64(),\n /** Maximum flash loan amount */\n max: bcs.u64(),\n /** Minimum flash loan amount */\n min: bcs.u64()\n})\n\n/**\n * BCS schema for reserve data information\n * Contains comprehensive details about a lending reserve\n */\nexport const ReserveDataInfo = bcs.struct('ReserveDataInfo', {\n /** Reserve identifier */\n id: bcs.u8(),\n /** Oracle identifier for price feeds */\n oracle_id: bcs.u8(),\n /** Coin type for the reserve */\n coin_type: bcs.string(),\n /** Maximum supply capacity */\n supply_cap: bcs.u256(),\n /** Maximum borrow capacity */\n borrow_cap: bcs.u256(),\n /** Current supply interest rate */\n supply_rate: bcs.u256(),\n /** Current borrow interest rate */\n borrow_rate: bcs.u256(),\n /** Current supply index for interest calculation */\n supply_index: bcs.u256(),\n /** Current borrow index for interest calculation */\n borrow_index: bcs.u256(),\n /** Total amount supplied to the reserve */\n total_supply: bcs.u256(),\n /** Total amount borrowed from the reserve */\n total_borrow: bcs.u256(),\n /** Timestamp of last update */\n last_update_at: bcs.u64(),\n /** Loan-to-Value ratio for collateral */\n ltv: bcs.u256(),\n /** Treasury factor for fee calculations */\n treasury_factor: bcs.u256(),\n /** Current treasury balance */\n treasury_balance: bcs.u256(),\n /** Base interest rate */\n base_rate: bcs.u256(),\n /** Interest rate multiplier */\n multiplier: bcs.u256(),\n /** Jump rate multiplier for high utilization */\n jump_rate_multiplier: bcs.u256(),\n /** Reserve factor for protocol fees */\n reserve_factor: bcs.u256(),\n /** Optimal utilization rate */\n optimal_utilization: bcs.u256(),\n /** Liquidation ratio threshold */\n liquidation_ratio: bcs.u256(),\n /** Liquidation bonus for liquidators */\n liquidation_bonus: bcs.u256(),\n /** Liquidation threshold */\n liquidation_threshold: bcs.u256()\n})\n\n/**\n * BCS schema for user state information\n * Contains user's borrowing and supplying balances for an asset\n */\nexport const UserStateInfo = bcs.struct('UserStateInfo', {\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** User's current borrow balance */\n borrow_balance: bcs.u256(),\n /** User's current supply balance */\n supply_balance: bcs.u256()\n})\n","import packageJson from '../package.json'\n\nconst sdkVersion = packageJson.version\n\nconst getNodeInfo = (): string => {\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n try {\n const os = require('os')\n const nodeVersion: string = process.version\n const osType: string = os.type()\n const osArch: string = os.arch()\n\n const formattedNodeVersion: string = nodeVersion.startsWith('v')\n ? nodeVersion.substring(1)\n : nodeVersion\n\n return `Node.js ${formattedNodeVersion}; ${osType}/${osArch}`\n } catch (e) {\n return `Node.js ${process.version}; OS/Unknown (Error)`\n }\n }\n return 'Node/Unknown'\n}\n\nexport const getUserAgent = (): string => {\n let environmentInfo: string = ''\n\n const isNode = typeof process !== 'undefined' && process.versions && process.versions.node\n\n if (isNode) {\n environmentInfo = `lending/${sdkVersion} (${getNodeInfo()})`\n }\n\n return environmentInfo\n}\n\nexport const userAgent = getUserAgent()\n","/**\n * Lending Utilities\n *\n * This module provides utility functions for the lending protocol, including\n * caching mechanisms, data transformation, transaction parsing, and blockchain\n * interaction helpers.\n *\n * @module LendingUtils\n */\n\nimport type { CacheOption, EMode, EModeIdentity, EModePool, Pool, TransactionResult } from './types'\nimport type { DevInspectResults } from '@mysten/sui/client'\nimport { SuiClient, getFullnodeUrl } from '@mysten/sui/client'\nimport camelCase from 'lodash.camelcase'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { BcsType } from '@mysten/sui/bcs'\nimport { normalizeStructTag } from '@mysten/sui/utils'\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js'\nimport BigNumber from 'bignumber.js'\nimport { userAgent } from './ua'\n\n/**\n * Default Sui client instance configured for mainnet\n */\nexport const suiClient = new SuiClient({\n url: getFullnodeUrl('mainnet')\n})\n\n/**\n * Generates a cache key from function arguments\n *\n * This function creates a unique key for caching by serializing the arguments\n * and removing cache-specific options that shouldn't affect the cache key.\n *\n * @param args - Function arguments to generate key from\n * @returns JSON string representing the arguments\n */\nfunction argsKey(args: any[]) {\n const serializergs = [] as any[]\n args.forEach((option: any, index) => {\n const isLast = index === args.length - 1\n if (typeof option === 'object' && option !== null && isLast) {\n const { client, disableCache, cacheTime, ...rest } = option\n serializergs.push(rest)\n } else {\n serializergs.push(option)\n }\n })\n return JSON.stringify(serializergs)\n}\n\n/**\n * Wraps a function with singleton behavior to prevent duplicate concurrent calls\n *\n * This decorator ensures that if the same function is called with the same arguments\n * while a previous call is still pending, it returns the existing promise instead\n * of making a new call.\n *\n * @param fn - Function to wrap with singleton behavior\n * @returns Wrapped function with singleton behavior\n */\nexport function withSingleton<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n const promiseMap: Record<string, Promise<any> | null> = {}\n\n return ((...args: any[]) => {\n const key = argsKey(args)\n if (promiseMap[key]) {\n return promiseMap[key]\n }\n promiseMap[key] = fn(...args).finally(() => {\n delete promiseMap[key]\n })\n return promiseMap[key]\n }) as T\n}\n\n/**\n * Wraps a function with caching behavior\n *\n * This decorator caches function results based on arguments and cache options.\n * It respects cache time settings and can be disabled per call.\n *\n * @param fn - Function to wrap with caching behavior\n * @returns Wrapped function with caching behavior\n */\nexport function withCache<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n let cache: Record<\n string,\n {\n data: undefined\n cacheAt: number\n }\n > = {}\n\n return ((...args: any[]) => {\n const options = args[args.length - 1] as Partial<CacheOption>\n const key = argsKey(args)\n const cacheData = cache[key]\n\n // Check if cache is valid and not disabled\n if (!options?.disableCache && typeof cacheData?.data !== 'undefined') {\n if (\n typeof options?.cacheTime === 'undefined' ||\n options.cacheTime > Date.now() - cacheData.cacheAt\n ) {\n return cacheData.data\n }\n }\n\n // Execute function and cache result\n return fn(...args).then((result) => {\n cache[key] = {\n data: result,\n cacheAt: Date.now()\n }\n return result\n })\n }) as T\n}\n\n/**\n * Converts object keys from snake_case to camelCase recursively\n *\n * This function transforms all keys in an object (including nested objects and arrays)\n * from snake_case format to camelCase format.\n *\n * @param obj - Object to transform\n * @returns Object with camelCase keys\n */\nexport function camelize<T extends Record<string, any>>(obj: T): T {\n if (Array.isArray(obj)) {\n return obj.map((v) => camelize(v)) as unknown as T\n } else if (obj != null && typeof obj === 'object') {\n return Object.keys(obj).reduce(\n (result, key) => ({\n ...result,\n [camelCase(key)]: camelize(obj[key])\n }),\n {} as T\n )\n }\n return obj\n}\n\n/**\n * Parses a value for use in transaction building\n *\n * This function converts various value types into the appropriate format\n * for transaction building, handling both primitive types and existing\n * transaction results.\n *\n * @param value - Value to parse (string, number, boolean, or object)\n * @param format - Format function to apply to the value\n * @returns Transaction result in the appropriate format\n */\nexport function parseTxValue(\n value: string | number | boolean | object,\n format: any\n): TransactionResult {\n if (typeof value === 'object') {\n return value as TransactionResult\n }\n return format(value) as TransactionResult\n}\n\n/**\n * Parses a pool value for use in transaction building\n *\n * This function handles different pool representations and converts them\n * to the appropriate transaction object format.\n *\n * @param tx - Transaction object to build\n * @param value - Pool value (string, Pool object, or TransactionResult)\n * @returns Transaction result representing the pool\n */\nexport function parseTxPoolValue(tx: Transaction, value: string | Pool | TransactionResult) {\n if (typeof value === 'string') {\n return tx.object(value)\n }\n if (typeof value === 'object' && (value as TransactionResult).$kind) {\n return value as TransactionResult\n }\n return tx.object((value as Pool).contract.pool)\n}\n\n/**\n * Parses the result of a devInspectTransactionBlock call\n *\n * This function extracts and parses return values from transaction inspection\n * results using BCS (Binary Canonical Serialization) types.\n *\n * @param data - DevInspectResults from transaction inspection\n * @param parseTypes - Array of BCS types to parse the return values\n * @param options - Optional configuration including error handling\n * @returns Parsed result data\n */\nexport function parseDevInspectResult<T>(\n data: DevInspectResults,\n parseTypes: BcsType<any>[],\n options?: {\n throwError?: boolean\n }\n): T {\n if (data.results && data.results.length > 0) {\n if (data.results[0].returnValues && data.results[0].returnValues.length > 0) {\n return data.results[0].returnValues.map((item, index) => {\n const parseType = parseTypes[index] || parseTypes[0]\n return parseType.parse(Uint8Array.from(item[0]))\n }) as T\n }\n } else if (data.error) {\n console.log(`Get an error, msg: ${data.error}`)\n if (options?.throwError) {\n throw new Error(data.error)\n }\n return [] as T\n }\n return [] as T\n}\n\n/**\n * Normalizes a coin type string using Sui's struct tag normalization\n *\n * @param coinType - Coin type string to normalize\n * @returns Normalized coin type string\n */\nexport function normalizeCoinType(coinType: string) {\n return normalizeStructTag(coinType)\n}\n\n/**\n * Processes health factor values from contract format to human-readable format\n *\n * This function converts the raw health factor value from the contract\n * (which is typically a large integer) to a more readable decimal format.\n *\n * @param hf - Raw health factor value from contract\n * @returns Processed health factor value\n */\nexport function processContractHealthFactor(hf: number) {\n const healthFactor = (hf || 0) / Math.pow(10, 27)\n if (healthFactor > Math.pow(10, 5)) {\n return Infinity\n }\n return healthFactor\n}\n\n/**\n * Pyth price service connection for oracle price feeds\n *\n * This connection is used to fetch real-time price data from the Pyth network\n * for various assets in the lending protocol.\n */\nexport const suiPythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 20000\n})\n\nexport const Rate_Decimals = 27\n\nexport const rayMathMulIndex = (amount: string | number, index: string | number) => {\n if (!Number(amount) || !Number(index)) return new BigNumber(0)\n const ray = new BigNumber(1).shiftedBy(1 * Rate_Decimals)\n const halfRay = ray.multipliedBy(new BigNumber(0.5))\n return new BigNumber(amount)\n .multipliedBy(new BigNumber(index))\n .plus(halfRay)\n .dividedBy(ray)\n .integerValue(BigNumber.ROUND_DOWN)\n}\n\nexport const requestHeaders = !!userAgent\n ? {\n 'User-Agent': userAgent\n }\n : ({} as HeadersInit)\n\nexport function getPoolsMap(pools: Pool[], key: 'uniqueId' | 'id' = 'uniqueId') {\n return pools.reduce(\n (acc, pool) => {\n acc[pool[key]] = pool\n return acc\n },\n {} as Record<string, Pool>\n )\n}\n\nexport function getEmodesMap(emodes: EMode[], key: 'uniqueId' | 'emodeId' = 'uniqueId') {\n return emodes.reduce(\n (acc, emode) => {\n acc[emode[key]] = emode\n return acc\n },\n {} as Record<string, EMode>\n )\n}\n\nexport function poolToEModePool(pool: Pool, emodeIdentity: EModeIdentity): EModePool {\n const emode = pool.emodes.find((emode) => emode.emodeId === emodeIdentity.emodeId)\n if (!emode) {\n throw new Error('EMode not found in pool')\n }\n const emodeAsset = emode.assets.find((asset) => asset.assetId === pool.id)!\n return {\n ...pool,\n emode: {\n ...emodeAsset,\n emodeId: emode.emodeId\n },\n isEMode: true\n }\n}\n\nexport function parsePoolUID(uid: string) {\n const [marketKey, poolId] = uid.split('-')\n if (!marketKey || !poolId) {\n return null\n }\n return {\n marketKey: marketKey,\n poolId: parseInt(poolId)\n }\n}\n\nexport function uuid() {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)\n}\n","/**\n * Lending Pool Operations\n *\n * This module provides comprehensive pool management functionality for the lending protocol.\n * It handles pool information retrieval, deposit/withdraw operations, borrow/repay operations,\n * and various pool-related utilities and statistics.\n *\n * @module LendingPool\n */\n\nimport { DEFAULT_CACHE_TIME, getConfig } from './config'\nimport type {\n EnvOption,\n CacheOption,\n Pool,\n AssetIdentifier,\n PoolStats,\n FeeDetail,\n CoinObject,\n TransactionResult,\n AccountCapOption,\n BorrowFeeOption,\n SuiClientOption,\n MarketOption,\n EMode,\n MarketsOption\n} from './types'\nimport {\n normalizeCoinType,\n withCache,\n withSingleton,\n parseTxValue,\n suiClient,\n requestHeaders,\n parsePoolUID\n} from './utils'\nimport { Transaction } from '@mysten/sui/transactions'\nimport BigNumber from 'bignumber.js'\nimport { parseDevInspectResult } from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\n\n/**\n * Enumeration of pool operations\n *\n * This enum defines the different types of operations that can be performed\n * on lending pools, used for health factor calculations and operation tracking.\n */\nexport enum PoolOperator {\n /** Supply/deposit operation */\n Supply = 1,\n /** Withdraw operation */\n Withdraw = 2,\n /** Borrow operation */\n Borrow = 3,\n /** Repay operation */\n Repay = 4\n}\n\n/**\n * Fetches all available lending pools\n *\n * This function retrieves the complete list of lending pools from the Navi protocol API.\n * It's wrapped with caching and singleton behavior for efficient data access.\n *\n * @param options - Optional environment and caching options\n * @returns Promise<Pool[]> - Array of all available lending pools\n */\nexport const getPools = withCache(\n withSingleton(\n async (options?: Partial<EnvOption & CacheOption & MarketsOption>): Promise<Pool[]> => {\n const markets = (options?.markets || [MARKETS.main]).map((identity) => {\n return getMarketConfig(identity)\n })\n const url = `https://open-api.naviprotocol.io/api/navi/pools?env=${options?.env || 'prod'}&sdk=${packageJson.version}&market=${markets.map(\n (market) => {\n return market.key\n }\n )}`\n const res: {\n data: Pool[]\n meta: {\n emodes: EMode[]\n }\n } = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n\n res.data.forEach((pool) => {\n const filterEmodes = res.meta.emodes.filter((emode) => {\n const market = getMarketConfig(emode.marketId)\n return pool.market === market.key && emode.isActive\n })\n const emodes = filterEmodes.filter((emode) => {\n return !!emode.assets.find((asset) => asset.assetId === pool.id)\n })\n pool.emodes = emodes\n const poolSupplyAmount = BigNumber(pool.totalSupplyAmount)\n .div(Math.pow(10, 9))\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowAmount = BigNumber(pool.borrowedAmount)\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyValue = BigNumber(poolSupplyAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowValue = BigNumber(poolBorrowAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolSupplyCapAmount = BigNumber(pool.supplyCapCeiling)\n .shiftedBy(-27)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowCapAmount = BigNumber.max(\n BigNumber(pool.borrowedAmount),\n BigNumber(pool.validBorrowAmount)\n )\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyCapValue = BigNumber(poolSupplyCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowCapValue = BigNumber(poolBorrowCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n pool.poolSupplyAmount = poolSupplyAmount\n pool.poolBorrowAmount = poolBorrowAmount\n pool.poolSupplyValue = poolSupplyValue\n pool.poolBorrowValue = poolBorrowValue\n pool.poolSupplyCapAmount = poolSupplyCapAmount\n pool.poolBorrowCapAmount = poolBorrowCapAmount\n pool.poolSupplyCapValue = poolSupplyCapValue\n pool.poolBorrowCapValue = poolBorrowCapValue\n })\n return res.data\n }\n )\n)\n\n/**\n * Gets information for a specific lending pool\n *\n * This function retrieves pool information based on various identifier types:\n * - Pool object (returns directly)\n * - String (coin type - normalized for comparison)\n * - Number (pool ID)\n *\n * @param identifier - Asset identifier (string, Pool object, or number)\n * @param options - Optional environment options\n * @returns Promise<Pool> - Pool information\n * @throws Error if pool is not found\n */\nexport async function getPool(\n identifier: AssetIdentifier,\n options?: Partial<EnvOption & MarketOption>\n): Promise<Pool> {\n let market = options?.market\n if (typeof identifier === 'string') {\n const parsedUID = parsePoolUID(identifier)\n if (parsedUID) {\n market = parsedUID.marketKey\n identifier = parsedUID.poolId\n }\n }\n const pools = await getPools({\n ...options,\n markets: [market || DEFAULT_MARKET_IDENTITY],\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // If identifier is already a pool object, return it directly\n if (typeof identifier === 'object') {\n return identifier\n }\n\n // Find pool by identifier\n const pool = pools.find((p) => {\n if (typeof identifier === 'string') {\n return normalizeCoinType(p.suiCoinType) === normalizeCoinType(identifier)\n }\n if (typeof identifier === 'number') {\n return p.id === identifier\n }\n return false\n })\n\n if (!pool) {\n throw new Error(`Pool not found`)\n }\n\n if (pool.isDeprecated) {\n console.log(`The lending pool for coinType ${pool.suiCoinType} is going to be deprecated.`)\n }\n return pool\n}\n\n/**\n * Fetches protocol statistics\n *\n * This function retrieves overall protocol statistics including TVL,\n * total borrow amounts, and other key metrics.\n *\n * @param options - Optional caching options\n * @returns Promise<PoolStats> - Protocol statistics\n */\nexport const getStats = withCache(\n withSingleton(async (options?: Partial<CacheOption>): Promise<PoolStats> => {\n const url = `https://open-api.naviprotocol.io/api/navi/stats?sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n })\n)\n\n/**\n * Fetches protocol fee information\n *\n * This function retrieves detailed fee information including:\n * - Total fee value\n * - V3 borrow fees\n * - Borrow interest fees\n * - Flash loan and liquidation fees\n *\n * @param options - Optional caching options\n * @returns Promise with detailed fee breakdown\n */\nexport const getFees = withCache(\n withSingleton(\n async (\n options?: Partial<CacheOption>\n ): Promise<{\n totalValue: number\n v3BorrowFee: {\n totalValue: number\n details: FeeDetail[]\n }\n borrowInterestFee: {\n totalValue: number\n details: FeeDetail[]\n }\n flashloanAndLiquidationFee: {\n totalValue: number\n details: FeeDetail[]\n }\n }> => {\n const url = `https://open-api.naviprotocol.io/api/navi/fee?sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res\n }\n )\n)\n\n/**\n * Builds a deposit transaction for a lending pool\n *\n * This function creates a transaction block for depositing coins into a lending pool.\n * It handles both regular deposits and deposits with account capabilities,\n * and includes special handling for SUI gas coins.\n *\n * @param tx - Transaction object to build\n * @param identifier - Asset identifier for the pool\n * @param coinObject - Coin object to deposit\n * @param options - Optional parameters including environment, account capability, and amount\n * @returns Promise<Transaction> - Transaction with deposit operation\n */\nexport async function depositCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n const isGasCoin = typeof coinObject === 'object' && coinObject.$kind === 'GasCoin'\n\n // Handle SUI gas coin deposits\n if (normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') && isGasCoin) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n // Determine deposit amount\n let depositAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n depositAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n depositAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // Build deposit transaction based on account capability\n if (options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::incentive_v3::deposit_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n depositAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // refresh stake for sui pool to balance the stake after deposit\n if (config.version === 2 && pool.id === 0 && (!options?.env || options?.env === 'prod')) {\n tx.moveCall({\n target: `${config.package}::pool::refresh_stake`,\n arguments: [tx.object(pool.contract.pool), tx.object('0x05')]\n })\n }\n\n return tx\n}\n\n/**\n * Builds a withdraw transaction for a lending pool\n *\n * Constructs and adds withdrawal operations to a transaction object.\n * This function supports standard withdrawal and withdrawal using account capability.\n *\n * @param tx - The transaction builder to append operations to\n * @param identifier - Asset identifier for the pool\n * @param amount - Amount to withdraw\n * @param options - Optional parameters including environment and account capability\n * @returns Transaction result representing the withdrawn coins\n */\nexport async function withdrawCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n const withdrawAmount = parseTxValue(amount, tx.pure.u64)\n\n let withdrawBalance\n\n if (config.version === 1) {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n } else {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n }\n\n const withdrawCoin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [withdrawBalance],\n typeArguments: [pool.suiCoinType]\n })\n\n return withdrawCoin\n}\n\nexport async function borrowCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n const borrowAmount = parseTxValue(amount, tx.pure.u64)\n\n let borrowBalance\n\n if (config.version === 1) {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n } else {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n }\n\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [tx.object(borrowBalance)],\n typeArguments: [pool.suiCoinType]\n })\n\n return coin\n}\n\n/**\n * Builds a repay transaction for a lending pool debt\n *\n * Constructs and adds repayment operations to an existing transaction object.\n * This function handles loan repayments, supporting both standard user\n * repayments and privileged operations via account capabilities.\n *\n *\n * @param tx - The transaction builder to append repayment operations to\n * @param identifier - Unique identifier for the lending pool asset (e.g., \"USDC\", \"SUI\")\n * @param coinObject - The coin object to use for repayment, or GasCoin for SUI payments\n * @param options - Configuration options for the repayment\n * - `amount` - Specific amount to repay (required for SUI gas coin, otherwise uses value of specified coinObject)\n * - `accountCap` - Optional account capability object for privileged repayments\n * - `env` - Environment configuration\n * - `cacheTime` - Cache duration for configuration data\n *\n * @returns Promise<Transaction | TransactionResult> - The modified transaction object with repayment operations added\n *\n * @throws {Error} When amount is not provided for SUI gas coin repayments\n * @throws Will throw if pool doesn't exist or repayment validation fails\n */\nexport async function repayCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction | TransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n const isGasCoin = typeof coinObject === 'object' && coinObject.$kind === 'GasCoin'\n\n if (normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') && isGasCoin) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n let repayAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n repayAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n repayAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::repay_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [ret],\n typeArguments: [pool.suiCoinType]\n })\n return coin\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n repayAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n return tx\n }\n}\n\n/**\n * Fetches the current borrow fee rate\n *\n * This function can retrieve borrow fee rates in two ways:\n * - If `address` and `asset` are provided, it calculates the specific borrow fee rate\n * for a given address and asset by calling the on-chain `get_borrow_fee_v2` function\n * - Otherwise, it returns the global borrow fee rate from the incentive V3 contract\n *\n * @param options - Optional configuration options\n * - `address` - User address to calculate specific borrow fee (requires `asset` to be set)\n * - `asset` - Asset identifier to calculate specific borrow fee (requires `address` to be set)\n * - `env` - Environment setting ('dev' or 'prod')\n * - `client` - Sui client instance for on-chain queries\n * - `cacheTime` - Cache expiration time in milliseconds\n * - `disableCache` - Whether to disable caching for this operation\n * @returns Promise<number> - Borrow fee rate as a decimal number\n * - When `address` and `asset` are provided: returns the specific fee rate (divided by 10000)\n * - Otherwise: returns the global fee rate (divided by 100)\n */\nexport const getBorrowFee = withCache(\n withSingleton(\n async (\n options?: Partial<EnvOption & CacheOption & BorrowFeeOption & SuiClientOption & MarketOption>\n ): Promise<number> => {\n const config = await getConfig({\n ...options\n })\n if (options?.address && typeof options?.asset !== 'undefined') {\n try {\n const pool = await getPool(options.asset, options)\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n tx.moveCall({\n target: `${config.package}::incentive_v3::get_borrow_fee_v2`,\n arguments: [\n tx.object(config.incentiveV3),\n tx.pure.address(options.address),\n tx.pure.u8(pool.id),\n tx.pure.u64(10000)\n ],\n typeArguments: []\n })\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: options.address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u64()])\n return (Number(res[0]) || 0) / 100\n } catch (error) {\n console.error(error)\n }\n }\n const rawData: any = await suiClient.getObject({\n id: config.incentiveV3,\n options: { showType: true, showOwner: true, showContent: true }\n })\n const borrowFee = rawData.data.content.fields.borrow_fee_rate\n return Number(borrowFee) / 100\n }\n )\n)\n","import { withCache, withSingleton, getPoolsMap, getEmodesMap } from './utils'\nimport type {\n MarketIdentity,\n EnvOption,\n CacheOption,\n EMode,\n MarketConfig,\n Pool,\n EModePool\n} from './types'\nimport { getPools } from './pool'\nimport BigNumber from 'bignumber.js'\n\nexport const DEFAULT_MARKET_IDENTITY = 'main'\n\nexport const MARKETS = {\n main: {\n id: 0,\n key: 'main',\n name: 'Main Market'\n }\n}\n\nexport class Market {\n private poolMap = {} as Record<string, Pool>\n private emodeMap = {} as Record<string, EMode>\n readonly config: MarketConfig\n readonly pools: Pool[] = []\n readonly emodes: EMode[] = []\n readonly emodePools: EModePool[] = []\n emodeBorrowablePools: Pool[] = []\n emodeSupplyablePools: Pool[] = []\n\n private _overview = {\n marketTotalSupplyValue: '0',\n marketTotalBorrowValue: '0'\n }\n\n get overview() {\n return this._overview\n }\n\n constructor(marketIdentity: MarketIdentity, pools: Pool[]) {\n this.config = getMarketConfig(marketIdentity)\n this.initPools(pools)\n }\n\n private initPools(pools: Pool[]) {\n const poolsMap = getPoolsMap(this.pools)\n const emodesMap = getEmodesMap(this.emodes)\n const emodeBorrowablePoolIds = new Set<string>()\n const emodeSupplyablePoolIds = new Set<string>()\n let marketTotalSupplyValue = BigNumber(0)\n let marketTotalBorrowValue = BigNumber(0)\n\n pools.forEach((pool) => {\n const isMatch = this.checkMarket(pool.market)\n if (!isMatch) {\n console.warn(`Pool is not in market ${this.config.name}`, pool)\n return\n }\n if (!poolsMap[pool.uniqueId]) {\n this.pools.push(pool)\n }\n pool?.emodes?.forEach((emode) => {\n if (!emodesMap[emode.uniqueId]) {\n this.emodes.push(emode)\n }\n emode.assets.forEach((asset) => {\n if (asset.isDebt) {\n const debtAsset = emode.assets.find(\n (a) => a.isCollateral && a.ltv > 0 && a.assetId !== pool.id\n )\n if (debtAsset) {\n emodeBorrowablePoolIds.add(pool.uniqueId)\n }\n }\n if (asset.isCollateral) {\n const supplyAsset = emode.assets.find((a) => a.isDebt && a.assetId !== pool.id)\n if (supplyAsset) {\n emodeSupplyablePoolIds.add(pool.uniqueId)\n }\n }\n })\n })\n marketTotalBorrowValue = marketTotalBorrowValue.plus(pool.poolBorrowValue)\n marketTotalSupplyValue = marketTotalSupplyValue.plus(pool.poolSupplyValue)\n })\n this.poolMap = getPoolsMap(this.pools, 'id')\n this.emodeMap = getEmodesMap(this.emodes, 'emodeId')\n this.emodes.forEach((emode) => {\n const emodePools = this.getEModePools(emode.emodeId)\n this.emodePools.push(...emodePools)\n })\n this._overview = {\n marketTotalSupplyValue: marketTotalSupplyValue.toString(),\n marketTotalBorrowValue: marketTotalBorrowValue.toString()\n }\n this.emodeBorrowablePools = this.pools.filter((pool) => {\n return emodeBorrowablePoolIds.has(pool.uniqueId)\n })\n this.emodeSupplyablePools = this.pools.filter((pool) => {\n return emodeSupplyablePoolIds.has(pool.uniqueId)\n })\n }\n\n public getEMode(emodeId: number): EMode | null {\n const emode = this.emodeMap[emodeId]\n return emode || null\n }\n\n public getEModeRelatePools(\n pool: Pool,\n options?: {\n collateral?: boolean\n debt?: boolean\n emodeId?: number\n }\n ): Pool[] {\n const { collateral, debt, emodeId } = options || {}\n const relatePools = [] as Pool[]\n pool.emodes.forEach((emode) => {\n if (typeof emodeId === 'number' && emodeId !== emode.emodeId) {\n return\n }\n emode.assets.forEach((asset) => {\n if (\n typeof collateral === 'boolean' &&\n collateral &&\n asset.isCollateral &&\n asset.assetId === pool.id\n ) {\n relatePools.push(this.poolMap[asset.assetId])\n }\n if (typeof debt === 'boolean' && debt && asset.isDebt && asset.assetId === pool.id) {\n relatePools.push(this.poolMap[asset.assetId])\n }\n })\n })\n return relatePools\n }\n\n public getEModePools(emodeId: number): EModePool[] {\n const emode = this.getEMode(emodeId)\n if (!emode) {\n return []\n }\n const pools = emode.assets\n .map((asset) => asset.assetId)\n .map((id) => {\n return this.poolMap[id]\n })\n .filter((pool) => !!pool)\n return pools.map((pool) => {\n const asset = emode.assets.find((asset) => asset.assetId === pool.id)!\n return {\n ...pool,\n emode: {\n ...asset,\n emodeId: emode.emodeId\n },\n isEMode: true\n }\n })\n }\n\n private checkMarket(marketIdentity: MarketIdentity) {\n let isMatch = false\n if (typeof marketIdentity === 'number' && marketIdentity === this.config.id) {\n isMatch = true\n }\n if (typeof marketIdentity === 'string' && marketIdentity === this.config.key) {\n isMatch = true\n }\n if (typeof marketIdentity === 'object' && marketIdentity.id === this.config.id) {\n isMatch = true\n }\n return isMatch\n }\n}\n\nexport const getMarketConfig = (marketIdentity: MarketIdentity) => {\n const configs = Object.values(MARKETS)\n const config = configs.find((marketConfig) => {\n if (typeof marketIdentity === 'number') {\n return marketConfig.id === marketIdentity\n }\n if (typeof marketIdentity === 'string') {\n return marketConfig.key === marketIdentity\n }\n return marketConfig.id === marketIdentity.id\n })\n if (!config) {\n throw new Error(`Market not found`)\n }\n return config\n}\n\nexport const getMarkets = withCache(\n withSingleton(\n async (\n markets: MarketIdentity[],\n options?: Partial<EnvOption & CacheOption>\n ): Promise<Market[]> => {\n const pools = await getPools({\n cacheTime: 1000 * 60,\n ...options,\n markets\n })\n return markets.map((market) => {\n const marketConfig = getMarketConfig(market)\n const marketPools = pools.filter((pool) => {\n return pool.market === marketConfig.key\n })\n return new Market(market, marketPools)\n })\n }\n )\n)\n\nexport const getMarket = withCache(\n withSingleton(\n async (market: MarketIdentity, options?: Partial<EnvOption & CacheOption>): Promise<Market> => {\n const markets = await getMarkets([market], options)\n return markets[0]\n }\n )\n)\n","/**\n * Lending Configuration Management\n *\n * This module provides configuration management for the lending protocol.\n * It handles fetching configuration from the Navi protocol API and provides\n * caching mechanisms for efficient configuration retrieval.\n *\n * @module LendingConfig\n */\n\nimport type { LendingConfig, EnvOption, CacheOption, MarketOption } from './types'\nimport { withCache, withSingleton, requestHeaders } from './utils'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig } from './market'\n\n/**\n * Fetches lending protocol configuration from the API\n *\n * This function retrieves the current configuration for the lending protocol\n * from the Navi protocol API. It's wrapped with both caching and singleton\n * behavior to ensure efficient and consistent configuration access.\n *\n * The configuration includes:\n * - Contract addresses for all protocol components\n * - Oracle configuration and price feed information\n * - Pool and incentive contract addresses\n * - Environment-specific settings\n *\n * @param options - Optional environment and caching options\n * @returns Promise<LendingConfig> - Complete lending protocol configuration\n */\nexport const getConfig = withCache(\n withSingleton(\n async (options?: Partial<EnvOption & CacheOption & MarketOption>): Promise<LendingConfig> => {\n const market = getMarketConfig(options?.market || DEFAULT_MARKET_IDENTITY)\n const url = `https://open-api.naviprotocol.io/api/navi/config?env=${options?.env || 'prod'}&sdk=${packageJson.version}&market=${market.key}`\n\n // Fetch configuration from API\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n )\n)\n\n/**\n * Default cache time for configuration data\n *\n * Configuration is cached for 5 minutes to reduce API calls\n * while ensuring reasonably fresh configuration data.\n */\nexport const DEFAULT_CACHE_TIME = 1000 * 60 * 5\n","import {\n CacheOption,\n EnvOption,\n EModeCap,\n AccountCapOption,\n MarketOption,\n TransactionResult,\n SuiClientOption,\n EModeIdentity\n} from './types'\nimport { withSingleton, withCache, parseTxValue, suiClient } from './utils'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig } from './market'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { createAccountCapPTB, getAccountCapOwnerPTB } from './account-cap'\nimport { bcs } from '@mysten/sui/bcs'\n\nexport async function enterEModePTB(\n tx: Transaction,\n emodeId: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (!options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::lending::enter_emode`,\n arguments: [tx.object(config.storage), parseTxValue(emodeId, tx.pure.u64)]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::lending::enter_emode_with_account_cap`,\n arguments: [\n tx.object(config.storage),\n parseTxValue(emodeId, tx.pure.u64),\n parseTxValue(options.accountCap, tx.object)\n ]\n })\n }\n\n return tx\n}\n\nexport async function exitEModePTB(\n tx: Transaction,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (!options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::lending::exit_emode`,\n arguments: [tx.object(config.storage)]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::lending::exit_emode_with_account_cap`,\n arguments: [tx.object(config.storage), parseTxValue(options.accountCap, tx.object)]\n })\n }\n return tx\n}\n\nexport async function createEModeCapPTB(\n tx: Transaction,\n emodeId: number | TransactionResult,\n options?: Partial<EnvOption & MarketOption>\n) {\n const config = await getConfig({\n cacheTime: DEFAULT_CACHE_TIME,\n ...options\n })\n const accountCap = await createAccountCapPTB(tx, options)\n await enterEModePTB(tx, emodeId, {\n ...options,\n accountCap: accountCap\n })\n const market = await getMarketConfig(options?.market || DEFAULT_MARKET_IDENTITY)\n const accountCapOwner = await getAccountCapOwnerPTB(tx, accountCap, options)\n tx.moveCall({\n target: `${config.emode.contract.registryPackage}::registry::register_emode_for_account_cap`,\n arguments: [\n tx.object(config.emode.contract.registryObject),\n accountCapOwner,\n parseTxValue(market.id, tx.pure.u64),\n parseTxValue(emodeId, tx.pure.u64)\n ]\n })\n return accountCap\n}\n\nexport const getUserEModeCaps = withCache(\n withSingleton(\n async (\n address: string,\n options?: Partial<SuiClientOption & EnvOption & CacheOption>\n ): Promise<EModeCap[]> => {\n const config = await getConfig({\n cacheTime: DEFAULT_CACHE_TIME,\n ...options\n })\n const tx = new Transaction()\n const client = options?.client ?? suiClient\n\n tx.moveCall({\n target: `${config.emode.contract.registryPackage}::registry::find_user_emode_account_caps`,\n arguments: [tx.object(config.emode.contract.registryObject), tx.pure.address(address!)]\n })\n\n const result: any = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const values = result.results[0].returnValues\n\n const marketIds = bcs.vector(bcs.u64()).parse(Uint8Array.from(values[0][0]))\n const emodeIds = bcs.vector(bcs.u64()).parse(Uint8Array.from(values[1][0]))\n const accountCaps = bcs.vector(bcs.Address).parse(Uint8Array.from(values[2][0]))\n\n return marketIds.map((marketId, index) => ({\n marketId: Number(marketId),\n emodeId: Number(emodeIds[index]),\n accountCap: accountCaps[index].toString()\n }))\n }\n )\n)\n\nexport function emodeIdentityId(identifier: EModeIdentity) {\n const market = getMarketConfig(identifier.marketId)\n return `${market.key}-${identifier.emodeId}`\n}\n","/**\n * Lending Account Management\n *\n * This module provides comprehensive account management functionality for the lending protocol.\n * It includes coin merging, health factor calculations, user state management, and various\n * lending operations like supply, borrow, withdraw, and repay.\n *\n * @module LendingAccount\n */\n\nimport type {\n UserLendingInfo,\n SuiClientOption,\n EnvOption,\n Pool,\n Transaction as NAVITransaction,\n AssetIdentifier,\n TransactionResult,\n CacheOption,\n AccountCap,\n MarketOption,\n LendingPosition,\n MarketsOption,\n EModePool,\n EModeCap\n} from './types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { UserStateInfo } from './bcs'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport {\n suiClient,\n camelize,\n parseDevInspectResult,\n withSingleton,\n processContractHealthFactor,\n parseTxValue,\n parseTxPoolValue,\n withCache,\n normalizeCoinType,\n rayMathMulIndex,\n requestHeaders,\n poolToEModePool,\n getPoolsMap,\n uuid\n} from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport { CoinStruct, PaginatedCoins } from '@mysten/sui/client'\nimport { getPool, PoolOperator, getPools } from './pool'\nimport packageJson from '../package.json'\nimport { getUserEModeCaps } from './emode'\nimport BigNumber from 'bignumber.js'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\n\n/**\n * Merges multiple coins into a single coin for transaction building\n *\n * This function takes multiple coin objects and merges them into a single coin\n * that can be used in a transaction. It supports optional splitting to create\n * a specific balance amount.\n *\n * @param tx - Transaction object to add merge operations to\n * @param coins - Array of coin objects to merge\n * @param options - Optional parameters for balance splitting and gas coin usage\n * - `balance` - If provided, splits this amount from the resulting coin object\n * - `useGasCoin` - If true, uses the gas coin for the operation\n * @returns Transaction result representing the merged coin\n */\nexport function mergeCoinsPTB(\n tx: Transaction,\n coins: ({\n balance: string | number | bigint\n coinObjectId: string\n coinType: string\n } & CoinStruct)[],\n options?: {\n balance?: number\n useGasCoin?: boolean\n }\n) {\n const needSplit = typeof options?.balance === 'number'\n const splitBalance = needSplit ? options.balance! : 0\n let mergedBalance = 0\n const mergeList: string[] = []\n let coinType = ''\n\n // Sort coins by balance (highest first) and collect valid coins\n coins\n .sort((a, b) => Number(b.balance) - Number(a.balance))\n .forEach((coin) => {\n if (needSplit && mergedBalance >= splitBalance) {\n return\n }\n if (Number(coin.balance) === 0) {\n return\n }\n if (!coinType) {\n coinType = coin.coinType\n }\n if (coinType !== coin.coinType) {\n throw new Error('All coins must be of the same type')\n }\n mergedBalance += Number(coin.balance)\n mergeList.push(coin.coinObjectId)\n })\n\n if (mergeList.length === 0) {\n throw new Error('No coins to merge')\n }\n if (needSplit && mergedBalance < splitBalance) {\n throw new Error(\n `Balance is less than the specified balance: ${mergedBalance} < ${splitBalance}`\n )\n }\n\n // Handle SUI gas coin specially\n if (normalizeCoinType(coinType) === normalizeCoinType('0x2::sui::SUI') && options?.useGasCoin) {\n return needSplit ? tx.splitCoins(tx.gas, [tx.pure.u64(splitBalance)]) : tx.gas\n }\n\n // Merge coins and optionally split\n\n mergeList.length === 1 ? tx.object(mergeList[0]) : tx.mergeCoins(mergeList[0], mergeList.slice(1))\n\n return needSplit ? tx.splitCoins(mergeList[0], [tx.pure.u64(splitBalance)]) : mergeList[0]\n}\n\n/**\n * Calculates dynamic health factor for a user after potential operations\n *\n * This function creates a transaction call to calculate the health factor\n * that would result after performing supply/borrow operations.\n *\n * @param tx - Transaction object to append calculation to\n * @param address - User address or transaction result\n * @param identifier - Asset identifier\n * @param estimatedSupply - Estimated supply amount\n * @param estimatedBorrow - Estimated borrow amount\n * @param isIncrease - Whether this is an increase operation\n * @param options - Environment options\n * @returns Transaction result for health factor calculation\n */\nexport async function getSimulatedHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n identifier: AssetIdentifier,\n estimatedSupply: number | TransactionResult,\n estimatedBorrow: number | TransactionResult,\n isIncrease: boolean | TransactionResult,\n options?: Partial<EnvOption & MarketOption>\n): Promise<TransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n return tx.moveCall({\n target: `${config.uiGetter}::calculator_unchecked::dynamic_health_factor`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(config.oracle.priceOracle),\n parseTxPoolValue(tx, pool),\n parseTxValue(address, tx.pure.address),\n parseTxValue(pool.id, tx.pure.u8),\n parseTxValue(estimatedSupply, tx.pure.u64),\n parseTxValue(estimatedBorrow, tx.pure.u64),\n parseTxValue(isIncrease, tx.pure.bool)\n ],\n typeArguments: [pool.suiCoinType]\n })\n}\n\n/**\n * Gets the current health factor for a user\n *\n * @param tx - The transaction object to add health factor query operation to\n * @param address - User address or account cap or transaction result\n * @param options - Environment options\n * @returns Transaction result for health factor calculation\n */\nexport async function getHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n options?: Partial<EnvOption>\n): Promise<TransactionResult> {\n return getSimulatedHealthFactorPTB(tx, address, 0, 0, 0, false, options)\n}\n\nasync function getLendingStateBatch(\n address: string,\n tasks: {\n address: string\n market: string\n emodeId?: number\n }[],\n options?: Partial<\n SuiClientOption &\n EnvOption &\n CacheOption & {\n includeZeroBalanceEmodePositions?: boolean\n }\n >\n): Promise<UserLendingInfo[]> {\n const tx = new Transaction()\n const client = options?.client ?? suiClient\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS)\n })\n const poolsMap = getPoolsMap(pools)\n\n for (let task of tasks) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market: task.market\n })\n tx.moveCall({\n target: `${config.uiGetter}::getter_unchecked::get_user_state`,\n arguments: [tx.object(config.storage), tx.pure.address(task.address)]\n })\n }\n\n const resp = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const stateList = (resp.results || []).map((result) => {\n return (\n result.returnValues?.map((item) => {\n return bcs.vector(UserStateInfo as any).parse(Uint8Array.from(item[0]))\n })[0] || []\n )\n }) as {\n supply_balance: string\n borrow_balance: string\n asset_id: number\n }[][]\n\n const result = [] as UserLendingInfo[]\n\n stateList.forEach((states, index) => {\n const task = tasks[index]\n const market = getMarketConfig(task.market)\n states.forEach((state) => {\n if (state.supply_balance === '0' && state.borrow_balance === '0') {\n if (task.emodeId === undefined) {\n return\n }\n if (!options?.includeZeroBalanceEmodePositions) {\n return\n }\n }\n const pool = poolsMap[`${market.key}-${state.asset_id}`]\n if (!pool) {\n return\n }\n const supplyBalance = rayMathMulIndex(\n state.supply_balance,\n pool!.currentSupplyIndex\n ).toString()\n const borrowBalance = rayMathMulIndex(\n state.borrow_balance,\n pool!.currentBorrowIndex\n ).toString()\n result.push({\n supplyBalance,\n borrowBalance,\n assetId: state.asset_id,\n market: market.key,\n pool,\n emodeId: task.emodeId\n })\n })\n })\n\n return result\n}\n\n/**\n * Retrieves the current lending state for a user\n *\n * This function fetches all active lending positions for a user, including\n * supply and borrow balances for different assets.\n *\n * @param address - User wallet address or account cap\n * @param options - Options for client, environment, and caching\n * @returns Promise<UserLendingInfo[]> - Array of user lending positions\n */\nexport const getLendingState = withCache(\n async (\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption & CacheOption & MarketsOption>\n ): Promise<UserLendingInfo[]> => {\n const markets = (options?.markets || Object.keys(MARKETS)).map((item) => {\n return getMarketConfig(item)\n })\n\n const tasks = markets.map((market) => {\n return {\n address,\n market: market.key\n }\n })\n\n return await getLendingStateBatch(address, tasks, options)\n }\n)\n\n/**\n * Calculates the current health factor for a user\n *\n * @param address - User wallet address or account cap\n * @param options - Options for client and environment\n * @returns Promise<number> - Health factor value\n */\nexport async function getHealthFactor(\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<number> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n await getHealthFactorPTB(tx, address, options)\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u256()])\n return processContractHealthFactor(Number(res[0]) || 0)\n}\n\n/**\n * Calculates the health factor after performing lending operations\n *\n * This function simulates the health factor that would result after\n * performing a series of supply, withdraw, borrow, or repay operations.\n *\n * @param address - User wallet address or account cap\n * @param identifier - Asset identifier\n * @param operations - Array of operations to simulate\n * @param options - Options for client and environment\n * @returns Promise<number> - Projected health factor\n */\nexport async function getSimulatedHealthFactor(\n address: string | AccountCap,\n identifier: AssetIdentifier,\n operations: {\n type: PoolOperator\n amount: number\n }[],\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<number> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n let estimatedSupply = 0\n let estimatedBorrow = 0\n const pool = await getPool(identifier, options)\n\n // Calculate estimated changes from operations\n operations.forEach((operation) => {\n if (operation.type === PoolOperator.Supply) {\n estimatedSupply += operation.amount\n } else if (operation.type === PoolOperator.Withdraw) {\n estimatedSupply -= operation.amount\n } else if (operation.type === PoolOperator.Borrow) {\n estimatedBorrow += operation.amount\n } else if (operation.type === PoolOperator.Repay) {\n estimatedBorrow -= operation.amount\n }\n })\n\n // Validate operation consistency\n if (estimatedSupply * estimatedBorrow < 0) {\n throw new Error('Invalid operations')\n }\n\n // Determine if this is an increase operation\n const isIncrease = estimatedSupply > 0 || estimatedBorrow > 0\n\n // Calculate the dynamic health factor\n await getSimulatedHealthFactorPTB(\n tx,\n address,\n pool,\n Math.abs(estimatedSupply),\n Math.abs(estimatedBorrow),\n isIncrease,\n options\n )\n\n // Execute dry run to get the result\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u256()])\n return processContractHealthFactor(Number(res[0]) || 0)\n}\n\n/**\n * Retrieves transaction history for a user from the Navi protocol API\n *\n * This function fetches the transaction history for a specific user address\n * from the Navi protocol's open API. It supports pagination through cursor-based navigation.\n *\n * @param address - User wallet address or account cap\n * @param options - Optional parameters including cursor for pagination\n * @returns Promise with transaction data and optional cursor for next page\n */\nexport const getTransactions = withSingleton(\n async (\n address: string | AccountCap,\n options?: {\n cursor?: string\n }\n ): Promise<{\n data: NAVITransaction[]\n cursor?: string\n }> => {\n // Build query parameters for the API request\n const params = new URLSearchParams()\n if (options?.cursor) {\n params.set('cursor', options.cursor)\n }\n params.set('userAddress', address)\n\n // Fetch transaction history from Navi protocol API\n const url = `https://open-api.naviprotocol.io/api/navi/user/transactions?${params.toString()}&sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n)\n\n/**\n * Retrieves all coins owned by a user address\n *\n * This function fetches all coin objects owned by a specific address from the Sui blockchain.\n * It supports filtering by coin type and handles pagination automatically to retrieve all coins.\n *\n * @param address - User wallet address\n * @param options - Optional parameters including coin type filter and client options\n * - `coinType` - If specified, retrieves only coins of this type\n * - `client` - If provided, uses this `SuiClient` instance instead of the default client\n * @returns Promise<CoinStruct[]> - Array of coin objects owned by the address\n */\nexport async function getCoins(\n address: string,\n options?: Partial<\n {\n coinType?: string\n } & SuiClientOption\n >\n): Promise<CoinStruct[]> {\n let cursor: string | undefined | null = null\n const allCoinDatas: CoinStruct[] = []\n const client = options?.client ?? suiClient\n\n // Fetch all coins using pagination\n do {\n let res: PaginatedCoins\n\n // Use specific coin type filter if provided, otherwise get all coins\n if (options?.coinType) {\n res = await client.getCoins({\n owner: address,\n coinType: options?.coinType,\n cursor,\n limit: 100\n })\n } else {\n res = await client.getAllCoins({\n owner: address,\n cursor,\n limit: 100\n })\n }\n\n // Break if no more data\n if (!res.data || !res.data.length) {\n break\n }\n\n // Collect coin data and continue with next page\n allCoinDatas.push(...res.data)\n cursor = res.nextCursor\n } while (cursor)\n\n return allCoinDatas\n}\n\nexport const getLendingPositions = withCache(\n async (\n address: string,\n options?: Partial<\n SuiClientOption &\n EnvOption &\n CacheOption &\n MarketsOption & {\n includeZeroBalanceEmodePositions?: boolean\n }\n >\n ): Promise<LendingPosition[]> => {\n const positions: LendingPosition[] = []\n const markets = (options?.markets || Object.keys(MARKETS)).map((item) => {\n return getMarketConfig(item)\n })\n\n let emodeCaps: EModeCap[] = []\n\n try {\n emodeCaps = await getUserEModeCaps(address, options)\n } catch (e) {\n console.error(e)\n }\n\n const tasks = markets\n .map((market) => {\n return {\n address,\n market: market.key\n }\n })\n .concat(\n emodeCaps\n .filter((cap) => {\n return !!markets.find((market) => market.id === cap.marketId)\n })\n .map((emodeCap) => {\n return {\n address: emodeCap.accountCap,\n market: getMarketConfig(emodeCap.marketId).key,\n emodeId: emodeCap.emodeId\n }\n })\n )\n\n const lendingStates = await getLendingStateBatch(address, tasks, options)\n\n lendingStates.forEach((lendingState) => {\n const emodeCap =\n typeof lendingState.emodeId === 'number'\n ? emodeCaps.find((cap) => {\n const market = getMarketConfig(lendingState.market)\n return cap.emodeId === lendingState.emodeId && cap.marketId === market.id\n })\n : undefined\n if (emodeCap) {\n const inEmode = lendingState.pool.emodes.find((emode) => emode.emodeId === emodeCap.emodeId)\n if (!inEmode) {\n return\n }\n if (BigNumber(lendingState.supplyBalance).gte(0)) {\n const supplyAmount = BigNumber(lendingState.supplyBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n\n const emodePool = poolToEModePool(lendingState.pool, emodeCap)\n\n if (supplyAmount.gt(0) || emodePool.emode.isCollateral) {\n try {\n positions.push({\n id: `${lendingState.pool.uniqueId}_${emodeCap.emodeId}_navi-lending-emode-supply-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: supplyAmount.toString(),\n pool: poolToEModePool(lendingState.pool, emodeCap),\n token: lendingState.pool.token,\n valueUSD: supplyAmount.multipliedBy(lendingState.pool.oracle.price).toString(),\n emodeCap: emodeCap\n }\n })\n } catch (e) {\n console.error(e)\n }\n }\n }\n if (BigNumber(lendingState.borrowBalance).gte(0)) {\n const borrowAmount = BigNumber(lendingState.borrowBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n\n const emodePool = poolToEModePool(lendingState.pool, emodeCap)\n\n if (borrowAmount.gt(0) || emodePool.emode.isDebt) {\n try {\n positions.push({\n id: `${lendingState.pool.uniqueId}_${emodeCap.emodeId}_navi-lending-emode-borrow-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: borrowAmount.toString(),\n pool: poolToEModePool(lendingState.pool, emodeCap),\n token: lendingState.pool.token,\n valueUSD: borrowAmount.multipliedBy(lendingState.pool.oracle.price).toString(),\n emodeCap: emodeCap\n }\n })\n } catch (e) {\n console.error(e)\n }\n }\n }\n } else {\n if (BigNumber(lendingState.supplyBalance).gt(0)) {\n const supplyAmount = BigNumber(lendingState.supplyBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n positions.push({\n id: `${lendingState.pool.uniqueId}_navi-lending-supply-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n type: 'navi-lending-supply',\n market: lendingState.market,\n 'navi-lending-supply': {\n amount: supplyAmount.toString(),\n pool: lendingState.pool,\n token: lendingState.pool.token,\n valueUSD: supplyAmount.multipliedBy(lendingState.pool.oracle.price).toString()\n }\n })\n }\n if (BigNumber(lendingState.borrowBalance).gt(0)) {\n const borrowAmount = BigNumber(lendingState.borrowBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n positions.push({\n id: `${lendingState.pool.uniqueId}_navi-lending-borrow-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: borrowAmount.toString(),\n pool: lendingState.pool,\n token: lendingState.pool.token,\n valueUSD: borrowAmount.multipliedBy(lendingState.pool.oracle.price).toString()\n }\n })\n }\n }\n })\n return positions\n }\n)\n\nexport class UserPositions {\n private _positions: LendingPosition[] = []\n private _overview = {\n hf: Infinity,\n netVaule: '0',\n netWorthApr: '0',\n totalSupplyValue: '0',\n totalBorrowValue: '0',\n totalsupplyApy: '0',\n totalBorrowApy: '0',\n maxLiquidationValue: '0',\n maxLoanToVaule: '0',\n supply: {} as Record<string, string>,\n borrow: {} as Record<string, string>\n }\n\n get positions() {\n return this._positions\n }\n\n get overview() {\n return this._overview\n }\n\n set positions(positions: LendingPosition[]) {\n this._positions = positions\n this._overview = this.getPositionsOverview(positions)\n }\n\n constructor(positions: LendingPosition[]) {\n this.positions = positions\n }\n\n public filterPositionsByPool(pool: Pool | EModePool) {\n const isEmode = !!(pool as EModePool).isEMode\n const types = isEmode\n ? ['navi-lending-emode-supply', 'navi-lending-emode-borrow']\n : ['navi-lending-supply', 'navi-lending-borrow']\n return new UserPositions(\n this.positions.filter((position) => {\n const positionData = position[position.type]!\n return types.includes(position.type) && positionData.pool.uniqueId === pool.uniqueId\n })\n )\n }\n\n public deposit(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-supply',\n 'navi-lending-supply': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public withdraw(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-supply',\n 'navi-lending-supply': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public borrow(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public repay(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n getPositionsOverview(positions: LendingPosition[]) {\n const supply = {} as Record<string, string>\n const borrow = {} as Record<string, string>\n let totalSupplyValue = new BigNumber(0)\n let totalBorrowValue = new BigNumber(0)\n let totalsupplyApy = new BigNumber(0)\n let totalBorrowApy = new BigNumber(0)\n let maxLiquidationValue = new BigNumber(0)\n let maxLoanToVaule = new BigNumber(0)\n positions.forEach((position) => {\n if (position.type === 'navi-lending-supply') {\n const data = position['navi-lending-supply']!\n totalSupplyValue = totalSupplyValue.plus(data.valueUSD)\n maxLiquidationValue = maxLiquidationValue.plus(\n new BigNumber(data.valueUSD).multipliedBy(data.pool.liquidationFactor.threshold)\n )\n maxLoanToVaule = maxLoanToVaule.plus(\n new BigNumber(data.valueUSD).multipliedBy(data.pool.ltvValue)\n )\n } else if (position.type === 'navi-lending-borrow') {\n totalBorrowValue = totalBorrowValue.plus(position['navi-lending-borrow']!.valueUSD)\n } else if (position.type === 'navi-lending-emode-supply') {\n const data = position['navi-lending-emode-supply']!\n totalSupplyValue = totalSupplyValue.plus(data.valueUSD)\n const poolEmodeConfig = data.pool.emode\n maxLiquidationValue = maxLiquidationValue.plus(\n new BigNumber(data.valueUSD).multipliedBy(poolEmodeConfig.lt)\n )\n maxLoanToVaule = maxLoanToVaule.plus(\n new BigNumber(data.valueUSD).multipliedBy(poolEmodeConfig.ltv)\n )\n } else if (position.type === 'navi-lending-emode-borrow') {\n totalBorrowValue = totalBorrowValue.plus(position['navi-lending-emode-borrow']!.valueUSD)\n }\n })\n\n totalBorrowValue = BigNumber.max(totalBorrowValue, 0)\n totalSupplyValue = BigNumber.max(totalSupplyValue, 0)\n maxLiquidationValue = BigNumber.max(maxLiquidationValue, 0)\n maxLoanToVaule = BigNumber.max(maxLoanToVaule, 0)\n\n positions.forEach((position) => {\n if (position.type === 'navi-lending-supply') {\n const data = position['navi-lending-supply']!\n const apy = data.pool.supplyIncentiveApyInfo.apy\n if (totalSupplyValue.gt(0)) {\n totalsupplyApy = totalsupplyApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalSupplyValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n supply[data.pool.suiCoinType] = BigNumber(supply[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-borrow') {\n const data = position['navi-lending-borrow']!\n const apy = data.pool.borrowIncentiveApyInfo.apy\n if (totalBorrowValue.gt(0)) {\n totalBorrowApy = totalBorrowApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalBorrowValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n borrow[data.pool.suiCoinType] = BigNumber(borrow[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-emode-supply') {\n const data = position['navi-lending-emode-supply']!\n const apy = data.pool.supplyIncentiveApyInfo.apy\n if (totalSupplyValue.gt(0)) {\n totalsupplyApy = totalsupplyApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalSupplyValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n supply[data.pool.suiCoinType] = BigNumber(supply[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-emode-borrow') {\n const data = position['navi-lending-emode-borrow']!\n const apy = data.pool.borrowIncentiveApyInfo.apy\n if (totalBorrowValue.gt(0)) {\n totalBorrowApy = totalBorrowApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalBorrowValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n borrow[data.pool.suiCoinType] = BigNumber(borrow[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n }\n })\n\n const netVaule = totalSupplyValue.minus(totalBorrowValue)\n const netWorthApr = totalSupplyValue.minus(totalBorrowValue).eq(0)\n ? new BigNumber(0)\n : totalSupplyValue\n .multipliedBy(totalsupplyApy)\n .minus(totalBorrowValue.multipliedBy(totalBorrowApy))\n .div(totalSupplyValue.minus(totalBorrowValue))\n const hf =\n totalBorrowValue.toNumber() !== 0\n ? maxLiquidationValue.dividedBy(totalBorrowValue).toNumber()\n : Infinity\n\n return {\n hf,\n netVaule: netVaule.toString(),\n netWorthApr: netWorthApr.toString(),\n totalSupplyValue: totalSupplyValue.toString(),\n totalBorrowValue: totalBorrowValue.toString(),\n totalsupplyApy: totalsupplyApy.toString(),\n totalBorrowApy: totalBorrowApy.toString(),\n maxLiquidationValue: maxLiquidationValue.toString(),\n maxLoanToVaule: maxLoanToVaule.toString(),\n supply,\n borrow\n }\n }\n}\n\nexport async function verifyHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n hf: number,\n options?: Partial<EnvOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (config.limter) {\n tx.moveCall({\n target: `${config.limter}::navi_adaptor::verify_navi_position_healthy`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(config.priceOracle),\n parseTxValue(address, tx.pure.address),\n tx.pure.u256(new BigNumber(hf).shiftedBy(27).toNumber())\n ]\n })\n }\n}\n","/**\n * Oracle Price Feed Management for Lending Protocol\n *\n * This module provides oracle price feed functionality for the lending protocol.\n * It integrates with Pyth Network for real-time price data and manages price updates\n * for various assets used in lending operations.\n */\n\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport type {\n OraclePriceFeed,\n EnvOption,\n UserLendingInfo,\n Pool,\n SuiClientOption,\n MarketOption,\n LendingPosition\n} from './types'\nimport { SuiPriceServiceConnection, SuiPythClient } from '@pythnetwork/pyth-sui-js'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { suiClient } from './utils'\nimport { getPools } from './pool'\nimport { getLendingPositions } from './account'\n\ntype PythInfo = {\n priceFeedId: string\n priceInfoObject: string\n expiration?: number\n}\n\nexport type PythPriceInfo = {\n priceFeedId: string\n priceInfoObject: string\n price: string\n conf: string\n publishTime: number\n expiration?: number\n}\n\n/**\n * Pyth Network connection for price feed data\n * Connects to the Hermes endpoint for real-time price updates\n */\nconst suiPythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 10000\n})\n\n/**\n * Get stale price feed IDs from Pyth Network\n *\n * Identifies price feeds that have not been updated recently (more than 30 seconds old).\n * This helps ensure that only fresh price data is used for lending operations.\n *\n * @param priceIds - Array of Pyth price feed IDs to check\n * @returns Array of stale price feed IDs that need updating\n * @throws Error if failed to fetch price feed data\n */\nexport async function getPythStalePriceFeedId(priceIds: string[]): Promise<string[]> {\n try {\n const returnData: string[] = []\n const latestPriceFeeds = await suiPythConnection.getLatestPriceFeeds(priceIds)\n if (!latestPriceFeeds) return returnData\n\n const currentTimestamp = Math.floor(new Date().valueOf() / 1000)\n for (const priceFeed of latestPriceFeeds) {\n const uncheckedPrice = priceFeed.getPriceUnchecked()\n if (uncheckedPrice.publishTime > currentTimestamp) {\n console.warn(\n `pyth price feed is invalid, id: ${priceFeed.id}, publish time: ${uncheckedPrice.publishTime}, current timestamp: ${currentTimestamp}`\n )\n continue\n }\n\n // From pyth state is 60, but setting it to 30 makes more sense.\n if (currentTimestamp - priceFeed.getPriceUnchecked().publishTime > 30) {\n console.info(\n `stale price feed, id: ${priceFeed.id}, publish time: ${uncheckedPrice.publishTime}, current timestamp: ${currentTimestamp}`\n )\n returnData.push(priceFeed.id)\n }\n }\n return returnData\n } catch (error) {\n throw new Error(`failed to get pyth stale price feed id, msg: ${(error as Error).message}`)\n }\n}\n\nasync function getOnChainPriceInfo(\n pythInfos: PythInfo[],\n options?: Partial<SuiClientOption>\n): Promise<PythPriceInfo[] | undefined> {\n try {\n const priceInfos: PythPriceInfo[] = []\n const client = options?.client ?? suiClient\n\n const priceInfoObjectIds = pythInfos.map((k) => k.priceInfoObject)\n const priceInfoObjects = await client.multiGetObjects({\n ids: Array.from(new Set(priceInfoObjectIds)),\n options: { showContent: true }\n })\n for (const obj of priceInfoObjects) {\n const data = obj.data\n if (!data || !data.content || data.content.dataType !== 'moveObject') {\n console.warn(`fetched object ${data?.objectId} datatype should be moveObject`)\n continue\n }\n\n const pythInfo = pythInfos.find((v) => v.priceInfoObject == data.objectId)\n if (!pythInfo) {\n console.warn(`unable to find pyth info from array, priceInfoObject: ${data.objectId}`)\n continue\n }\n\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n const objectFields = data.content.fields.price_info.fields.price_feed.fields.price.fields\n const { magnitude, negative } = objectFields.price.fields\n const conf = objectFields.conf\n const timestamp = objectFields.timestamp\n\n priceInfos.push({\n priceFeedId: pythInfo.priceFeedId,\n priceInfoObject: pythInfo.priceInfoObject,\n price: negative ? '-' + magnitude : magnitude,\n conf,\n publishTime: Number(timestamp),\n expiration: pythInfo.expiration\n })\n }\n return priceInfos\n } catch (err) {\n console.error(err, `Polling Sui on-chain price for ${pythInfos} failed.`)\n return undefined\n }\n}\n\nexport async function getPythStalePriceFeedIdV2(\n pythInfos: PythInfo[],\n options?: Partial<SuiClientOption>\n): Promise<string[]> {\n try {\n const returnData: string[] = []\n const latestPriceFeeds = await getOnChainPriceInfo(pythInfos, options)\n if (!latestPriceFeeds) return returnData\n\n const currentTimestamp = Math.floor(new Date().valueOf() / 1000)\n\n for (const priceFeed of latestPriceFeeds) {\n if (priceFeed.publishTime > currentTimestamp) {\n console.warn(\n `pyth price feed is invalid, id: ${priceFeed.priceFeedId}, publish time: ${priceFeed.publishTime}, current timestamp: ${currentTimestamp}`\n )\n continue\n }\n\n const maxTime = priceFeed.expiration || 60\n // 3s is the margin of error for the price feed.\n if (currentTimestamp - priceFeed.publishTime > maxTime) {\n console.info(\n `stale price feed, id: ${priceFeed.priceFeedId}, publish time: ${priceFeed.publishTime}, current timestamp: ${currentTimestamp}`\n )\n returnData.push(priceFeed.priceFeedId)\n }\n }\n return returnData\n } catch (error) {\n throw new Error(`failed to get pyth stale price feed id, msg: ${(error as Error).message}`)\n }\n}\n\n/**\n * Update Pyth price feeds in a transaction\n *\n * Fetches the latest price update data from Pyth Network and adds the update\n * operations to the transaction block.\n *\n * @param tx - The transaction block to add price feed updates to\n * @param priceFeedIds - Array of Pyth price feed IDs to update\n * @param options - Optional client and environment configuration\n * @returns Promise that resolves when price feeds are updated\n * @throws Error if failed to update price feeds\n */\nexport async function updatePythPriceFeeds(\n tx: Transaction,\n priceFeedIds: string[],\n options?: Partial<SuiClientOption & EnvOption & MarketOption>\n) {\n const client = options?.client ?? suiClient\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n try {\n const priceUpdateData = await suiPythConnection.getPriceFeedsUpdateData(priceFeedIds)\n const suiPythClient = new SuiPythClient(\n client as any,\n config.oracle.pythStateId,\n config.oracle.wormholeStateId\n )\n\n return await suiPythClient.updatePriceFeeds(tx as any, priceUpdateData, priceFeedIds)\n } catch (error) {\n throw new Error(`failed to update pyth price feeds, msg: ${(error as Error).message}`)\n }\n}\n\n/**\n * Update oracle prices in the PTB (Programmable Transaction Block)\n *\n * This function updates price feeds for the lending protocol. It can optionally\n * update Pyth price feeds first if they are stale, then updates individual\n * price feeds in the oracle contract.\n *\n * @param tx - The transaction block to add price update operations to\n * @param priceFeeds - Array of oracle price feeds to update\n * @param options - Optional configuration including whether to update Pyth feeds\n * @returns The updated transaction block\n */\nexport async function updateOraclePricesPTB(\n tx: Transaction,\n priceFeeds: OraclePriceFeed[],\n options?: Partial<\n EnvOption &\n SuiClientOption &\n MarketOption & {\n updatePythPriceFeeds?: boolean\n }\n >\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // Optionally update Pyth price feeds if they are stale\n if (options?.updatePythPriceFeeds) {\n const pythInfos = priceFeeds\n .filter((feed) => !!feed.pythPriceFeedId && !!feed.pythPriceInfoObject)\n .map((feed) => ({\n priceFeedId: feed.pythPriceFeedId,\n priceInfoObject: feed.pythPriceInfoObject,\n expiration: 30\n }))\n\n try {\n const stalePriceFeedIds = await getPythStalePriceFeedIdV2(pythInfos, options)\n if (stalePriceFeedIds.length > 0) {\n await updatePythPriceFeeds(tx, stalePriceFeedIds, options)\n }\n } catch (e) {\n console.error(`Failed to update Pyth price feeds`)\n }\n }\n\n // Update individual price feeds in the oracle contract\n for (const priceFeed of priceFeeds) {\n if (options?.env === 'dev') {\n tx.moveCall({\n target: `${config.oracle.packageId}::oracle_pro::update_single_price`,\n arguments: [\n tx.object('0x6'), // Clock object\n tx.object(config.oracle.oracleConfig), // Oracle configuration\n tx.object(config.oracle.priceOracle), // Price oracle contract\n tx.object(config.oracle.supraOracleHolder), // Supra oracle holder\n tx.object(priceFeed.pythPriceInfoObject), // Pyth price info object\n tx.pure.address(priceFeed.feedId) // Price feed ID\n ]\n })\n } else {\n tx.moveCall({\n target: `${config.oracle.packageId}::oracle_pro::update_single_price_v2`,\n arguments: [\n tx.object('0x6'), // Clock object\n tx.object(config.oracle.oracleConfig), // Oracle configuration\n tx.object(config.oracle.priceOracle), // Price oracle contract\n tx.object(config.oracle.supraOracleHolder), // Supra oracle holder\n tx.object(priceFeed.pythPriceInfoObject), // Pyth price info object\n tx.object(config.oracle.switchboardAggregator),\n tx.pure.address(priceFeed.feedId) // Price feed ID\n ]\n })\n }\n }\n return tx\n}\n\n/**\n * Get all available price feeds from the configuration\n *\n * @param options - Optional environment configuration\n * @returns Array of oracle price feed configurations\n */\nexport async function getPriceFeeds(options?: Partial<EnvOption>): Promise<OraclePriceFeed[]> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n return config.oracle.feeds\n}\n\n/**\n * Filter price feeds based on lending state and pools\n *\n * This function filters price feeds to only include those that are relevant\n * to the current lending state or available pools.\n *\n * @param feeds - Array of price feeds to filter\n * @param filters - Filter criteria including lending state and pools\n * @returns Filtered array of price feeds\n */\nexport function filterPriceFeeds(\n feeds: OraclePriceFeed[],\n filters: {\n lendingState?: UserLendingInfo[]\n pools?: Pool[]\n lendingPositions?: LendingPosition[]\n }\n): OraclePriceFeed[] {\n return feeds.filter((feed) => {\n // Filter by lending state (user's current positions)\n if (filters?.lendingState) {\n const inState = filters.lendingState.find((state) => {\n return state.assetId === feed.assetId\n })\n if (inState) {\n return true\n }\n }\n\n if (filters?.lendingPositions) {\n const inPosition = filters.lendingPositions.find((position) => {\n const availableTypes = [\n 'navi-lending-supply',\n 'navi-lending-borrow',\n 'navi-lending-emode-supply',\n 'navi-lending-emode-borrow'\n ]\n if (!availableTypes.includes(position.type)) {\n return false\n }\n const pool = position[position.type]?.pool\n return pool?.id === feed.assetId\n })\n if (inPosition) {\n return true\n }\n }\n\n // Filter by available pools\n if (filters?.pools) {\n const inPool = filters.pools.find((pool) => {\n return pool.id === feed.assetId\n })\n if (inPool) {\n return true\n }\n }\n return false\n })\n}\n\nexport async function updateOraclePriceBeforeUserOperationPTB(\n tx: Transaction,\n address: string,\n pools: Pool[],\n options?: Partial<\n EnvOption &\n SuiClientOption &\n MarketOption & {\n throws?: boolean\n }\n >\n) {\n try {\n const allPriceFeeds = await getPriceFeeds({\n ...options\n })\n\n const markets = [] as string[]\n\n pools.forEach((pool) => {\n if (!markets.includes(pool.market)) {\n markets.push(pool.market)\n }\n })\n\n const lendingPositions = await getLendingPositions(address, {\n ...options,\n markets\n })\n\n const relevantFeeds = filterPriceFeeds(allPriceFeeds, {\n lendingPositions,\n pools\n })\n\n const updatedTx = await updateOraclePricesPTB(tx, relevantFeeds, {\n updatePythPriceFeeds: true,\n ...options\n })\n return updatedTx\n } catch (e) {\n if (options?.throws) {\n throw e\n }\n console.error(e)\n return tx\n }\n}\n","/**\n * Lending Reward Management for Lending Protocol\n *\n * This module provides comprehensive reward functionality for the lending protocol.\n * It handles reward calculations, claiming, and management for users who participate\n * in lending activities such as supplying assets or borrowing.\n */\n\nimport type {\n SuiClientOption,\n EnvOption,\n LendingRewardSummary,\n LendingReward,\n HistoryClaimedReward,\n LendingClaimedReward,\n TransactionResult,\n AccountCapOption,\n AccountCap,\n MarketOption,\n MarketsOption,\n EModeCap\n} from './types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport {\n suiClient,\n camelize,\n parseDevInspectResult,\n normalizeCoinType,\n withSingleton,\n parseTxValue,\n requestHeaders\n} from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport { getPriceFeeds } from './oracle'\nimport { getPools, depositCoinPTB } from './pool'\nimport BigNumber from 'bignumber.js'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\nimport { getUserEModeCaps } from './emode'\n\nasync function getLendingRewardsBatch(\n address: string,\n tasks: {\n address: string\n market: string\n owner: string\n emodeId?: number\n }[],\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<LendingReward[]> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS),\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n const feeds = await getPriceFeeds(options)\n\n for (let task of tasks) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market: task.market\n })\n tx.moveCall({\n target: `${config.uiGetter}::incentive_v3_getter::get_user_atomic_claimable_rewards`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.storage), // Protocol storage\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.pure.address(task.address) // User address\n ]\n })\n }\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const data = [] as [string[], string[], number[], string[], number[]][]\n\n result?.results?.forEach((item) => {\n data.push(\n parseDevInspectResult<[string[], string[], number[], string[], number[]]>(\n {\n results: [item]\n } as any,\n [\n bcs.vector(bcs.string()), // Asset coin types\n bcs.vector(bcs.string()), // Reward coin types\n bcs.vector(bcs.u8()), // Reward options\n bcs.vector(bcs.Address), // Rule IDs\n bcs.vector(bcs.u256()) // Claimable amounts\n ]\n )\n )\n })\n\n const rewardsList: {\n userClaimableReward: number\n userClaimedReward?: string\n option: number\n ruleIds: string[]\n assetCoinType: string\n rewardCoinType: string\n assetId: number\n market: string\n owner: string\n address: string\n emodeId?: number\n }[] = []\n\n data.forEach((rewardsData, index) => {\n const task = tasks[index]\n if (rewardsData.length === 5 && Array.isArray(rewardsData[0])) {\n const count = rewardsData[0].length\n for (let i = 0; i < count; i++) {\n const feed = feeds.find(\n (feed) => normalizeCoinType(feed.coinType) === normalizeCoinType(rewardsData[1][i])\n )\n const pool = pools.find(\n (pool) =>\n normalizeCoinType(pool.coinType) === normalizeCoinType(rewardsData[0][i]) &&\n pool.market === task.market\n )\n if (!feed || !pool) {\n continue\n }\n rewardsList.push({\n assetId: pool.id,\n assetCoinType: normalizeCoinType(rewardsData[0][i]),\n rewardCoinType: normalizeCoinType(rewardsData[1][i]),\n option: Number(rewardsData[2][i]),\n userClaimableReward: Number(rewardsData[4][i]) / Math.pow(10, feed.priceDecimal),\n ruleIds: Array.isArray(rewardsData[3][i])\n ? (rewardsData[3][i] as any)\n : [rewardsData[3][i]],\n market: task.market,\n owner: task.owner,\n address: task.address,\n emodeId: task.emodeId\n })\n }\n }\n })\n\n return rewardsList\n}\n\n/**\n * Get user's available lending rewards\n *\n * This function retrieves all available rewards for a user from the lending protocol.\n * It uses devInspect to simulate the reward calculation and returns detailed\n * information about claimable rewards for each asset and reward type.\n *\n * @param address - User's wallet address or account cap\n * @param options - Optional client and environment configuration\n * @returns Array of lending rewards available for claiming\n */\nexport async function getUserAvailableLendingRewards(\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption & MarketsOption>\n): Promise<LendingReward[]> {\n const markets = (options?.markets || [MARKETS.main]).map((identity) => {\n return getMarketConfig(identity)\n })\n\n let emodeCaps: EModeCap[] = []\n\n try {\n emodeCaps = await getUserEModeCaps(address, options)\n } catch (e) {\n console.error(e)\n }\n\n const tasks = markets\n .map((market) => {\n return {\n address,\n owner: address,\n market: market.key\n }\n })\n .concat(\n emodeCaps\n .filter((cap) => {\n return !!markets.find((market) => market.id === cap.marketId)\n })\n .map((cap) => {\n const market = getMarketConfig(cap.marketId)\n return {\n address: cap.accountCap,\n owner: address,\n market: market.key,\n emodeId: cap.emodeId\n }\n })\n )\n\n return await getLendingRewardsBatch(address, tasks, options)\n}\n\n/**\n * Summarize lending rewards by asset and reward type\n *\n * This function aggregates rewards by asset ID and reward type, providing\n * a summary view of all available rewards for easier display and management.\n *\n * @param rewards - Array of lending rewards to summarize\n * @returns Array of summarized reward information grouped by asset and type\n */\nexport function summaryLendingRewards(rewards: LendingReward[]): LendingRewardSummary[] {\n // Aggregate rewards by asset ID, reward type, and coin type\n const agg = new Map<\n string,\n { assetId: number; rewardType: number; coinType: string; total: number; market: string }\n >()\n\n rewards.forEach((reward) => {\n const assetId = reward.assetId\n const rewardType = reward.option\n const key = `${assetId}-${rewardType}-${reward.rewardCoinType}-${reward.market}`\n if (agg.has(key)) {\n agg.get(key)!.total += reward.userClaimableReward\n } else {\n agg.set(key, {\n assetId,\n rewardType,\n coinType: reward.rewardCoinType,\n total: Number(reward.userClaimableReward),\n market: reward.market\n })\n }\n })\n\n // Group rewards by asset ID and reward type\n const groupMap = new Map<\n string,\n { assetId: number; rewardType: number; market: string; rewards: Map<string, number> }\n >()\n for (const { assetId, rewardType, coinType, total, market } of agg.values()) {\n const groupKey = `${assetId}-${rewardType}-${market}`\n if (!groupMap.has(groupKey)) {\n groupMap.set(groupKey, { assetId, rewardType, market, rewards: new Map<string, number>() })\n }\n const rewardMap = groupMap.get(groupKey)!\n rewardMap.rewards.set(coinType, (rewardMap.rewards.get(coinType) || 0) + total)\n }\n\n // Convert to summary format\n return Array.from(groupMap.values()).map((group) => ({\n assetId: group.assetId,\n rewardType: group.rewardType,\n market: group.market,\n rewards: Array.from(group.rewards.entries()).map(([coinType, available]) => ({\n coinType,\n available: available.toFixed(6)\n }))\n }))\n}\n\n/**\n * Get user's total claimed rewards in USD value\n *\n * Fetches the total amount of rewards that a user has claimed historically,\n * converted to USD value for easy comparison and display.\n *\n * @param address - User's wallet address or account cap\n * @returns Object containing total claimed rewards in USD\n */\nexport const getUserTotalClaimedReward = withSingleton(\n async (\n address: string | AccountCap,\n options?: Partial<MarketOption>\n ): Promise<{\n USDValue: number\n }> => {\n const url = `https://open-api.naviprotocol.io/api/navi/user/total_claimed_reward?userAddress=${address}&sdk=${packageJson.version}&market=${options?.market || DEFAULT_MARKET_IDENTITY}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n)\n\n/**\n * Get user's claimed reward history\n *\n * Retrieves a paginated list of all rewards that a user has claimed historically.\n * Useful for tracking reward history and generating reports.\n *\n * @param address - User's wallet address or account cap\n * @param options - Pagination options (page number and size)\n * @returns Object containing claimed reward history and pagination cursor\n */\nexport const getUserClaimedRewardHistory = withSingleton(\n async (\n address: string | AccountCap,\n options?: Partial<\n MarketOption & {\n page: number\n size: number\n }\n >\n ): Promise<{\n data: HistoryClaimedReward[]\n cursor?: string\n }> => {\n const endpoint = `https://open-api.naviprotocol.io/api/navi/user/rewards?userAddress=${address}&page=${options?.page || 1}&pageSize=${options?.size || 400}&sdk=${packageJson.version}&market=${options?.market || DEFAULT_MARKET_IDENTITY}`\n const res = await fetch(endpoint, { headers: requestHeaders }).then((res) => res.json())\n return camelize({\n data: res.data.rewards\n })\n }\n)\n\n/**\n * Claim lending rewards in the PTB (Programmable Transaction Block)\n *\n * This function adds operations to a transaction block to claim rewards from the lending protocol.\n * It supports different claiming methods including direct claiming, claiming with\n * account capabilities, and custom coin handling (transfer or deposit).\n *\n * @param tx - The transaction block to add reward claiming operations to\n * @param rewards - Array of rewards to claim\n * @param options - Optional configuration including account capabilities and custom coin handling\n * @param options.customCoinReceive.type - The type of custom coin handling, can be 'transfer', 'depositNAVI' or 'skip'\n * @param options.customCoinReceive.transfer - The address to transfer the reward to, only used when options.customCoinReceive.type is 'transfer'\n * @param options.customCoinReceive.depositNAVI.fallbackReceiveAddress - The address to transfer the reward to if the pool is full, only used when options.customCoinReceive.type is 'depositNAVI'\n * @returns Array of claimed reward coins and their identifiers\n * @throws Error if reward fund not found or invalid configuration\n */\nexport async function claimLendingRewardsPTB(\n tx: Transaction,\n rewards: LendingReward[],\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n customCoinReceive?: {\n type: 'transfer' | 'depositNAVI' | 'skip'\n transfer?: string | TransactionResult\n depositNAVI?: {\n fallbackReceiveAddress?: string\n }\n }\n }\n >\n) {\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS),\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // Group rewards by reward coin type and collect asset IDs and rule IDs\n const rewardMap = new Map<\n string,\n {\n assetIds: string[]\n ruleIds: string[]\n amount: number\n market: string\n owner: string\n address: string\n isEMode: boolean\n }\n >()\n\n for (const reward of rewards) {\n const { rewardCoinType, ruleIds, market, owner, address, emodeId } = reward\n\n const key = `${rewardCoinType}___${address}`\n\n for (const ruleId of ruleIds) {\n if (!rewardMap.has(key)) {\n rewardMap.set(key, {\n assetIds: [],\n ruleIds: [],\n amount: 0,\n market,\n owner,\n address,\n isEMode: typeof emodeId !== 'undefined'\n })\n }\n\n const group = rewardMap.get(key)!\n group.assetIds.push(reward.assetCoinType.replace('0x', ''))\n group.ruleIds.push(ruleId)\n group.amount += reward.userClaimableReward\n }\n }\n\n const rewardCoins = [] as LendingClaimedReward[]\n\n // Process each reward coin type\n for (const [\n rewardCoinType,\n { assetIds, ruleIds, amount, market, owner, address, isEMode }\n ] of rewardMap) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market\n })\n const coinType = rewardCoinType.split('___')[0]\n const pool = pools.find(\n (p) => normalizeCoinType(p.suiCoinType) === normalizeCoinType(coinType) && p.market === market\n )\n if (!pool || !pool.contract.rewardFundId) {\n throw new Error(`No matching rewardFund found for reward coin: ${coinType} ${market}`)\n }\n const matchedRewardFund = pool.contract.rewardFundId\n\n // Validate configuration\n if (options?.accountCap && !options.customCoinReceive) {\n throw new Error('customCoinReceive is required when accountCap is provided')\n }\n\n // Handle custom coin receiving logic\n if (options?.customCoinReceive) {\n let rewardBalance\n\n // Claim rewards with or without account capability\n if (options.accountCap) {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(options.accountCap, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n } else if (isEMode) {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(address, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n } else {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds) // Rule IDs\n ],\n typeArguments: [coinType]\n })\n }\n\n // Convert balance to coin object\n const [rewardCoin]: any = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [rewardBalance],\n typeArguments: [coinType]\n })\n\n // Handle different custom coin receiving types\n if (options?.customCoinReceive.type === 'transfer') {\n if (!options.customCoinReceive.transfer) {\n throw new Error('customCoinReceive.transfer is required')\n }\n tx.transferObjects(\n [rewardCoin],\n parseTxValue(options.customCoinReceive.transfer, tx.pure.address)\n )\n }\n if (options?.customCoinReceive.type === 'depositNAVI') {\n const supplyAmount = BigNumber(pool.totalSupplyAmount).shiftedBy(-9)\n const cap = BigNumber(pool.supplyCapCeiling).shiftedBy(-27)\n\n // if the pool is full, transfer the reward to the fallback receive address\n if (\n supplyAmount.plus(amount).isGreaterThan(cap) &&\n !!options?.customCoinReceive.depositNAVI?.fallbackReceiveAddress\n ) {\n tx.transferObjects(\n [rewardCoin],\n tx.pure.address(options.customCoinReceive.depositNAVI.fallbackReceiveAddress)\n )\n } else {\n await depositCoinPTB(tx, pool, rewardCoin, options)\n }\n } else {\n rewardCoins.push({\n coin: rewardCoin,\n identifier: pool,\n owner,\n isEMode\n })\n }\n } else {\n // Standard reward claiming without custom handling\n if (!!options?.accountCap || isEMode) {\n const rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(options?.accountCap || address, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n\n const [rewardCoin]: any = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [rewardBalance],\n typeArguments: [coinType]\n })\n\n tx.transferObjects(\n [rewardCoin],\n parseTxValue(options?.accountCap || owner, tx.pure.address)\n )\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_entry`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds) // Rule IDs\n ],\n typeArguments: [coinType]\n })\n }\n }\n }\n return rewardCoins\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, ALL_NAVI_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw } from '../utils/format.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\n\n// NAVI SDK expects SuiClient (v1 name), our code uses SuiJsonRpcClient (v2 name).\n// They're the same runtime class, so the cast is safe.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sdkOptions(client: SuiJsonRpcClient): { env: 'prod'; client: any; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean; skipOracle?: boolean },\n): Promise<void> {\n if (options?.skipOracle) return;\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n WAL: 'WAL',\n NAVX: 'NAVX',\n ETH: 'ETH',\n GOLD: 'GOLD',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = (isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0')) / 100;\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of ALL_NAVI_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p: Pool) => {\n const poolSuffix = (p.suiCoinType || p.coinType || '').split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n });\n if (!pool) continue;\n\n const saveApy = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0') / 100;\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0') / 100;\n\n if (saveApy >= 0 && saveApy < 2.0) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 2.0 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 0.04, borrowApy: 0.06 };\n return result;\n } catch {\n return { USDC: { saveApy: 0.04, borrowApy: 0.06 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n // [B5 v2 / 2026-04-30] No fee collection here. SDK + CLI are fee-free by design.\n // Consumer apps (Audric) collect fees by calling `addFeeTransfer(tx, coinObj, ...)`\n // BEFORE invoking this builder. See packages/sdk/src/protocols/protocolFee.ts.\n\n const rawAmount = Math.min(Number(stableToRaw(amount, assetInfo.decimals)), Number(totalBalance));\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coinObj as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // skipPythUpdate=true is required for sponsored builds (Enoki):\n // Pyth's SuiPythClient.updatePriceFeeds uses tx.splitCoins(tx.gas, ...)\n // for the oracle fee. Sponsored txes can't reference tx.gas as an\n // argument — Sui rejects with \"Cannot use GasCoin as a transaction\n // argument\". Skipping the client-side Pyth update still adds NAVI's\n // on-chain `update_single_price_v2` moveCalls, which read Pyth's\n // on-chain state (kept fresh by Pyth keepers ~every 5s for major\n // assets). Self-funded callers (CLI) leave it false to also pay the\n // Pyth fee from tx.gas, maximizing freshness.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // See note on buildWithdrawTx for skipPythUpdate semantics.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n // [B5 v2 / 2026-04-30] No fee collection — see comment in `buildSaveTx`.\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n // skipOracle bypasses oracle entirely (safe for repay — no HF risk; debt\n // reduction never triggers liquidation). skipPythUpdate is the narrower\n // flag — preserves on-chain `update_single_price_v2` calls but skips the\n // tx.gas-using Pyth fee payment. Sponsored callers (Enoki) typically pass\n // skipOracle=true; self-funded callers can leave both undefined.\n // See note on buildWithdrawTx for sponsored-build details.\n options: { asset?: string; skipPythUpdate?: boolean; skipOracle?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address, {\n skipPythUpdate: options.skipPythUpdate,\n skipOracle: options.skipOracle,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // See note on buildWithdrawTx for skipPythUpdate semantics.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n // [B5 v2 / 2026-04-30] No fee collection — consumer apps that want to\n // charge a fee should use `addBorrowToTx` directly, split the fee from\n // the returned coin via `addFeeTransfer`, then transfer the remainder.\n // See packages/sdk/src/protocols/protocolFee.ts.\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\n/**\n * [B5 v2] Add a NAVI borrow to an existing PTB and return the borrowed coin\n * WITHOUT transferring it to the user. Lets consumer apps interpose a fee\n * transfer (split → transfer to treasury) before the final transfer to user.\n *\n * This is the lower-level companion to `buildBorrowTx`. CLI / direct SDK\n * callers should keep using `buildBorrowTx` (it transfers to user automatically\n * and is fee-free); Audric uses this to wedge `addFeeTransfer` between the\n * borrow and the user transfer.\n */\nexport async function addBorrowToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<TransactionObjectArgument> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return borrowedCoin as TransactionObjectArgument;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // skipOracle bypasses oracle entirely (safe for repay — no HF risk).\n // skipPythUpdate is the narrower flag — preserves on-chain\n // `update_single_price_v2` calls but skips the tx.gas-using Pyth fee\n // payment. See note on buildWithdrawTx for sponsored-build details.\n options: { asset?: string; skipOracle?: boolean; skipPythUpdate?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with. Withdraw some savings first to get cash.`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n const rawRequested = Number(stableToRaw(amount, assetInfo.decimals));\n\n if (Number(totalBalance) < rawRequested && Number(totalBalance) < 1000) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Not enough ${assetInfo.displayName} to repay (need $${amount.toFixed(2)}, wallet has ~$${(Number(totalBalance) / 10 ** assetInfo.decimals).toFixed(4)}). Withdraw some savings first.`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Math.min(rawRequested, Number(totalBalance));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\n\n await refreshOracle(tx, client, address, {\n skipOracle: options.skipOracle,\n skipPythUpdate: options.skipPythUpdate,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n let rewards;\n try {\n rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n } catch (err) {\n // [S18-F20] Pre-fix this swallowed every NAVI failure with `return []`,\n // making the engine's claim_rewards tool narrate \"no pending rewards\"\n // when NAVI was actually degraded. Now we throw a typed error so the\n // engine tool can surface \"NAVI degraded — try again in a moment\"\n // (truthful) instead of \"no pending rewards\" (false negative).\n // See `single-source-of-truth.mdc` rule on never silently downgrading\n // vendor degradation.\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI rewards lookup failed: ${msg}`,\n { source: 'navi-rewards-read' },\n true,\n );\n }\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n let rewards;\n try {\n rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n } catch (err) {\n // [S18-F20] See `getPendingRewards` for rationale — silent `return []`\n // here was a primary contributor to the engine's claim_rewards tool\n // narrating \"no pending rewards\" during NAVI degradation. Throw a\n // typed error; the engine tool catches and surfaces a truthful\n // \"NAVI degraded\" message instead.\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI rewards lookup failed: ${msg}`,\n { source: 'navi-rewards-claim-prelude' },\n true,\n );\n }\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n // Capture per-reward metadata from the source `claimable` list before\n // it gets handed to the NAVI PTB builder. We previously stubbed every\n // returned reward as `{ symbol: 'REWARD', amount: 0 }`, which made\n // the engine narrate \"no pending rewards\" / \"Claimed $0.00\" even when\n // the on-chain tx successfully credited e.g. vSUI to the wallet. The\n // PTB builder's return value is just an internal opaque list of move\n // calls — the truth about which assets / amounts were claimed lives\n // in the `claimable` rows we filtered above.\n try {\n await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n } catch (err) {\n // [S18-F20] PTB-build failures are also worth surfacing rather than\n // silently returning empty — the lookup succeeded but the builder\n // (e.g. missing reward fund config) failed.\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI claim PTB build failed: ${msg}`,\n { source: 'navi-rewards-claim-ptb' },\n true,\n );\n }\n\n return aggregateClaimableRewards(claimable);\n}\n\n/**\n * Standalone builder for the `claim_rewards` tool. Wraps the existing\n * `addClaimRewardsToTx` appender into a complete PTB so the SPEC 7\n * `composeTx` registry adapter has a single-step builder it can dispatch\n * to when `claim_rewards` is invoked alone (the chain-mode path uses\n * `addClaimRewardsToTx` directly inside a multi-step PTB).\n *\n * Multi-protocol claim flows (e.g. NAVI + Suilend in a future world)\n * still go through the `T2000` class's `claimRewards()` method, which\n * iterates every registered lending adapter via the adapter registry —\n * this standalone builder is intentionally NAVI-only to keep the shape\n * symmetric with the rest of SPEC 7's Layer 1 builders.\n *\n * Returns `{ tx, rewards }`:\n * - `tx` — built PTB with sender set; if no rewards are claimable, no\n * move calls are appended (caller should skip executing).\n * - `rewards` — what WILL be claimed by `tx`. Empty array means nothing\n * to claim.\n */\nexport async function buildClaimRewardsTx(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<{ tx: Transaction; rewards: PendingReward[] }> {\n const tx = new Transaction();\n tx.setSender(address);\n const rewards = await addClaimRewardsToTx(tx, client, address);\n return { tx, rewards };\n}\n\n/**\n * Minimal shape we read off the NAVI SDK's `LendingReward` rows. Kept\n * structural rather than imported so the tests don't have to reproduce\n * the full upstream type and the function works for any future caller\n * that has the same fields.\n */\nexport interface ClaimableRewardLike {\n userClaimableReward: number | string;\n rewardCoinType: string;\n assetId?: number | string;\n}\n\n/**\n * Aggregate raw NAVI `claimable` rows into the `PendingReward[]` shape\n * the engine surfaces to the LLM and the UI. Aggregates by reward coin\n * type so a user with rewards from multiple pools (e.g. USDC pool + SUI\n * pool both rewarding vSUI) sees a single \"0.0165 vSUI\" line rather\n * than three separate dust entries. Filters out non-finite / non-positive\n * amounts so dust noise can't sneak in as \"$0.00 REWARD\" rows.\n */\nexport function aggregateClaimableRewards(\n claimable: ClaimableRewardLike[],\n): PendingReward[] {\n const aggregated = new Map<string, PendingReward>();\n for (const c of claimable) {\n const coinType = c.rewardCoinType;\n if (!coinType) continue;\n const symbol = coinType.split('::').pop() ?? 'REWARD';\n const amount = Number(c.userClaimableReward);\n if (!Number.isFinite(amount) || amount <= 0) continue;\n\n const existing = aggregated.get(coinType);\n if (existing) {\n existing.amount += amount;\n } else {\n aggregated.set(coinType, {\n protocol: 'navi',\n asset: String(c.assetId ?? ''),\n coinType,\n symbol,\n amount,\n estimatedValueUsd: 0,\n });\n }\n }\n return Array.from(aggregated.values());\n}\n","import type { ProtocolDescriptor } from './types.js';\n\nexport type { ProtocolDescriptor } from './types.js';\n\nexport const naviDescriptor: ProtocolDescriptor = {\n id: 'navi',\n name: 'NAVI Protocol',\n packages: [],\n dynamicPackageId: true,\n actionMap: {\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n PendingReward,\n} from './types.js';\nimport { ALL_NAVI_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport { naviDescriptor as descriptor } from './descriptors.js';\n\nexport class NaviAdapter implements LendingAdapter {\n readonly id = 'navi';\n readonly name = 'NAVI Protocol';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...ALL_NAVI_ASSETS];\n readonly supportsSameAssetBorrow = true;\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n const rates = await naviProtocol.getRates(this.client);\n const normalized = normalizeAsset(asset);\n const r = rates[normalized as keyof typeof rates];\n if (!r) throw new T2000Error('ASSET_NOT_SUPPORTED', `NAVI does not support ${asset}`);\n return { asset: normalized, saveApy: r.saveApy, borrowApy: r.borrowApy };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const result = await naviProtocol.getPositions(this.client, address);\n return {\n supplies: result.positions\n .filter(p => p.type === 'save')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipOracle?: boolean; skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, {\n asset: normalized,\n skipOracle: options?.skipOracle,\n skipPythUpdate: options?.skipPythUpdate,\n });\n return { tx };\n }\n\n async maxWithdraw(address: string, _asset: string) {\n return naviProtocol.maxWithdrawAmount(this.client, address);\n }\n\n async maxBorrow(address: string, _asset: string) {\n return naviProtocol.maxBorrowAmount(this.client, address);\n }\n\n async addWithdrawToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addWithdrawToTx(tx, this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async addSaveToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addSaveToTx(tx, this.client, address, coin, { asset: normalized });\n }\n\n async addBorrowToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<TransactionObjectArgument> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addBorrowToTx(tx, this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addRepayToTx(tx, this.client, address, coin, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n return naviProtocol.getPendingRewards(this.client, address);\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n return naviProtocol.addClaimRewardsToTx(tx, this.client, address);\n }\n}\n"]}
|