@t2000/sdk 1.24.6 → 1.24.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +17 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/token-registry.ts","../../../node_modules/.pnpm/lodash.camelcase@4.3.0/node_modules/lodash.camelcase/index.js","../src/protocols/volo.ts","../src/wallet/coinSelection.ts","../src/protocols/cetus-swap.ts","../src/constants.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.ts","../src/wallet/send.ts","../src/utils/format.ts","../src/wallet/balance.ts","../src/wallet/classify.ts","../src/wallet/history.ts","../src/t2000.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/protocols/yieldTracker.ts","../src/adapters/registry.ts","../src/adapters/navi.ts","../src/adapters/descriptors.ts","../src/safeguards/types.ts","../src/safeguards/errors.ts","../src/safeguards/enforcer.ts","../src/contacts.ts","../src/index.ts","../src/protocols/navi-harvest.ts","../src/composeTx.ts","../src/protocols/protocolFee.ts","../src/protocols/financialSummary.ts","../src/utils/simulate.ts","../src/swap-quote.ts","../src/protocols/suins-leaf.ts"],"names":["map","exports","Symbol","Transaction","allowSwapAll","requested","swapAll","effectiveAmount","coin","SUI_TYPE","T2000Error","selectAndSplitCoin","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","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","claimLendingRewardsPTB","rewards","rewardMap","reward","rewardCoinType","ruleIds","owner","emodeId","ruleId","group","rewardCoins","assetIds","isEMode","matchedRewardFund","rewardBalance","rewardCoin","SuiJsonRpcClient","getJsonRpcFullnodeUrl","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","buildStakeVSuiTx","getVoloStats","buildUnstakeVSuiTx","VSUI_TYPE","findSwapRoute","buildSwapTx","resolveTokenType","USDC_TYPE","adapters","ct","isValidSuiAddress","normalizeSuiAddress"],"mappings":"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AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAC1E,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MACtB,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MACtB,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MACtB,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAC1E,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAC1E,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAA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","file":"index.js","sourcesContent":["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","/**\n * Unified token registry — single source of truth for coin types, decimals, symbols, and tiers.\n *\n * ZERO heavy dependencies. Safe to import from any context (server, browser, Edge).\n *\n * Tier 1: USDC — the financial layer (save, borrow, receive, yield, allowances, marketplace, MPP).\n * Tier 2: 15 curated swap assets — hold, trade, and send only.\n * No tier: Legacy tokens kept for display accuracy (existing NAVI positions). No new operations.\n *\n * To add a new token: add ONE entry to COIN_REGISTRY below. Everything else derives from it.\n * Gate for Tier 2 addition: confirmed deep Cetus liquidity + clear user need.\n */\n\nexport interface CoinMeta {\n type: string;\n decimals: number;\n symbol: string;\n tier?: 1 | 2;\n}\n\n/**\n * Canonical coin registry.\n * Key = user-friendly name (used in swap_execute, CLI, prompts).\n */\nexport const COIN_REGISTRY: Record<string, CoinMeta> = {\n // ── Tier 1 — Financial layer ──────────────────────────────────────────\n USDC: { type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', decimals: 6, symbol: 'USDC', tier: 1 },\n\n // ── Tier 2 — Swap assets (15 tokens) ──────────────────────────────────\n SUI: { type: '0x2::sui::SUI', decimals: 9, symbol: 'SUI', tier: 2 },\n wBTC: { type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC', decimals: 8, symbol: 'wBTC', tier: 2 },\n ETH: { type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH', decimals: 8, symbol: 'ETH', tier: 2 },\n GOLD: { type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM', decimals: 9, symbol: 'GOLD', tier: 2 },\n DEEP: { type: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP', decimals: 6, symbol: 'DEEP', tier: 2 },\n WAL: { type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL', decimals: 9, symbol: 'WAL', tier: 2 },\n NS: { type: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS', decimals: 6, symbol: 'NS', tier: 2 },\n IKA: { type: '0x7262fb2f7a3a14c888c438a3cd9b912469a58cf60f367352c46584262e8299aa::ika::IKA', decimals: 9, symbol: 'IKA', tier: 2 },\n CETUS: { type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS', decimals: 9, symbol: 'CETUS', tier: 2 },\n NAVX: { type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX', decimals: 9, symbol: 'NAVX', tier: 2 },\n vSUI: { type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT', decimals: 9, symbol: 'vSUI', tier: 2 },\n haSUI: { type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI', decimals: 9, symbol: 'haSUI', tier: 2 },\n afSUI: { type: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI', decimals: 9, symbol: 'afSUI', tier: 2 },\n LOFI: { type: '0xf22da9a24ad027cccb5f2d496cbe91de953d363513db08a3a734d361c7c17503::LOFI::LOFI', decimals: 9, symbol: 'LOFI', tier: 2 },\n MANIFEST: { type: '0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST', decimals: 9, symbol: 'MANIFEST', tier: 2 },\n\n // ── Legacy — no tier, kept for display accuracy on existing positions ──\n USDT: { type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT', decimals: 6, symbol: 'USDT' },\n USDe: { type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE', decimals: 6, symbol: 'USDe' },\n USDSUI: { type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI', decimals: 6, symbol: 'USDsui' },\n};\n\n/** Reverse lookup: coin type → CoinMeta. Built once at import time. */\nconst BY_TYPE = new Map<string, CoinMeta>();\nfor (const meta of Object.values(COIN_REGISTRY)) {\n BY_TYPE.set(meta.type, meta);\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Returns the registry metadata for a coin type, or `undefined` if the coin\n * is not in the registry. Use this when you need to distinguish \"known coin\"\n * from \"supported coin\" — `isSupported` only flags tiered (active) coins,\n * but legacy coins like USDsui / USDe / USDT are in the registry without a\n * tier and still need canonical-symbol resolution.\n */\nexport function getCoinMeta(coinType: string): CoinMeta | undefined {\n return BY_TYPE.get(coinType);\n}\n\n/**\n * Returns true if the coin type appears anywhere in COIN_REGISTRY (tier 1, 2,\n * OR legacy/no-tier). Different from `isSupported`, which excludes legacy\n * entries. The blockvision-prices canonical-symbol gate uses this looser\n * check so that USDsui (legacy/no-tier today, but with a registry-canonical\n * mixed-case symbol) still wins over BlockVision's uppercase 'USDSUI'.\n */\nexport function isInRegistry(coinType: string): boolean {\n return BY_TYPE.has(coinType);\n}\n\n// ── Tier helpers ─────────────────────────────────────────────────────────\n\n/** Returns true if the coin type is Tier 1 (USDC — the financial layer). */\nexport function isTier1(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 1;\n}\n\n/** Returns true if the coin type is Tier 2 (curated swap asset). */\nexport function isTier2(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 2;\n}\n\n/** Returns true if the coin type is actively supported (Tier 1 or Tier 2). */\nexport function isSupported(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier !== undefined;\n}\n\n/** Returns the tier for a coin type, or undefined if legacy/unknown. */\nexport function getTier(coinType: string): 1 | 2 | undefined {\n return BY_TYPE.get(coinType)?.tier;\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Get decimals for any coin type. Checks full type match, then suffix match, then defaults to 9.\n * Works for both tiered and legacy tokens.\n */\nexport function getDecimalsForCoinType(coinType: string): number {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.decimals;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.decimals;\n }\n }\n\n return 9;\n}\n\n/**\n * Resolve a full coin type to a user-friendly symbol.\n * Returns the last `::` segment if not in the registry.\n */\nexport function resolveSymbol(coinType: string): string {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.symbol;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.symbol;\n }\n }\n\n return coinType.split('::').pop() ?? coinType;\n}\n\n/**\n * Name → type map for swap resolution. Derived from COIN_REGISTRY.\n * Contains BOTH original-case and UPPERCASE keys for case-insensitive lookup.\n */\nexport const TOKEN_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const [name, meta] of Object.entries(COIN_REGISTRY)) {\n map[name] = meta.type;\n map[name.toUpperCase()] = meta.type;\n }\n return map;\n})();\n\n/**\n * Resolve a user-friendly token name to its full coin type.\n * Returns the input unchanged if already a full coin type (contains \"::\").\n * Case-insensitive: 'usde', 'USDe', 'USDE' all resolve correctly.\n */\nexport function resolveTokenType(nameOrType: string): string | null {\n if (nameOrType.includes('::')) return nameOrType;\n return TOKEN_MAP[nameOrType] ?? TOKEN_MAP[nameOrType.toUpperCase()] ?? null;\n}\n\n/** Common type constants for direct import. */\nexport const SUI_TYPE = COIN_REGISTRY.SUI.type;\nexport const USDC_TYPE = COIN_REGISTRY.USDC.type;\nexport const USDT_TYPE = COIN_REGISTRY.USDT.type;\nexport const USDSUI_TYPE = COIN_REGISTRY.USDSUI.type;\nexport const USDE_TYPE = COIN_REGISTRY.USDe.type;\nexport const ETH_TYPE = COIN_REGISTRY.ETH.type;\nexport const WBTC_TYPE = COIN_REGISTRY.wBTC.type;\nexport const WAL_TYPE = COIN_REGISTRY.WAL.type;\nexport const NAVX_TYPE = COIN_REGISTRY.NAVX.type;\nexport const IKA_TYPE = COIN_REGISTRY.IKA.type;\nexport const LOFI_TYPE = COIN_REGISTRY.LOFI.type;\nexport const MANIFEST_TYPE = COIN_REGISTRY.MANIFEST.type;\n","/**\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","/**\n * VOLO vSUI liquid staking — thin transaction builders.\n * No SDK dependency. Two Move calls, immutable contract addresses.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { SUI_TYPE } from '../token-registry.js';\n\nexport const VOLO_PKG = '0x68d22cf8bdbcd11ecba1e094922873e4080d4d11133e2443fddda0bfd11dae20';\nexport const VOLO_POOL = '0x2d914e23d82fedef1b5f56a32d5c64bdcc3087ccfea2b4d6ea51a71f587840e5';\nexport const VOLO_METADATA = '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60';\nexport const VSUI_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\nexport const SUI_SYSTEM_STATE = '0x05';\nexport const MIN_STAKE_MIST = 1_000_000_000n; // 1 SUI\n\nconst VOLO_STATS_URL = 'https://open-api.naviprotocol.io/api/volo/stats';\n\nexport interface VoloStats {\n apy: number;\n exchangeRate: number;\n tvl: number;\n}\n\n/**\n * Fetch VOLO vSUI staking stats (APY, exchange rate, TVL).\n */\nexport async function getVoloStats(): Promise<VoloStats> {\n const res = await fetch(VOLO_STATS_URL, {\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`VOLO stats API error: HTTP ${res.status}`);\n }\n\n const data = await res.json() as {\n apy?: number;\n exchange_rate?: number;\n exchangeRate?: number;\n tvl?: number;\n data?: { apy?: number; exchange_rate?: number; exchangeRate?: number; tvl?: number };\n };\n\n const d = data.data ?? data;\n\n return {\n apy: d.apy ?? 0,\n exchangeRate: d.exchange_rate ?? d.exchangeRate ?? 1,\n tvl: d.tvl ?? 0,\n };\n}\n\n/**\n * Build a PTB to stake SUI for vSUI.\n */\nexport async function buildStakeVSuiTx(\n _client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint,\n): Promise<Transaction> {\n if (amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${amountMist}`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [suiCoin] = tx.splitCoins(tx.gas, [amountMist]);\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n tx.transferObjects([vSuiCoin], address);\n return tx;\n}\n\n/**\n * Build a PTB to unstake vSUI back to SUI.\n */\nexport async function buildUnstakeVSuiTx(\n client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint | 'all',\n): Promise<Transaction> {\n const coins = await fetchCoinsByType(client, address, VSUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\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\n let vSuiCoin: TransactionObjectArgument;\n if (amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [amountMist]);\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n tx.transferObjects([suiCoin], address);\n return tx;\n}\n\n/**\n * SPEC 7 § \"Layer 1\" Volo stake appender. Two modes.\n *\n * Wallet mode (`inputCoin` omitted): fetches SUI coins from the\n * sender's wallet (paginated), merges/splits to `amountMist`. Mirrors\n * the audric host's `transactions/prepare/route.ts:524-545` volo-stake\n * branch — sponsored-flow safe (does NOT consume `tx.gas`, which\n * belongs to the Enoki sponsor in sponsored flows).\n *\n * For non-sponsored flows where the caller owns `tx.gas`, prefer\n * `buildStakeVSuiTx` directly (it splits from gas, which is more\n * efficient by avoiding the extra getCoins RTT).\n *\n * Chain mode (`inputCoin` provided): consumes the passed-in SUI coin\n * ref entirely. Used for chained flows like \"swap USDC → SUI → stake\".\n * The caller is responsible for splitting upstream if they only want\n * part of the input coin staked.\n *\n * @returns\n * - `coin`: vSUI output coin ref, ready for downstream consumption or\n * wallet transfer (`tx.transferObjects`).\n * - `effectiveAmountMist`: SUI mist consumed (echoes `input.amountMist`\n * in both modes; chain-mode trusts the caller-supplied value since\n * the actual coin balance is opaque).\n */\nexport async function addStakeVSuiToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n amountMist: bigint;\n inputCoin?: TransactionObjectArgument;\n },\n): Promise<{ coin: TransactionObjectArgument; effectiveAmountMist: bigint }> {\n if (input.amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${input.amountMist}`);\n }\n\n let suiCoin: TransactionObjectArgument;\n\n if (input.inputCoin) {\n suiCoin = input.inputCoin;\n } else {\n const coins = await fetchCoinsByType(client, address, SUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No SUI coins found in wallet');\n }\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < input.amountMist) {\n throw new Error(`Insufficient SUI: need ${input.amountMist} MIST, have ${totalBalance}`);\n }\n\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 [suiCoin] = tx.splitCoins(primary, [input.amountMist]);\n }\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n return { coin: vSuiCoin, effectiveAmountMist: input.amountMist };\n}\n\n/**\n * SPEC 7 § \"Layer 1\" Volo unstake appender. Two modes.\n *\n * Wallet mode (`inputCoin` omitted): fetches vSUI coins from the\n * sender's wallet (paginated), merges to a primary coin, splits to\n * `amountMist` (or consumes the entire merged primary if `'all'`).\n *\n * Chain mode (`inputCoin` provided): consumes the passed-in vSUI coin\n * ref. With `amountMist = 'all'`, the entire input coin is unstaked.\n * With a bigint `amountMist`, the input coin is split internally and\n * only that portion unstaked (the leftover stays accessible via the\n * original ref). Used for chained flows where vSUI was just produced\n * by a prior step.\n *\n * @returns\n * - `coin`: SUI output coin ref, ready for downstream consumption\n * (e.g. `addSendToTx`, `addStakeVSuiToTx` re-stake) or wallet\n * transfer (`tx.transferObjects`).\n * - `effectiveAmountMist`: input vSUI mist consumed; echoes\n * `input.amountMist` (`'all'` is preserved as-is — the actual SUI\n * received differs from input vSUI by the pool exchange rate, so\n * callers needing the SUI amount must query `getVoloStats` or\n * parse balance changes from the executed tx).\n */\nexport async function addUnstakeVSuiToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n amountMist: bigint | 'all';\n inputCoin?: TransactionObjectArgument;\n },\n): Promise<{ coin: TransactionObjectArgument; effectiveAmountMist: bigint | 'all' }> {\n let vSuiCoin: TransactionObjectArgument;\n\n if (input.inputCoin) {\n if (input.amountMist === 'all') {\n vSuiCoin = input.inputCoin;\n } else {\n [vSuiCoin] = tx.splitCoins(input.inputCoin, [input.amountMist]);\n }\n } else {\n const coins = await fetchCoinsByType(client, address, VSUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\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\n if (input.amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [input.amountMist]);\n }\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n return { coin: suiCoin, effectiveAmountMist: input.amountMist };\n}\n\n/**\n * Paginated coin lookup by coin type. Local helper shared between\n * `buildUnstakeVSuiTx` (fetches vSUI), `addStakeVSuiToTx` (fetches\n * SUI), and `addUnstakeVSuiToTx` (fetches vSUI). P2.2c may extract\n * a shared `wallet/coinSelection.ts` once `addSendFromWalletToTx` and\n * the registry adapter need the same prelude.\n */\nasync function fetchCoinsByType(\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({\n owner,\n coinType,\n cursor: cursor ?? undefined,\n });\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","/**\n * Wallet-side coin selection helpers — shared paginated coin lookup +\n * merge + split prelude used by every wallet-mode appender that needs\n * a `TransactionObjectArgument` reference to a specific amount of a\n * given coin type.\n *\n * Replaces three earlier inline implementations:\n * - `cetus-swap.ts:fetchAllCoinsForSwap` (deleted 2026-05-02 — addSwapToTx\n * now calls `selectAndSplitCoin` directly so the merge cache is shared\n * across every appender in a multi-write bundle)\n * - `volo.ts:fetchCoinsByType` (kept for backwards-compat, delegates\n * here)\n * - audric host's `transactions/prepare/route.ts:fetchCoinsForSwap`\n * (P2.2c retires this when migrating to `composeTx`)\n *\n * Single source of truth for the \"fetch coins of type X owned by\n * address Y, paginated\" pattern. P2.2b extracts this so `composeTx`'s\n * registry adapters can build a wallet-mode `TransactionObjectArgument`\n * uniformly across save / send / repay / etc. The 2026-05-02 P2.7 fix\n * adds a per-PTB merge cache so multi-write bundles that touch the same\n * coin type twice (swap+save, save+send, etc.) only emit `mergeCoins`\n * once — see `ptbMergeCache` JSDoc below.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\n\nexport interface CoinPage {\n ids: string[];\n totalBalance: bigint;\n}\n\n/**\n * Per-PTB merge cache. Keyed by `(sender|coinType)`, stores the primary\n * coin reference + remaining unconsumed balance.\n *\n * **Why this exists.** Pre-2026-05-02 every appender call re-fetched the\n * sender's coins of `coinType` and re-emitted `mergeCoins(primary,\n * [secondaries])`. That works in a single-write PTB. In a multi-write\n * bundle that touches the same coin type twice (e.g. swap+save+send all\n * spending USDC), the second `mergeCoins` references `Input(secondary)`\n * slots that the FIRST `mergeCoins` already consumed — Enoki's dry-run\n * rejects with `CommandArgumentError { kind: ArgumentWithoutValue }`.\n *\n * The cache makes the first call for `(sender, coinType)` do the full\n * fetch + merge + split, and subsequent calls split from the cached\n * primary directly. No re-fetch, no re-merge, no double-consume.\n *\n * Lives on the `Transaction` instance via a WeakMap so it auto-clears\n * once the PTB is built and the Transaction is GC'd.\n */\nconst ptbMergeCache = new WeakMap<\n Transaction,\n Map<string, { primary: TransactionObjectArgument; remaining: bigint }>\n>();\n\nfunction getMergeCache(tx: Transaction) {\n let cache = ptbMergeCache.get(tx);\n if (!cache) {\n cache = new Map();\n ptbMergeCache.set(tx, cache);\n }\n return cache;\n}\n\n/**\n * Paginated coin lookup. Fetches every coin object of `coinType` owned\n * by `owner` (walks the cursor until `hasNextPage === false`). Returns\n * the list of object IDs + summed balance.\n *\n * Replaces inline `client.getCoins` calls that miss coins on the second\n * page when wallets accumulate many small coin objects (the bug class\n * that bit `buildSendTx` pre-P2.2 — captured for SPEC 12).\n */\nexport async function fetchAllCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<CoinPage> {\n const ids: string[] = [];\n let totalBalance = 0n;\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 for (const c of page.data) {\n ids.push(c.coinObjectId);\n totalBalance += BigInt(c.balance);\n }\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return { ids, totalBalance };\n}\n\nexport interface SelectAndSplitResult {\n /** TransactionObjectArgument for a coin holding `effectiveAmount` raw units. */\n coin: TransactionObjectArgument;\n /** Actual raw amount the returned coin holds. May be < requested if `swapAll` is true. */\n effectiveAmount: bigint;\n /** True iff the request consumed the entire wallet balance (no split needed). */\n swapAll: boolean;\n}\n\n/**\n * Wallet-mode coin selection prelude. Fetches every coin of `coinType`\n * owned by `owner`, merges them into a primary, and splits off the\n * requested `amount` (or returns the merged primary directly if the\n * request meets/exceeds the total balance — `swapAll` semantics).\n *\n * Throws `T2000Error` (`INSUFFICIENT_BALANCE`) when:\n * - No coins of `coinType` exist for `owner`\n * - `amount` is bigger than the total balance AND the caller did NOT\n * opt into `swapAll: true` clipping\n *\n * Used by:\n * - `composeTx` registry adapters (save_deposit, send_transfer,\n * repay_debt — non-SUI assets) for the wallet-mode prelude\n * - Layer 1 dual-mode appenders (`addSwapToTx`, `addStakeVSuiToTx`,\n * `addUnstakeVSuiToTx`) when `inputCoin` is omitted\n *\n * @param tx — PTB to append `mergeCoins` + `splitCoins` commands to.\n * @param client — Sui RPC client for the paginated `getCoins` lookup.\n * @param owner — wallet address whose coins to fetch.\n * @param coinType — fully-qualified Sui coin type\n * (`\"0x...::usdc::USDC\"`).\n * @param amount — raw amount to split out (in MIST / smallest unit).\n * Pass `'all'` to consume the entire merged primary directly.\n * @param options.allowSwapAll — if true (default), `amount` >=\n * totalBalance auto-clips to total (matches audric host's swap\n * branch). If false, throws `INSUFFICIENT_BALANCE` when over.\n *\n * @returns\n * - `coin` — `TransactionObjectArgument` ready for downstream\n * consumption (e.g. `addSaveToTx`, `tx.transferObjects`).\n * - `effectiveAmount` — the raw amount the returned coin actually\n * holds (handles swapAll clipping).\n * - `swapAll` — true iff the entire merged primary was consumed.\n */\nexport async function selectAndSplitCoin(\n tx: Transaction,\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n amount: bigint | 'all',\n options: { allowSwapAll?: boolean } = {},\n): Promise<SelectAndSplitResult> {\n const cache = getMergeCache(tx);\n const cacheKey = `${owner}|${coinType}`;\n const cached = cache.get(cacheKey);\n\n // Fast path — second+ call for this (sender, coinType) inside the same PTB.\n // First call already merged all on-chain coin objects into a single primary\n // and stashed it in the cache; we just split off another chunk here. No RPC\n // re-fetch, no re-emitted MergeCoins (which would reference already-consumed\n // input slots and trip Enoki's dry-run with ArgumentWithoutValue — the\n // P2.7 multi-write bundle bug).\n if (cached) {\n const allowSwapAll = options.allowSwapAll ?? true;\n if (amount !== 'all' && amount > cached.remaining && !allowSwapAll) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance for ${coinType}`, {\n available: cached.remaining.toString(),\n required: amount.toString(),\n });\n }\n const requested = amount === 'all' ? cached.remaining : amount;\n const swapAll = amount === 'all' || requested >= cached.remaining;\n const effectiveAmount = swapAll ? cached.remaining : requested;\n\n // `swapAll` from a cached primary means \"consume the whole remainder\" —\n // callers that pass 'all' (or oversize amount with allowSwapAll) get the\n // primary itself, leaving the cache slot drained for any future caller.\n const coin = swapAll ? cached.primary : tx.splitCoins(cached.primary, [effectiveAmount])[0];\n cached.remaining = swapAll ? 0n : cached.remaining - effectiveAmount;\n return { coin, effectiveAmount, swapAll };\n }\n\n // Slow path — first call for this (sender, coinType).\n const { ids, totalBalance } = await fetchAllCoins(client, owner, coinType);\n if (ids.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No coins found for ${coinType}`);\n }\n\n const allowSwapAll = options.allowSwapAll ?? true;\n\n if (amount !== 'all' && amount > totalBalance && !allowSwapAll) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance for ${coinType}`, {\n available: totalBalance.toString(),\n required: amount.toString(),\n });\n }\n\n const requested = amount === 'all' ? totalBalance : amount;\n const swapAll = amount === 'all' || requested >= totalBalance;\n const effectiveAmount = swapAll ? totalBalance : requested;\n\n const primary = tx.object(ids[0]);\n if (ids.length > 1) {\n tx.mergeCoins(primary, ids.slice(1).map((id) => tx.object(id)));\n }\n\n const coin = swapAll ? primary : tx.splitCoins(primary, [effectiveAmount])[0];\n\n // Cache the primary + remaining balance for any subsequent caller in the\n // same PTB. If the first caller drained everything (`swapAll`), remaining\n // is 0 and the next caller will hit INSUFFICIENT_BALANCE — which is\n // correct: the primary has no value left to split.\n cache.set(cacheKey, {\n primary,\n remaining: swapAll ? 0n : totalBalance - effectiveAmount,\n });\n\n return { coin, effectiveAmount, swapAll };\n}\n\n/**\n * SUI-specific coin selection. Branches on sponsorship context:\n *\n * - **Sponsored (`sponsoredContext: true`)** — fetches SUI coins via\n * `getCoins` and merges/splits, because `tx.gas` belongs to the\n * Enoki sponsor (NOT the user) under sponsored flows. Same shape as\n * `selectAndSplitCoin` for any other coin type.\n *\n * - **Self-funded (`sponsoredContext: false`)** — splits from `tx.gas`\n * directly (the user's gas coin IS their SUI). More efficient — no\n * getCoins RTT.\n *\n * Captures the SUI-vs-other-asset divergence that lives inline in\n * `buildSendTx` today (`tx.splitCoins(tx.gas, ...)` vs paginated\n * lookup). composeTx's `send_transfer` adapter routes through this\n * helper to handle both.\n */\nexport async function selectSuiCoin(\n tx: Transaction,\n client: SuiJsonRpcClient,\n owner: string,\n amountMist: bigint,\n sponsoredContext: boolean,\n): Promise<SelectAndSplitResult> {\n if (sponsoredContext) {\n const { SUI_TYPE } = await import('../token-registry.js');\n return selectAndSplitCoin(tx, client, owner, SUI_TYPE, amountMist);\n }\n\n const [coin] = tx.splitCoins(tx.gas, [amountMist]);\n return { coin, effectiveAmount: amountMist, swapAll: false };\n}\n","/**\n * Cetus Aggregator V3 SDK wrapper — the ONLY file that imports @cetusprotocol/aggregator-sdk.\n * Documented CLAUDE.md exception: multi-DEX routing cannot be feasibly replaced by thin tx builders.\n *\n * [B5 v2 / @t2000/sdk@1.1.0 / 2026-04-30]\n * Overlay fee config is now per-call instead of a module-level singleton. CLI / direct\n * SDK callers (`T2000.swap()`) DON'T pass `overlayFee` → fee-free swap. Audric's\n * prepare/route.ts ALWAYS passes `overlayFee = { rate: OVERLAY_FEE_RATE, receiver:\n * T2000_OVERLAY_FEE_WALLET }` → fee charged. Structural inclusion (Audric's code can't\n * forget to pass it because it IS the code), not a toggle that defaults to safe.\n *\n * Pre-1.1.0: a module-level `OVERLAY_FEE_RECEIVER` constant defaulted to a Move object\n * ID. USDC sent there became OwnedObjects keyed to the object and was inaccessible.\n * Fixed by making the receiver a regular wallet address (T2000_OVERLAY_FEE_WALLET) AND\n * by removing the singleton pattern that hid the misconfig.\n */\nimport { AggregatorClient, Env, type FindRouterParams, type RouterDataV3 } from '@cetusprotocol/aggregator-sdk';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { resolveTokenType, getDecimalsForCoinType } from '../token-registry.js';\n\nexport interface OverlayFeeConfig {\n /** Fee rate as a fraction (e.g. 0.001 = 0.1%). Pass 0 to disable. */\n rate: number;\n /** Wallet address that receives the overlay fee. */\n receiver: string;\n}\n\nexport interface SwapRouteResult {\n routerData: RouterDataV3;\n amountIn: string;\n amountOut: string;\n byAmountIn: boolean;\n priceImpact: number;\n insufficientLiquidity: boolean;\n}\n\n/**\n * Default Audric swap overlay fee — 0.1%. Exported for consumers that want to use\n * the canonical Audric rate (the Audric prepare-route does this). Changing this\n * rate requires a coordinated SDK + audric release.\n */\nexport const OVERLAY_FEE_RATE = 0.001;\n\n/**\n * Cache `AggregatorClient` instances by `(signer + overlay rate + overlay receiver)`.\n * Per-call instantiation is cheap (the client is mostly config), but caching avoids\n * pointless re-allocation when the same caller swaps multiple times in a loop.\n */\nconst clientCache = new Map<string, AggregatorClient>();\n\nfunction getClient(walletAddress: string, overlayFee?: OverlayFeeConfig): AggregatorClient {\n const rate = overlayFee?.rate ?? 0;\n const receiver = overlayFee?.receiver ?? '';\n const key = `${walletAddress}|${rate}|${receiver}`;\n\n const cached = clientCache.get(key);\n if (cached) return cached;\n\n const client = new AggregatorClient({\n signer: walletAddress,\n env: Env.Mainnet,\n ...(rate > 0 && receiver\n ? { overlayFeeRate: rate, overlayFeeReceiver: receiver }\n : {}),\n });\n clientCache.set(key, client);\n return client;\n}\n\n/**\n * Find the optimal swap route via Cetus Aggregator REST API.\n *\n * Pass `overlayFee` to charge an overlay fee on the output (Audric's pattern).\n * Omit it for a fee-free swap (CLI / direct SDK pattern).\n */\nexport async function findSwapRoute(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: bigint;\n byAmountIn: boolean;\n overlayFee?: OverlayFeeConfig;\n /**\n * Optional Cetus provider allow-list. When omitted, all 30+ DEXes\n * are eligible. Sponsored flows (Enoki) MUST pass an exclusion list\n * computed via `getProvidersExcluding([...])` from the Cetus SDK to\n * remove Pyth-dependent providers (HAEDALPMM, METASTABLE, OBRIC,\n * STEAMM_OMM, STEAMM_OMM_V2, SEVENK, HAEDALHMMV2) — those reference\n * `tx.gas` for oracle fees, which Enoki rejects in sponsored txs.\n * Non-sponsored callers (CLI, direct SDK) leave this undefined.\n */\n providers?: string[];\n}): Promise<SwapRouteResult | null> {\n const client = getClient(params.walletAddress, params.overlayFee);\n\n const findParams: FindRouterParams = {\n from: params.from,\n target: params.to,\n amount: params.amount.toString(),\n byAmountIn: params.byAmountIn,\n ...(params.providers ? { providers: params.providers } : {}),\n };\n\n const routerData = await client.findRouters(findParams);\n if (!routerData) return null;\n\n if (routerData.insufficientLiquidity) {\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: normalizePriceImpact(routerData.deviationRatio),\n insufficientLiquidity: true,\n };\n }\n\n if (routerData.error) {\n const { T2000Error } = await import('../errors.js');\n throw new T2000Error('SWAP_FAILED', `Cetus routing error: ${routerData.error.msg} (code ${routerData.error.code})`);\n }\n\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: normalizePriceImpact(routerData.deviationRatio),\n insufficientLiquidity: false,\n };\n}\n\n/**\n * Cetus' aggregator types `deviationRatio` as `number`, but in some routes\n * the router actually returns a string (\"0.001234\"). The SDK type lies, so we\n * always coerce to a finite number here (NaN/null/undefined → 0). Without\n * this every downstream consumer that calls `priceImpact.toFixed(...)` will\n * crash at runtime — including the Audric SwapQuoteCard, which takes the\n * whole chat UI down through its error boundary.\n */\nfunction normalizePriceImpact(value: unknown): number {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * Build a swap PTB from a route result. The caller must provide an input coin\n * obtained by splitting/merging wallet coins.\n *\n * **Important:** Cetus's `routerSwap` reads the overlay-fee config from the\n * AggregatorClient instance. The `overlayFee` param here MUST match the one\n * passed to `findSwapRoute` for the same swap (otherwise you'll hit the cache\n * boundary and get a different client with different overlay config).\n */\nexport async function buildSwapTx(params: {\n walletAddress: string;\n route: SwapRouteResult;\n tx: Transaction;\n inputCoin: TransactionObjectArgument;\n slippage: number;\n overlayFee?: OverlayFeeConfig;\n}): Promise<TransactionObjectArgument> {\n const client = getClient(params.walletAddress, params.overlayFee);\n const clampedSlippage = Math.max(0.001, Math.min(params.slippage, 0.05));\n\n const outputCoin = await client.routerSwap({\n router: params.route.routerData,\n inputCoin: params.inputCoin,\n slippage: clampedSlippage,\n txb: params.tx,\n });\n\n return outputCoin;\n}\n\n/**\n * Append a swap fragment to an existing PTB. SPEC 7 § \"Layer 1\" Cetus\n * appender. Two modes, dispatched by the presence of `input.inputCoin`:\n *\n * - **Wallet mode** (`inputCoin` omitted) — fetches `from`-asset coins\n * from the sender's wallet (paginated), merges/splits to the\n * requested amount, runs the swap. Mirrors the audric host's\n * `transactions/prepare/route.ts` swap branch (P2.2c will retire that\n * branch in favor of this appender via `composeTx`).\n *\n * - **Chain mode** (`inputCoin` provided) — consumes the passed-in coin\n * reference (typically produced by an upstream appender like\n * `addWithdrawToTx`) directly, no wallet fetch / no merge / no\n * split. This is the SPEC 7 multi-write enabler (\"withdraw → swap →\n * save\" without intermediate wallet materialization).\n *\n * **SUI in wallet mode:** uses `client.getCoins` like every other\n * token. This works for sponsored flows (Enoki — `tx.gas` belongs to\n * the sponsor, swap input comes from the user's separate SUI coin\n * objects). For non-sponsored flows where `tx.gas` IS the user's SUI,\n * the caller should pre-build the inputCoin via\n * `tx.splitCoins(tx.gas, [rawAmount])[0]` and pass it via chain mode\n * instead. (`T2000.swap()` already handles this internally — direct SDK\n * users go through the high-level class, not through this appender.)\n *\n * **`swapAll` semantics (wallet mode):** if the requested raw amount\n * is >= the wallet's total `from` balance, the appender consumes the\n * entire merged primary coin (not a split), matching audric's host\n * route's `swapAll` clipping. The returned `effectiveAmountIn` reflects\n * the actual consumed amount in display units.\n *\n * **Slippage:** clamped to [0.001, 0.05] (0.1% – 5%). Defaults to 0.01.\n *\n * @returns\n * - `coin` — output coin reference, ready for downstream consumption\n * (e.g. `addSaveToTx`) or wallet transfer (`tx.transferObjects`).\n * - `effectiveAmountIn` — display-units input amount the swap actually\n * consumes (handles `swapAll` clipping in wallet mode; in chain mode\n * echoes the requested `input.amount`).\n * - `expectedAmountOut` — display-units output amount per the route\n * quote. Actual on-chain output may differ within slippage.\n * - `route` — raw `SwapRouteResult` for downstream telemetry / logging.\n */\nexport async function addSwapToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n from: string;\n to: string;\n amount: number;\n slippage?: number;\n byAmountIn?: boolean;\n overlayFee?: OverlayFeeConfig;\n inputCoin?: TransactionObjectArgument;\n /**\n * Optional Cetus provider allow-list. Forwarded to `findSwapRoute`.\n * Sponsored flows (Enoki) MUST pass `getProvidersExcluding([...])`\n * to remove Pyth-dependent providers — see `findSwapRoute`'s JSDoc\n * for the exclusion list. Non-sponsored callers omit this.\n */\n providers?: string[];\n },\n): Promise<{\n coin: TransactionObjectArgument;\n effectiveAmountIn: number;\n expectedAmountOut: number;\n route: SwapRouteResult;\n}> {\n const { T2000Error } = await import('../errors.js');\n\n const fromType = resolveTokenType(input.from);\n const toType = resolveTokenType(input.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${input.from}. Provide the symbol (USDC, SUI, ...) or full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${input.to}. Provide the symbol (USDC, SUI, ...) or full coin type.`);\n if (fromType === toType) throw new T2000Error('SWAP_FAILED', 'Cannot swap a token to itself');\n if (!Number.isFinite(input.amount) || input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n }\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const toDecimals = getDecimalsForCoinType(toType);\n const requestedRaw = BigInt(Math.floor(input.amount * 10 ** fromDecimals));\n\n const slippage = Math.max(0.001, Math.min(input.slippage ?? 0.01, 0.05));\n const byAmountIn = input.byAmountIn ?? true;\n\n let inputCoin: TransactionObjectArgument;\n let effectiveRaw: bigint;\n\n if (input.inputCoin) {\n inputCoin = input.inputCoin;\n effectiveRaw = requestedRaw;\n } else {\n // Delegate to the canonical wallet-mode prelude. Critically, this path\n // shares a per-PTB merge cache with every other appender via\n // `selectAndSplitCoin` — when a multi-write bundle includes\n // `swap_execute` alongside `save_deposit`/`send_transfer` of the same\n // input asset (e.g. swap+save+send all from USDC), the second/third\n // appender hits the cache and splits from the already-merged primary\n // instead of re-emitting `mergeCoins` on consumed input slots. That's\n // the P2.7 multi-write bundle fix landed 2026-05-02.\n const { selectAndSplitCoin } = await import('../wallet/coinSelection.js');\n const result = await selectAndSplitCoin(tx, client, address, fromType, requestedRaw);\n inputCoin = result.coin;\n effectiveRaw = result.effectiveAmount;\n }\n\n const route = await findSwapRoute({\n walletAddress: address,\n from: fromType,\n to: toType,\n amount: effectiveRaw,\n byAmountIn,\n overlayFee: input.overlayFee,\n providers: input.providers,\n });\n\n if (!route) {\n throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${input.from} → ${input.to}`);\n }\n if (route.insufficientLiquidity) {\n throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${input.from} → ${input.to}`);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: address,\n route,\n tx,\n inputCoin,\n slippage,\n overlayFee: input.overlayFee,\n });\n\n return {\n coin: outputCoin,\n effectiveAmountIn: Number(effectiveRaw) / 10 ** fromDecimals,\n expectedAmountOut: Number(route.amountOut) / 10 ** toDecimals,\n route,\n };\n}\n\n/**\n * Simulate a swap transaction without executing it.\n */\nexport async function simulateSwap(params: {\n walletAddress: string;\n tx: Transaction;\n overlayFee?: OverlayFeeConfig;\n}): Promise<{ success: boolean; error?: string }> {\n const client = getClient(params.walletAddress, params.overlayFee);\n try {\n await client.devInspectTransactionBlock(params.tx);\n return { success: true };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// Re-export from the canonical token registry for backward-compat.\nexport { TOKEN_MAP, resolveTokenType } from '../token-registry.js';\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 { SuiJsonRpcClient, getJsonRpcFullnodeUrl } from '@mysten/sui/jsonRpc';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiJsonRpcClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiJsonRpcClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiJsonRpcClient({ url, network: 'mainnet' });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiJsonRpcClient {\n return new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl(network), network });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Normalize a Sui coin type to its canonical long-form 64-hex address.\n * `0x2::sui::SUI` → `0x0000…0002::sui::SUI`. Idempotent on already-long\n * forms. Returns the input unchanged if it doesn't look like a coin type\n * (`<address>::<module>::<name>`) so callers can pass arbitrary strings\n * without crashing.\n *\n * Why this exists: BlockVision's `/v2/sui/coin/price/list` endpoint\n * silently returns an empty `prices` map for short-form coin types\n * (notably `0x2::sui::SUI` — the native gas coin). Internal callers must\n * pass the long form, but external callers (LLM tool args, cached\n * coin-type strings, audit logs) commonly use the short form. Normalize\n * before the network call, denormalize back to the caller's input shape\n * after, and short/long become interchangeable.\n */\nexport function normalizeCoinType(coinType: string): string {\n const parts = coinType.split('::');\n if (parts.length !== 3) return coinType;\n const [addr, mod, name] = parts;\n if (!addr.startsWith('0x')) return coinType;\n return `${normalizeSuiAddress(addr)}::${mod}::${name}`;\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'node:crypto';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from '../errors.js';\nimport { DEFAULT_KEY_PATH } from '../constants.js';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst SCRYPT_N = 2 ** 14; // 16384 — secure and fast enough\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SALT_LENGTH = 32;\nconst IV_LENGTH = 16;\n\ninterface EncryptedKey {\n version: 1;\n algorithm: typeof ALGORITHM;\n salt: string;\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, 32, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P });\n}\n\nfunction encrypt(data: Buffer, passphrase: string): EncryptedKey {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 1,\n algorithm: ALGORITHM,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: tag.toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n };\n}\n\nfunction decrypt(encrypted: EncryptedKey, passphrase: string): Buffer {\n const salt = Buffer.from(encrypted.salt, 'hex');\n const key = deriveKey(passphrase, salt);\n const iv = Buffer.from(encrypted.iv, 'hex');\n const tag = Buffer.from(encrypted.tag, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n try {\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n } catch {\n throw new T2000Error('WALLET_LOCKED', 'Invalid PIN');\n }\n}\n\nexport function generateKeypair(): Ed25519Keypair {\n return Ed25519Keypair.generate();\n}\n\nexport function keypairFromPrivateKey(privateKey: string): Ed25519Keypair {\n if (privateKey.startsWith('suiprivkey')) {\n const decoded = decodeSuiPrivateKey(privateKey);\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n }\n const bytes = Buffer.from(privateKey.replace(/^0x/, ''), 'hex');\n return Ed25519Keypair.fromSecretKey(bytes);\n}\n\nexport async function saveKey(\n keypair: Ed25519Keypair,\n passphrase: string,\n keyPath?: string,\n): Promise<string> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n try {\n await access(filePath);\n throw new T2000Error('WALLET_EXISTS', `Wallet already exists at ${filePath}`);\n } catch (error) {\n if (error instanceof T2000Error) throw error;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const bech32Key = keypair.getSecretKey();\n const encrypted = encrypt(Buffer.from(bech32Key, 'utf-8'), passphrase);\n\n await writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n\n return filePath;\n}\n\nexport async function loadKey(passphrase: string, keyPath?: string): Promise<Ed25519Keypair> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n throw new T2000Error('WALLET_NOT_FOUND', `No wallet found at ${filePath}`);\n }\n\n const encrypted: EncryptedKey = JSON.parse(content);\n const decrypted = decrypt(encrypted, passphrase);\n const bech32Key = decrypted.toString('utf-8');\n const decoded = decodeSuiPrivateKey(bech32Key);\n\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n}\n\nexport async function walletExists(keyPath?: string): Promise<boolean> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function exportPrivateKey(keypair: Ed25519Keypair): string {\n return keypair.getSecretKey();\n}\n\nexport function getAddress(keypair: Ed25519Keypair): string {\n return keypair.getPublicKey().toSuiAddress();\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiJsonRpcClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\n/**\n * Fragment-appender for the chain-mode send leg of SPEC 7 multi-write\n * Payment Intents. Consumes a coin reference produced by a previous\n * appender (e.g. `addWithdrawToTx`, `addSwapToTx`) and transfers it to\n * `recipient` within the same Payment Intent — no intermediate wallet\n * materialization.\n *\n * Codifies the hand-built send leg from\n * `scripts/smoke-spec7-withdraw-then-send.ts` (P2.1) into a typed\n * appender. SPEC 7 § \"Layer 1\" — P2.2b will register this in the\n * `WRITE_APPENDER_REGISTRY` under `send_transfer` for chain-mode\n * dispatch; the registry adapter will handle the wallet-fetch fallback\n * by delegating to `buildSendTx` when no upstream coin is available.\n *\n * For single-step send_transfer flows (no chained predecessor), use\n * `buildSendTx` directly — it builds a complete tx including the\n * wallet-coin selection / merge / split prelude.\n *\n * @returns void — the coin is consumed by `tx.transferObjects`. Callers\n * that need the post-transfer \"effective amount\" should rely on the\n * upstream appender's `effectiveAmount` (e.g. `addWithdrawToTx`'s\n * return), not on this appender.\n */\nexport function addSendToTx(\n tx: Transaction,\n coin: TransactionObjectArgument,\n recipient: string,\n): void {\n const validRecipient = validateAddress(recipient);\n tx.transferObjects([coin], validRecipient);\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { StableAsset } from '../constants.js';\nimport type { BalanceResponse } from '../types.js';\n\nconst SUI_PRICE_FALLBACK = 1.0;\nlet _cachedSuiPrice = 0;\nlet _priceLastFetched = 0;\nconst PRICE_CACHE_TTL_MS = 60_000;\n\n/**\n * Fetch SUI price in USD from the Cetus USDC/SUI pool's sqrt_price.\n *\n * Pool is Pool<USDC, SUI> so coin_a = USDC (6 dec), coin_b = SUI (9 dec).\n * current_sqrt_price (Q64 fixed-point) encodes sqrt(raw_price) where\n * raw_price = SUI_raw / USDC_raw.\n *\n * USDC per SUI = 10^(decimals_a - decimals_b) / raw_price\n * = 10^(6-9) / raw_price\n * = 1 / (raw_price * 1000)\n *\n * Equivalently: 1000 / raw_price\n */\nasync function fetchSuiPrice(client: SuiJsonRpcClient): Promise<number> {\n const now = Date.now();\n if (_cachedSuiPrice > 0 && now - _priceLastFetched < PRICE_CACHE_TTL_MS) {\n return _cachedSuiPrice;\n }\n\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const currentSqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n\n if (currentSqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtPriceFloat = Number(currentSqrtPrice) / Number(Q64);\n const rawPrice = sqrtPriceFloat * sqrtPriceFloat;\n const price = 1000 / rawPrice;\n if (price > 0.01 && price < 1000) {\n _cachedSuiPrice = price;\n _priceLastFetched = now;\n }\n }\n }\n } catch {\n // Use cached/fallback price\n }\n\n return _cachedSuiPrice || SUI_PRICE_FALLBACK;\n}\n\nexport async function queryBalance(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<BalanceResponse> {\n const stableBalancePromises = STABLE_ASSETS.map((asset) =>\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS[asset].type })\n .then((b) => ({ asset, amount: Number(b.totalBalance) / 10 ** SUPPORTED_ASSETS[asset].decimals }))\n .catch(() => ({ asset, amount: 0 })),\n );\n\n const [suiBalance, suiPriceUsd, ...stableResults] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ...stableBalancePromises,\n ]);\n\n const stables = {} as Record<StableAsset, number>;\n let totalStables = 0;\n for (const { asset, amount } of stableResults) {\n stables[asset] = amount;\n totalStables += amount;\n }\n\n const suiAmount = Number(suiBalance.totalBalance) / Number(MIST_PER_SUI);\n const savings = 0; // Merged from NAVI in T2000.balance()\n const usdEquiv = suiAmount * suiPriceUsd;\n const total = totalStables + savings + usdEquiv;\n\n return {\n available: totalStables,\n savings,\n debt: 0,\n pendingRewards: 0,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n stables,\n };\n}\n","/**\n * Shared transaction classifier.\n *\n * Consumed by both the SDK's `parseTxRecord` (production agent path) and\n * the engine's `transaction_history` tool (cold-start RPC path). Keeping\n * a single source of truth here prevents the two paths from drifting —\n * see v1.5.3 regression where the SDK path was emitting `action:\n * 'transaction'` (rendered as \"On-chain\") while the engine path was\n * already producing fine-grained labels.\n */\n\nimport { getDecimalsForCoinType, resolveSymbol, SUI_TYPE } from '../token-registry.js';\n\n/**\n * Coarse action bucket — one of `'send' | 'lending' | 'swap' |\n * 'transaction'`. Used by the ACI `action` filter on the\n * `transaction_history` tool. STABLE: downstream queries depend on\n * exactly these values.\n *\n * Order matters: more specific buckets first. Lending patterns precede\n * swap patterns so a NAVI `::swap` helper (if one ever existed) would\n * still bucket as lending.\n */\nexport const KNOWN_TARGETS: readonly [RegExp, string][] = [\n [/::suilend|::obligation/, 'lending'],\n [/::navi|::lending_core|::incentive_v\\d+|::oracle_pro/, 'lending'],\n /**\n * DEX modules — both direct calls and aggregator legs. The Cetus\n * aggregator dispatches through a per-DEX module (e.g.\n * `cetus::swap`, `flowx_amm::swap`, `aftermath::swap`, …) plus\n * router glue functions. We list every DEX module the aggregator\n * supports today so a single-DEX call still classifies cleanly.\n */\n [/::cetus(?:_dlmm)?::|::pool::|::deepbook|::flowx_(?:amm|clmm)::|::kriya_(?:amm|clmm)::|::turbos::|::aftermath::|::afsui::|::bluefin::|::bluemove::|::ferra_(?:clmm|dlmm)::|::haedal_hmm::|::hasui::|::hawal::|::magma::|::momentum::|::obric::|::springsui::|::steamm_cpmm::|::fullsail::|::alphafi::|::volo_swap::/, 'swap'],\n /**\n * Cetus aggregator router glue. These are the swap-context and\n * balance-handling helpers the aggregator emits around per-DEX\n * legs. Without this entry a tx that ONLY had router calls\n * (theoretically possible for setup/cleanup) would slip through;\n * in practice these always coexist with a DEX leg, but the entry\n * is cheap insurance.\n */\n [/::router::(?:new_swap_context(?:_v)?|confirm_swap|transfer_balance|take_balance|transfer_or_destroy_coin)/, 'swap'],\n [/::transfer::public_transfer/, 'send'],\n];\n\n/**\n * Finer-grained display labels — derived from MoveCall function names.\n * The card renders `label ?? action`, so when this map matches we get\n * \"Deposit\" / \"Withdraw\" / \"Borrow\" / \"Repay\" / \"Payment link\" instead\n * of the generic \"Lending\" or \"Transaction\".\n *\n * Order matters: more specific patterns first. Each entry is\n * (regex, label) where the regex is matched against the\n * fully-qualified MoveCall target `pkg::module::function`.\n */\nexport const LABEL_PATTERNS: readonly [RegExp, string][] = [\n [/::pay(?:ment_kit|_kit)?::|::create_payment_link|::pay_link/, 'payment_link'],\n [/::create_invoice|::invoice::/, 'invoice'],\n [/::deposit|::supply|::mint_ctokens/, 'deposit'],\n [/::withdraw|::redeem|::redeem_ctokens/, 'withdraw'],\n [/::borrow/, 'borrow'],\n [/::repay/, 'repay'],\n [/::claim_reward|::claim::|::claim_incentive/, 'claim'],\n [/::stake/, 'stake'],\n [/::unstake|::burn::/, 'unstake'],\n [/::liquidate/, 'liquidate'],\n];\n\nexport interface ClassifyBalanceChange {\n owner: { AddressOwner?: string } | string;\n coinType: string;\n amount: string;\n}\n\nfunction resolveOwner(owner: ClassifyBalanceChange['owner']): string | null {\n if (typeof owner === 'object' && owner.AddressOwner) return owner.AddressOwner;\n if (typeof owner === 'string') return owner;\n return null;\n}\n\nexport function classifyAction(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of KNOWN_TARGETS) {\n if (pattern.test(target)) return label;\n }\n }\n if (commandTypes.includes('TransferObjects') && !commandTypes.includes('MoveCall')) return 'send';\n return 'transaction';\n}\n\n/**\n * Last-resort fallback when neither `LABEL_PATTERNS` nor the action\n * bucket produces something useful.\n *\n * Returns the first MoveCall's *module* name (e.g. \"navi\", \"spam\") so\n * the card shows something better than the literal word \"transaction\".\n * When no MoveCall exists, returns 'on-chain'.\n *\n * Note: callers should prefer `classifyLabel` which now layers\n * pattern-match → coarse action → module name (see commentary there).\n */\nexport function fallbackLabel(targets: string[]): string {\n if (!targets.length) return 'on-chain';\n const first = targets[0];\n const parts = first.split('::');\n if (parts.length >= 2 && parts[1]) return parts[1].toLowerCase();\n return 'on-chain';\n}\n\n/**\n * Three-tier label resolution for the transaction history card:\n * 1. Specific keyword match in `LABEL_PATTERNS` (\"deposit\",\n * \"payment_link\", …).\n * 2. Coarse action bucket from `classifyAction` (\"swap\", \"send\",\n * \"lending\") — prevents leaking opaque internal module names like\n * \"router\" (Cetus aggregator) or \"cross_swap\" (third-party DEX\n * aggregators) for txs that we already classified as a swap.\n * 3. Module name from the first MoveCall (`fallbackLabel`) — only\n * used when the action bucket itself is the generic \"transaction\".\n *\n * Pre-v0.46.2 we skipped tier 2, so swaps showed labels like \"router\",\n * \"cross_swap\", \"scallop_router\", etc. instead of the clean \"swap\".\n */\nexport function classifyLabel(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of LABEL_PATTERNS) {\n if (pattern.test(target)) return label;\n }\n }\n if (commandTypes.includes('TransferObjects') && !commandTypes.includes('MoveCall')) return 'send';\n const action = classifyAction(targets, commandTypes);\n if (action !== 'transaction') return action;\n return fallbackLabel(targets);\n}\n\n/**\n * Balance-direction tiebreaker for ambiguous lending calls.\n *\n * Many lending modules expose generic entry points (NAVI's bundled\n * flash actions, `lending_core::*::entry_*`, etc.) that don't carry\n * a `deposit`/`withdraw`/`borrow`/`repay` keyword in the function\n * name. When `classifyLabel` falls back to a bare module name like\n * `\"lending\"` for a known lending tx, infer direction from the user's\n * non-SUI balance change:\n * - net outflow of the supplied asset → deposit (also covers repay,\n * but repay-without-keyword is essentially never emitted).\n * - net inflow of the supplied asset → withdraw (also covers borrow).\n * SUI is excluded so gas-only transactions don't get mislabeled.\n *\n * If `LABEL_PATTERNS` matched a specific keyword, the existing label is\n * returned unchanged.\n */\nexport function refineLendingLabel(\n currentAction: string,\n currentLabel: string,\n moveCallTargets: string[],\n changes: ClassifyBalanceChange[],\n address: string,\n): string {\n if (currentAction !== 'lending') return currentLabel;\n const labelMatchedSpecific = LABEL_PATTERNS.some(([p]) =>\n moveCallTargets.some((t) => p.test(t)),\n );\n if (labelMatchedSpecific) return currentLabel;\n\n const userNonSuiOutflow = changes.find(\n (c) => resolveOwner(c.owner) === address && c.coinType !== SUI_TYPE && BigInt(c.amount) < 0n,\n );\n if (userNonSuiOutflow) return 'deposit';\n\n const userNonSuiInflow = changes.find(\n (c) => resolveOwner(c.owner) === address && c.coinType !== SUI_TYPE && BigInt(c.amount) > 0n,\n );\n if (userNonSuiInflow) return 'withdraw';\n\n return currentLabel;\n}\n\nexport interface ClassifyResult {\n action: string;\n label: string;\n}\n\nexport function classifyTransaction(\n moveCallTargets: string[],\n commandTypes: string[],\n balanceChanges: ClassifyBalanceChange[],\n address: string,\n): ClassifyResult {\n const action = classifyAction(moveCallTargets, commandTypes);\n const baseLabel = classifyLabel(moveCallTargets, commandTypes);\n const label = refineLendingLabel(action, baseLabel, moveCallTargets, balanceChanges, address);\n return { action, label };\n}\n\n/**\n * Direction of the user's net non-gas movement for this transaction.\n *\n * - `'out'` — the user spent the asset (sends, deposits, repays,\n * swap-in, payment-link payouts).\n * - `'in'` — the user received the asset (withdraws, borrows,\n * swap-out, claims, deposits credited from another wallet).\n *\n * Used by the `TransactionHistoryCard` to choose the `+`/`−` sign and\n * color. Direction is computed from the actual on-chain balance change\n * — never from the textual label — so opaque action types (`'router'`,\n * `'cross_swap'`, …) still render the correct sign.\n */\nexport type TxDirection = 'in' | 'out';\n\nexport interface ExtractedTransfer {\n amount?: number;\n asset?: string;\n recipient?: string;\n direction?: TxDirection;\n}\n\n/**\n * Extracts the principal amount/asset/direction for a transaction\n * from its `balanceChanges`.\n *\n * Algorithm:\n * 1. Restrict to the user's *own* balance changes.\n * 2. Prefer non-SUI changes (gas-only SUI deltas are noise).\n * 3. Pick the change with the largest absolute value — the \"principal\".\n * 4. If no non-SUI change exists, fall back to the largest SUI change\n * so pure-SUI transfers (stake/unstake/native send) still render.\n * 5. Direction follows the sign of the principal.\n * 6. Recipient is set only on outflows, by finding a matching inflow\n * on a *non-user* address with the same coinType.\n *\n * Pre-v0.46.2 this function only inspected outflows, so withdraws,\n * borrows, claims, swap-receives and payment-link receives all\n * rendered with no amount on the rich card (and with a wrong sign,\n * because the card guessed direction from the label string).\n */\nexport function extractTransferDetails(\n changes: ClassifyBalanceChange[] | undefined,\n sender: string,\n): ExtractedTransfer {\n if (!changes || changes.length === 0) return {};\n\n const userChanges = changes.filter((c) => resolveOwner(c.owner) === sender);\n if (userChanges.length === 0) return {};\n\n const userNonSui = userChanges.filter((c) => c.coinType !== SUI_TYPE);\n const pool = userNonSui.length > 0 ? userNonSui : userChanges;\n\n let primary = pool[0];\n let primaryAbs = bigintAbs(BigInt(primary.amount));\n for (let i = 1; i < pool.length; i++) {\n const abs = bigintAbs(BigInt(pool[i].amount));\n if (abs > primaryAbs) {\n primary = pool[i];\n primaryAbs = abs;\n }\n }\n\n const raw = BigInt(primary.amount);\n if (raw === 0n) return {};\n\n const decimals = getDecimalsForCoinType(primary.coinType);\n const amount = Number(primaryAbs) / 10 ** decimals;\n const asset = resolveSymbol(primary.coinType);\n const direction: TxDirection = raw < 0n ? 'out' : 'in';\n\n let recipient: string | undefined;\n if (direction === 'out') {\n const recipientChange = changes.find(\n (c) =>\n resolveOwner(c.owner) !== sender &&\n c.coinType === primary.coinType &&\n BigInt(c.amount) > 0n,\n );\n recipient = recipientChange ? resolveOwner(recipientChange.owner) ?? undefined : undefined;\n }\n\n return { amount, asset, recipient, direction };\n}\n\nfunction bigintAbs(n: bigint): bigint {\n return n < 0n ? -n : n;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { TransactionRecord } from '../types.js';\nimport {\n classifyTransaction,\n extractTransferDetails,\n type ClassifyBalanceChange,\n} from './classify.js';\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => parseTxRecord(tx as unknown as SuiRpcTxBlock, address));\n}\n\nexport async function queryTransaction(\n client: SuiJsonRpcClient,\n digest: string,\n senderAddress: string,\n): Promise<TransactionRecord | null> {\n try {\n const tx = await client.getTransactionBlock({\n digest,\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n });\n return parseTxRecord(tx as unknown as SuiRpcTxBlock, senderAddress);\n } catch {\n return null;\n }\n}\n\n/**\n * Shape of a transaction block as returned by `suix_queryTransactionBlocks`\n * with `showEffects | showInput | showBalanceChanges` enabled. Exported so\n * downstream consumers (audric dashboard `/api/history`, `/api/activity`,\n * etc.) can type their RPC calls without redeclaring the structure.\n */\nexport interface SuiRpcTxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: ClassifyBalanceChange[];\n}\n\n/**\n * Convert a single Sui RPC transaction block to a {@link TransactionRecord}\n * using the canonical (shared) classifier and balance-change extractor.\n *\n * This is the single source of truth for transaction parsing across the\n * agent-tool path AND the dashboard-API path. Use it instead of writing\n * a bespoke parser per surface.\n *\n * @param tx Raw RPC tx block (must include `effects`, `input`, `balanceChanges`).\n * @param address Wallet address whose perspective we're parsing from.\n */\nexport function parseSuiRpcTx(tx: SuiRpcTxBlock, address: string): TransactionRecord {\n return parseTxRecord(tx, address);\n}\n\n/**\n * Extract the sender (signer) address from a raw RPC tx block.\n * Returns `null` if the block shape is unexpected.\n */\nexport function extractTxSender(txBlock: unknown): string | null {\n try {\n if (!txBlock || typeof txBlock !== 'object') return null;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return null;\n return ((data as Record<string, unknown>).sender as string) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract MoveCall targets (`<pkg>::<module>::<function>`) and the\n * sequence of programmable-transaction command types (e.g. `MoveCall`,\n * `TransferObjects`) from a raw RPC tx block. Tolerates both the\n * legacy `inner.transactions` field and the newer `inner.commands`\n * field.\n */\nexport function extractTxCommands(txBlock: unknown): {\n moveCallTargets: string[];\n commandTypes: string[];\n} {\n return extractCommands(txBlock);\n}\n\nfunction parseTxRecord(tx: SuiRpcTxBlock, address: string): TransactionRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n const { moveCallTargets, commandTypes } = extractCommands(tx.transaction);\n const balanceChanges = tx.balanceChanges ?? [];\n const { amount, asset, recipient, direction } = extractTransferDetails(balanceChanges, address);\n const { action, label } = classifyTransaction(\n moveCallTargets,\n commandTypes,\n balanceChanges,\n address,\n );\n\n return {\n digest: tx.digest,\n action,\n label,\n amount,\n asset,\n recipient,\n direction,\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n}\n\ninterface CommandInfo {\n moveCallTargets: string[];\n commandTypes: string[];\n}\n\nfunction extractCommands(txBlock: unknown): CommandInfo {\n const result: CommandInfo = { moveCallTargets: [], commandTypes: [] };\n try {\n if (!txBlock || typeof txBlock !== 'object') return result;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return result;\n const inner = 'transaction' in (data as Record<string, unknown>)\n ? (data as Record<string, unknown>).transaction\n : undefined;\n if (!inner || typeof inner !== 'object') return result;\n const commands = 'commands' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).commands\n : 'transactions' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).transactions\n : undefined;\n if (!Array.isArray(commands)) return result;\n\n for (const cmd of commands as Record<string, unknown>[]) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n result.moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n result.commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n result.commandTypes.push('TransferObjects');\n }\n }\n } catch { /* best effort */ }\n return result;\n}\n","import { EventEmitter } from 'eventemitter3';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { createPaymentTransactionUri } from '@mysten/payment-kit';\nimport { getSuiClient } from './utils/sui.js';\nimport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nimport type { TransactionSigner } from './signer.js';\nimport { KeypairSigner } from './wallet/keypairSigner.js';\nimport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory, queryTransaction } from './wallet/history.js';\nimport { getDecimalsForCoinType, resolveSymbol } from './token-registry.js';\n// [B5 v2 / 2026-04-30] No fee imports — CLI / direct SDK is fee-free. Consumer\n// apps (Audric) own fee policy via `addFeeTransfer` from `./protocols/protocolFee.js`.\nimport * as yieldTracker from './protocols/yieldTracker.js';\nimport { ProtocolRegistry } from './adapters/registry.js';\nimport { NaviAdapter } from './adapters/navi.js';\nimport type { LendingAdapter } from './adapters/types.js';\nimport type {\n T2000Options,\n BalanceResponse,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n RatesResult,\n PositionsResult,\n TransactionRecord,\n DepositInfo,\n PaymentRequest,\n EarningsResult,\n FundStatusResult,\n ClaimRewardsResult,\n CompoundRewardsResult,\n PendingReward,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, assertAllowedAsset, type SupportedAsset } from './constants.js';\n\nimport { truncateAddress } from './utils/sui.js';\nimport { SafeguardEnforcer } from './safeguards/enforcer.js';\nimport { ContactManager } from './contacts.js';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.t2000');\n\ninterface T2000Events {\n balanceChange: (event: { asset: string; previous: number; current: number; cause: string; tx?: string }) => void;\n healthWarning: (event: { healthFactor: number; threshold: number; severity: 'warning' }) => void;\n healthCritical: (event: { healthFactor: number; threshold: number; severity: 'critical' }) => void;\n yield: (event: { earned: number; total: number; apy: number; timestamp: number }) => void;\n error: (error: T2000Error) => void;\n}\n\n// Sign + execute a transaction with the agent's signer. Replaces the pre-v2 gas\n// manager — every transaction is now self-funded by the agent's wallet.\ntype SuiTransactionEffects = NonNullable<Awaited<ReturnType<SuiJsonRpcClient['executeTransactionBlock']>>['effects']>;\n\nasync function executeTx(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Promise<Transaction> | Transaction,\n): Promise<{ digest: string; gasCostSui: number; effects: SuiTransactionEffects | undefined }> {\n const tx = await buildTx();\n tx.setSender(signer.getAddress());\n const txBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(txBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: txBytes,\n signature,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n const gasUsed = result.effects?.gasUsed;\n let gasCostSui = 0;\n if (gasUsed) {\n const total = BigInt(gasUsed.computationCost) + BigInt(gasUsed.storageCost) - BigInt(gasUsed.storageRebate);\n gasCostSui = Number(total) / 1e9;\n }\n return { digest: result.digest, gasCostSui, effects: result.effects ?? undefined };\n}\n\nexport class T2000 extends EventEmitter<T2000Events> {\n private readonly _signer: TransactionSigner;\n private readonly _keypair?: Ed25519Keypair;\n private readonly client: SuiJsonRpcClient;\n private readonly _address: string;\n private readonly registry: ProtocolRegistry;\n readonly enforcer: SafeguardEnforcer;\n readonly contacts: ContactManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string);\n private constructor(signer: TransactionSigner, client: SuiJsonRpcClient, registry: ProtocolRegistry | undefined, configDir: string | undefined, isSignerMode: true);\n private constructor(\n keypairOrSigner: Ed25519Keypair | TransactionSigner,\n client: SuiJsonRpcClient,\n registry?: ProtocolRegistry,\n configDir?: string,\n isSignerMode?: boolean,\n ) {\n super();\n if (isSignerMode) {\n this._signer = keypairOrSigner as TransactionSigner;\n this._keypair = undefined;\n this._address = this._signer.getAddress();\n } else {\n const kp = keypairOrSigner as Ed25519Keypair;\n this._keypair = kp;\n this._signer = new KeypairSigner(kp);\n this._address = getAddress(kp);\n }\n this.client = client;\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n }\n\n private static createDefaultRegistry(client: SuiJsonRpcClient): ProtocolRegistry {\n const registry = new ProtocolRegistry();\n const naviAdapter = new NaviAdapter();\n naviAdapter.initSync(client);\n registry.registerLending(naviAdapter);\n return registry;\n }\n\n static async create(options: T2000Options = {}): Promise<T2000> {\n const { keyPath, pin, passphrase, rpcUrl } = options;\n const secret = pin ?? passphrase;\n\n const client = getSuiClient(rpcUrl);\n\n const exists = await walletExists(keyPath);\n if (!exists) {\n throw new T2000Error(\n 'WALLET_NOT_FOUND',\n 'No wallet found. Run `t2000 init` to create one.',\n );\n }\n\n if (!secret) {\n throw new T2000Error('WALLET_LOCKED', 'PIN required to unlock wallet');\n }\n\n const keypair = await loadKey(secret, keyPath);\n return new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n }\n\n static fromPrivateKey(privateKey: string, options: { network?: 'mainnet' | 'testnet'; rpcUrl?: string } = {}): T2000 {\n const keypair = keypairFromPrivateKey(privateKey);\n const client = getSuiClient(options.rpcUrl);\n return new T2000(keypair, client);\n }\n\n static async init(options: { pin: string; passphrase?: string; keyPath?: string; name?: string }): Promise<{ agent: T2000; address: string }> {\n const secret = options.pin ?? options.passphrase ?? '';\n const keypair = generateKeypair();\n await saveKey(keypair, secret, options.keyPath);\n\n const client = getSuiClient();\n const agent = new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n const address = agent.address();\n\n return { agent, address };\n }\n\n // -- Gas --\n\n /** SuiJsonRpcClient used by this agent — exposed for integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for CLI/MCP integrations. */\n get keypair(): Ed25519Keypair {\n if (!this._keypair) {\n throw new T2000Error('WALLET_NOT_FOUND', 'Keypair not available — this instance uses zkLogin');\n }\n return this._keypair;\n }\n\n /** Transaction signer (works for both keypair and zkLogin). */\n get signer(): TransactionSigner {\n return this._signer;\n }\n\n // -- MPP Payments --\n\n async pay(options: PayOptions): Promise<PayResult> {\n this.enforcer.assertNotLocked();\n this.enforcer.check({ operation: 'pay', amount: options.maxPrice ?? 1.0 });\n\n const { Mppx } = await import('mppx/client');\n const { sui } = await import('@suimpp/mpp/client');\n\n const client = this.client;\n const signer = this._signer;\n const signerAddress = signer.getAddress();\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [sui({\n client,\n signer: { toSuiAddress: () => signerAddress } as Parameters<typeof sui>[0]['signer'],\n execute: async (tx) => {\n const result = await executeTx(client, signer, () => tx);\n return { digest: result.digest, effects: result.effects };\n },\n })],\n });\n\n const method = (options.method ?? 'GET').toUpperCase();\n const canHaveBody = method !== 'GET' && method !== 'HEAD';\n\n const response = await mppx.fetch(options.url, {\n method,\n headers: options.headers,\n body: canHaveBody ? options.body : undefined,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n let body: unknown;\n try {\n body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n } catch {\n body = null;\n }\n\n const receiptHeader = response.headers.get('x-payment-receipt');\n const paid = !!receiptHeader;\n\n if (paid) {\n this.enforcer.recordUsage(options.maxPrice ?? 1.0);\n }\n\n return {\n status: response.status,\n body,\n paid,\n cost: paid ? (options.maxPrice ?? undefined) : undefined,\n receipt: receiptHeader\n ? { reference: receiptHeader, timestamp: new Date().toISOString() }\n : undefined,\n };\n }\n\n // -- VOLO vSUI Staking --\n\n async stakeVSui(params: { amount: number }): Promise<StakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildStakeVSuiTx, getVoloStats } = await import('./protocols/volo.js');\n\n const amountMist = BigInt(Math.floor(params.amount * Number(MIST_PER_SUI)));\n const stats = await getVoloStats();\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n return buildStakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const vSuiReceived = params.amount / stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n amountSui: params.amount,\n vSuiReceived,\n apy: stats.apy,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async unstakeVSui(params: { amount: number | 'all' }): Promise<UnstakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildUnstakeVSuiTx, getVoloStats, VSUI_TYPE } = await import('./protocols/volo.js');\n\n let amountMist: bigint | 'all';\n let vSuiAmount: number;\n\n if (params.amount === 'all') {\n amountMist = 'all';\n const coins = await this._fetchCoins(VSUI_TYPE);\n vSuiAmount = coins.reduce((sum, c) => sum + Number(c.balance), 0) / 1e9;\n } else {\n amountMist = BigInt(Math.floor(params.amount * 1e9));\n vSuiAmount = params.amount;\n }\n\n const stats = await getVoloStats();\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n return buildUnstakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const suiReceived = vSuiAmount * stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n vSuiAmount,\n suiReceived,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n // -- Swap --\n\n async swap(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n slippage?: number;\n }): Promise<SwapResult> {\n this.enforcer.assertNotLocked();\n\n const { findSwapRoute, buildSwapTx, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n const slippage = Math.min(params.slippage ?? 0.01, 0.05);\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n if (route.priceImpact > 0.05) {\n console.warn(`[swap] High price impact: ${(route.priceImpact * 100).toFixed(2)}%`);\n }\n\n const toDecimals = getDecimalsForCoinType(toType);\n\n // Snapshot pre-swap balance for fallback diff calculation\n let preBalRaw = 0n;\n try {\n const preBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n preBalRaw = BigInt(preBal.totalBalance);\n } catch { /* first time holding this token — balance is 0 */ }\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n let inputCoin: TransactionObjectArgument;\n if (fromType === '0x2::sui::SUI') {\n [inputCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(fromType);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${params.from} coins found.`);\n const merged = this._mergeCoinsInTx(tx, coins);\n [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n let toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n // --- Primary: parse balance changes from the finalized transaction ---\n const toTypeSuffix = toType.split('::').slice(1).join('::');\n try {\n const fullTx = await this.client.waitForTransaction({\n digest: gasResult.digest,\n options: { showBalanceChanges: true },\n timeout: 8_000,\n pollInterval: 400,\n });\n type BalChange = { coinType: string; amount: string; owner: { AddressOwner?: string } };\n const changes = ((fullTx as { balanceChanges?: BalChange[] }).balanceChanges ?? []);\n const received = changes.find((c) => {\n if (BigInt(c.amount) <= 0n) return false;\n const ownerAddr = (c.owner as { AddressOwner?: string })?.AddressOwner;\n if (!ownerAddr || ownerAddr.toLowerCase() !== this._address.toLowerCase()) return false;\n if (c.coinType === toType) return true;\n return c.coinType.endsWith(toTypeSuffix);\n });\n if (received) {\n const actual = Number(BigInt(received.amount)) / 10 ** toDecimals;\n if (actual > 0) toAmount = actual;\n }\n } catch {\n // waitForTransaction timeout — fall through to balance diff\n }\n\n // --- Fallback: pre/post getBalance diff ---\n const cetusEstimate = Number(route.amountOut) / 10 ** toDecimals;\n if (Math.abs(toAmount - cetusEstimate) < 0.001) {\n try {\n await new Promise((r) => setTimeout(r, 2000));\n const postBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n const postRaw = BigInt(postBal.totalBalance);\n const delta = Number(postRaw - preBalRaw) / 10 ** toDecimals;\n if (delta > 0) toAmount = delta;\n } catch {\n // Balance diff fallback failed — use Cetus estimate\n }\n }\n\n // Resolve full coin types to user-friendly token names\n const fromName = resolveSymbol(fromType);\n const toName = resolveSymbol(toType);\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n success: true,\n tx: gasResult.digest,\n fromToken: fromName,\n toToken: toName,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async swapQuote(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n }): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n this.enforcer.assertNotLocked();\n\n const asset = (params.asset ?? 'USDC') as keyof typeof SUPPORTED_ASSETS;\n if (!(asset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n\n const resolved = this.contacts.resolve(params.to);\n const sendAmount = params.amount;\n const sendTo = resolved.address;\n\n const gasResult = await executeTx(this.client, this._signer, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n );\n\n this.enforcer.recordUsage(sendAmount);\n const balance = await this.balance();\n\n this.emitBalanceChange(asset, sendAmount, 'send', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: sendAmount,\n to: resolved.address,\n contactName: resolved.contactName,\n gasCost: gasResult.gasCostSui,\n gasCostUnit: 'SUI',\n balance,\n };\n }\n\n async balance(): Promise<BalanceResponse> {\n const bal = await queryBalance(this.client, this._address);\n\n let chainTotal = bal.available + bal.gasReserve.usdEquiv;\n\n try {\n const positions = await this.positions();\n for (const pos of positions.positions) {\n const usdValue = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') {\n chainTotal += usdValue;\n bal.savings += usdValue;\n } else if (pos.type === 'borrow') {\n chainTotal -= usdValue;\n bal.debt += usdValue;\n }\n }\n } catch {\n // Protocol unavailable — chain total limited to wallet\n }\n\n try {\n const pendingRewards = await this.getPendingRewards();\n bal.pendingRewards = pendingRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n } catch {\n bal.pendingRewards = 0;\n }\n\n bal.total = chainTotal;\n return bal;\n }\n\n async history(params?: { limit?: number }): Promise<TransactionRecord[]> {\n return queryHistory(this.client, this._address, params?.limit);\n }\n\n async transactionDetail(digest: string): Promise<TransactionRecord | null> {\n return queryTransaction(this.client, digest, this._address);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'mainnet',\n supportedAssets: ['USDC', 'USDT', 'SUI'],\n instructions: [\n `Send USDC to: ${this._address}`,\n `Network: Sui Mainnet`,\n `Or buy USDC on an exchange and withdraw to this address.`,\n `USDC contract: ${SUPPORTED_ASSETS.USDC.type}`,\n ].join('\\n'),\n };\n }\n\n receive(params?: { amount?: number; currency?: string; memo?: string; label?: string }): PaymentRequest {\n const amount = params?.amount ?? null;\n const currency = params?.currency ?? 'USDC';\n const memo = params?.memo ?? null;\n const label = params?.label ?? null;\n const nonce = crypto.randomUUID();\n\n let qrUri: string;\n if (amount != null && amount > 0) {\n const decimals = currency === 'SUI' ? 9 : 6;\n const coinType = currency === 'SUI'\n ? '0x2::sui::SUI'\n : SUPPORTED_ASSETS.USDC.type;\n const rawAmount = BigInt(Math.floor(amount * 10 ** decimals));\n qrUri = createPaymentTransactionUri({\n receiverAddress: this._address,\n amount: rawAmount,\n coinType,\n nonce,\n ...(label ? { label } : {}),\n ...(memo ? { message: memo } : {}),\n });\n } else {\n const qrParts = [`sui:${this._address}`];\n const queryParams: string[] = [];\n if (currency !== 'SUI') queryParams.push(`currency=${currency}`);\n if (memo) queryParams.push(`memo=${encodeURIComponent(memo)}`);\n if (label) queryParams.push(`label=${encodeURIComponent(label)}`);\n qrUri = queryParams.length > 0 ? `${qrParts[0]}?${queryParams.join('&')}` : qrParts[0];\n }\n\n const amountStr = amount != null ? `$${amount.toFixed(2)} ` : '';\n const displayParts = [`Send ${amountStr}${currency} to ${truncateAddress(this._address)}`];\n if (memo) displayParts.push(`Memo: ${memo}`);\n\n return {\n address: this._address,\n network: 'mainnet',\n amount,\n currency,\n memo,\n label,\n nonce,\n qrUri,\n displayText: displayParts.join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n static fromZkLogin(opts: {\n ephemeralKeypair: Ed25519Keypair;\n zkProof: ZkLoginProof;\n userAddress: string;\n maxEpoch: number;\n rpcUrl?: string;\n }): T2000 {\n const signer = new ZkLoginSigner(opts.ephemeralKeypair, opts.zkProof, opts.userAddress, opts.maxEpoch);\n const client = getSuiClient(opts.rpcUrl);\n return new T2000(signer, client, undefined, undefined, true);\n }\n\n async registerAdapter(adapter: LendingAdapter): Promise<void> {\n await adapter.init(this.client);\n this.registry.registerLending(adapter);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<SaveResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('save', params.asset);\n // [v0.51.0] Default USDC, but honor params.asset for the strategic-exception\n // set (currently USDC, USDsui — see OPERATION_ASSETS.save). Hardcoding 'USDC'\n // here previously silently rewrote the user's intent.\n const asset: SupportedAsset = (params.asset as SupportedAsset | undefined) ?? 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n let amount: number;\n if (params.amount === 'all') {\n // [v0.51.0] Per-asset balance query — `queryBalance.available` is the sum\n // of STABLE_ASSETS (USDC), not the requested asset. For USDsui we need the\n // raw on-chain balance for that specific coin type.\n const assetBalance = await this._queryAssetBalance(assetInfo.type, assetInfo.decimals);\n amount = assetBalance - 1.0;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} available to save`, {\n reason: 'insufficient_balance', asset,\n });\n }\n } else {\n amount = params.amount;\n const assetBalance = await this._queryAssetBalance(assetInfo.type, assetInfo.decimals);\n if (amount > assetBalance) {\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient ${assetInfo.displayName} balance. Available: ${assetBalance.toFixed(assetInfo.decimals === 6 ? 2 : 4)}, requested: ${amount.toFixed(assetInfo.decimals === 6 ? 2 : 4)}`,\n );\n }\n }\n\n // [B5 v2 / 2026-04-30] CLI / direct SDK calls are fee-free. Consumer apps\n // (Audric) charge their own fees by adding `addFeeTransfer` to the tx before\n // calling the SDK builders. `fee` is reported as 0 in the result.\n const saveAmount = amount;\n const adapter = await this.resolveLending(params.protocol, asset, 'save');\n const canPTB = !!adapter.addSaveToTx;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n const merged = this._mergeCoinsInTx(tx, coins);\n const rawAmount = BigInt(Math.floor(saveAmount * 10 ** assetInfo.decimals));\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n await adapter.addSaveToTx!(tx, this._address, inputCoin, asset);\n return tx;\n }\n\n const { tx } = await adapter.buildSaveTx(this._address, saveAmount, asset);\n return tx;\n });\n\n const rates = await adapter.getRates(asset);\n this.emitBalanceChange(asset, saveAmount, 'save', gasResult.digest);\n\n let savingsBalance = saveAmount;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const positions = await this.positions();\n const actual = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n if (actual > 0) {\n savingsBalance = actual;\n break;\n }\n } catch { /* retry */ }\n await new Promise(r => setTimeout(r, 2000));\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.saveApy,\n fee: 0,\n gasCost: gasResult.gasCostSui,\n savingsBalance,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; asset?: string; protocol?: string }): Promise<WithdrawResult> {\n this.enforcer.assertNotLocked();\n if (params.amount === 'all' && !params.protocol && !params.asset) {\n return this.withdrawAllProtocols();\n }\n\n const allPositions = await this.registry.allPositions(this._address);\n const supplies: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const s of pos.positions.supplies) {\n if (s.amount > 0.001) {\n if (params.asset && s.asset !== params.asset) continue;\n supplies.push({ protocolId: pos.protocolId, asset: s.asset, amount: s.amount, apy: s.apy });\n }\n }\n }\n\n if (supplies.length === 0) {\n throw new T2000Error('NO_COLLATERAL', params.asset ? `No ${params.asset} savings to withdraw` : 'No savings to withdraw');\n }\n\n supplies.sort((a, b) => {\n const aIsUsdc = a.asset === 'USDC' ? 0 : 1;\n const bIsUsdc = b.asset === 'USDC' ? 0 : 1;\n if (aIsUsdc !== bIsUsdc) return aIsUsdc - bIsUsdc;\n return a.apy - b.apy;\n });\n const target = supplies[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n let amount: number;\n if (params.amount === 'all') {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n amount = maxResult.maxAmount;\n if (amount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw');\n }\n } else {\n amount = params.amount;\n\n const hf = await adapter.getHealth(this._address);\n if (hf.borrowed > 0) {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n if (amount > maxResult.maxAmount) {\n throw new T2000Error(\n 'WITHDRAW_WOULD_LIQUIDATE',\n `Withdrawing $${amount.toFixed(2)} would drop health factor below 1.5`,\n {\n safeWithdrawAmount: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n projectedHF: maxResult.healthFactorAfter,\n },\n );\n }\n }\n }\n\n const withdrawAmount = amount;\n let finalAmount = withdrawAmount;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (adapter.addWithdrawToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const { coin, effectiveAmount } = await adapter.addWithdrawToTx!(tx, this._address, withdrawAmount, target.asset);\n finalAmount = effectiveAmount;\n tx.transferObjects([coin], this._address);\n return tx;\n }\n\n const built = await adapter.buildWithdrawTx(this._address, withdrawAmount, target.asset);\n finalAmount = built.effectiveAmount;\n return built.tx;\n });\n\n this.emitBalanceChange(target.asset, finalAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: finalAmount,\n asset: target.asset,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n private async withdrawAllProtocols(): Promise<WithdrawResult> {\n const allPositions = await this.registry.allPositions(this._address);\n\n const withdrawable: Array<{ protocolId: string; asset: string; amount: number }> = [];\n for (const pos of allPositions) {\n for (const supply of pos.positions.supplies) {\n if (supply.amount > 0.01) {\n withdrawable.push({ protocolId: pos.protocolId, asset: supply.asset, amount: supply.amount });\n }\n }\n }\n\n if (withdrawable.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n const protocolMaxes = new Map<string, number>();\n const entries: Array<{ protocolId: string; asset: string; maxAmount: number; adapter: LendingAdapter }> = [];\n for (const entry of withdrawable) {\n const adapter = this.registry.getLending(entry.protocolId);\n if (!adapter) continue;\n if (!protocolMaxes.has(entry.protocolId)) {\n const maxResult = await adapter.maxWithdraw(this._address, entry.asset);\n protocolMaxes.set(entry.protocolId, maxResult.maxAmount);\n }\n const remaining = protocolMaxes.get(entry.protocolId)!;\n const perAssetMax = Math.min(entry.amount, remaining);\n if (perAssetMax > 0.01) {\n entries.push({ ...entry, maxAmount: perAssetMax, adapter });\n protocolMaxes.set(entry.protocolId, remaining - perAssetMax);\n }\n }\n\n if (entries.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n let totalReceived = 0;\n const canPTB = entries.every(e => e.adapter.addWithdrawToTx);\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n for (const entry of entries) {\n const { coin, effectiveAmount } = await entry.adapter.addWithdrawToTx!(\n tx, this._address, entry.maxAmount, entry.asset,\n );\n totalReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const entry of entries) {\n const built = await entry.adapter.buildWithdrawTx(this._address, entry.maxAmount, entry.asset);\n totalReceived += built.effectiveAmount;\n lastTx = built.tx;\n }\n return lastTx!;\n });\n\n if (totalReceived <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalReceived,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n /**\n * [v0.51.0] Per-asset wallet balance lookup.\n *\n * `queryBalance.available` rolls up only `STABLE_ASSETS` (USDC), so it cannot\n * answer \"do they have enough USDsui to save 10?\". This helper hits\n * `getBalance` for the specific coin type — same mechanism `queryBalance`\n * uses internally — and converts to a human-readable amount using the asset's\n * decimals. Returns 0 (not a throw) when the address holds none of the asset,\n * matching the caller's existing \"insufficient balance\" error path.\n */\n private async _queryAssetBalance(coinType: string, decimals: number): Promise<number> {\n try {\n const bal = await this.client.getBalance({ owner: this._address, coinType });\n return Number(bal.totalBalance) / 10 ** decimals;\n } catch {\n return 0;\n }\n }\n\n private async _fetchCoins(coinType: string): 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 this.client.getCoins({ owner: this._address, 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\n if (all.length > 0) {\n this._lastFundDigest = undefined;\n return all;\n }\n\n if (this._lastFundDigest && coinType === SUPPORTED_ASSETS.USDC.type) {\n const txInfo = await this.client.getTransactionBlock({\n digest: this._lastFundDigest,\n options: { showObjectChanges: true },\n });\n const coinIds = (txInfo.objectChanges ?? [])\n .filter((c): c is typeof c & { objectId: string } =>\n (c.type === 'created' || c.type === 'mutated') &&\n 'objectType' in c &&\n typeof c.objectType === 'string' &&\n c.objectType.includes('0x2::coin::Coin') &&\n c.objectType.includes(coinType),\n )\n .map(c => c.objectId);\n\n if (coinIds.length > 0) {\n const objects = await this.client.multiGetObjects({\n ids: coinIds,\n options: { showContent: true, showOwner: true },\n });\n for (const obj of objects) {\n if (\n obj.data?.content?.dataType === 'moveObject' &&\n obj.data.owner &&\n typeof obj.data.owner === 'object' &&\n 'AddressOwner' in obj.data.owner &&\n obj.data.owner.AddressOwner === this._address\n ) {\n const fields = obj.data.content.fields as Record<string, unknown>;\n all.push({ coinObjectId: obj.data.objectId!, balance: String(fields.balance ?? '0') });\n }\n }\n }\n }\n\n return all;\n }\n\n private _mergeCoinsInTx(tx: Transaction, coins: Array<{ coinObjectId: string; balance: string }>): 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 private _lastFundDigest: string | undefined;\n\n private async _autoFundFromSavings(shortfall: number): Promise<void> {\n const positions = await this.positions();\n const savingsTotal = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n if (savingsTotal < shortfall * 0.95) {\n const bal = await queryBalance(this.client, this._address);\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. Available: $${bal.available.toFixed(2)}, savings: $${savingsTotal.toFixed(2)}, requested shortfall: $${shortfall.toFixed(2)}`,\n );\n }\n\n const result = await this.withdraw({ amount: shortfall });\n if (result.amount < shortfall * 0.5) {\n throw new T2000Error(\n 'WITHDRAW_FAILED',\n `Auto-withdraw from savings returned $${result.amount.toFixed(2)} — expected ~$${shortfall.toFixed(2)}. Try withdrawing manually first.`,\n );\n }\n\n const txInfo = await this.client.getTransactionBlock({\n digest: result.tx,\n options: { showBalanceChanges: true },\n });\n const usdcReceived = (txInfo.balanceChanges ?? []).some(\n c => c.coinType === SUPPORTED_ASSETS.USDC.type &&\n Number(c.amount) > 0 &&\n typeof c.owner === 'object' && 'AddressOwner' in c.owner &&\n c.owner.AddressOwner === this._address,\n );\n if (!usdcReceived) {\n throw new T2000Error('WITHDRAW_FAILED', 'Withdraw TX did not produce USDC');\n }\n this._lastFundDigest = result.tx;\n }\n\n async maxWithdraw(): Promise<MaxWithdrawResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'withdraw');\n return adapter.maxWithdraw(this._address, 'USDC');\n }\n\n // -- Borrowing --\n\n async borrow(params: { amount: number; asset?: SupportedAsset; protocol?: string }): Promise<BorrowResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('borrow', params.asset);\n // [v0.51.0] Default USDC, honor params.asset for the strategic-exception\n // set (USDC, USDsui — see OPERATION_ASSETS.borrow).\n const asset: SupportedAsset = (params.asset as SupportedAsset | undefined) ?? 'USDC';\n const adapter = await this.resolveLending(params.protocol, asset, 'borrow');\n\n const maxResult = await adapter.maxBorrow(this._address, asset);\n if (maxResult.maxAmount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No collateral deposited. Save first with `t2000 save <amount>`.');\n }\n if (params.amount > maxResult.maxAmount) {\n throw new T2000Error('HEALTH_FACTOR_TOO_LOW', `Max safe borrow: $${maxResult.maxAmount.toFixed(2)}. Only savings deposits count as borrowable collateral.`, {\n maxBorrow: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n });\n }\n // [B5 v2 / 2026-04-30] CLI / direct SDK borrows are fee-free. See save() above.\n const borrowAmount = params.amount;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n const { tx } = await adapter.buildBorrowTx(this._address, borrowAmount, asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n this.emitBalanceChange(asset, borrowAmount, 'borrow', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: borrowAmount,\n asset,\n fee: 0,\n healthFactor: hf.healthFactor,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async repay(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<RepayResult> {\n this.enforcer.assertNotLocked();\n const allPositions = await this.registry.allPositions(this._address);\n const borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const b of pos.positions.borrows) {\n if (b.amount > 0.001) borrows.push({ protocolId: pos.protocolId, asset: b.asset, amount: b.amount, apy: b.apy });\n }\n }\n\n if (borrows.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No outstanding borrow to repay');\n }\n\n if (params.amount === 'all') {\n return this._repayAllBorrows(borrows);\n }\n\n // [v0.51.1] Filter by params.asset when supplied. Pre-v0.51.1 we always\n // sorted by APY and picked the highest-APY borrow regardless of asset —\n // which broke USDsui repayment because `target` could be any asset and\n // we'd then fetch USDC coins for it (type mismatch). When the caller\n // names an asset, only that asset's borrows are eligible.\n const eligible = params.asset\n ? borrows.filter((b) => b.asset === params.asset)\n : borrows;\n if (eligible.length === 0) {\n throw new T2000Error('NO_COLLATERAL', `No outstanding ${params.asset} borrow to repay`);\n }\n eligible.sort((a, b) => b.apy - a.apy);\n const target = eligible[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n const repayAmount = Math.min(params.amount, target.amount);\n // [v0.51.1] Resolve the borrowed asset's coin type instead of\n // hardcoding USDC. Repaying a USDsui debt with a USDC coin would fail\n // at NAVI (type mismatch) or worse, succeed against the wrong pool.\n const targetAssetInfo = SUPPORTED_ASSETS[target.asset as SupportedAsset]\n ?? SUPPORTED_ASSETS.USDC;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (adapter.addRepayToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const coins = await this._fetchCoins(targetAssetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${targetAssetInfo.displayName} coins`);\n const merged = this._mergeCoinsInTx(tx, coins);\n const raw = BigInt(Math.floor(repayAmount * 10 ** targetAssetInfo.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, target.asset);\n return tx;\n }\n\n const { tx } = await adapter.buildRepayTx(this._address, repayAmount, target.asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n // [v0.51.1] Emit the actual asset, not always 'USDC'. Subscribers\n // rely on this event to refresh balance UIs.\n this.emitBalanceChange(target.asset, repayAmount, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: repayAmount,\n asset: target.asset,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n private async _repayAllBorrows(borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }>): Promise<RepayResult> {\n borrows.sort((a, b) => b.apy - a.apy);\n\n const entries: Array<{ borrow: typeof borrows[0]; adapter: LendingAdapter }> = [];\n for (const borrow of borrows) {\n const adapter = this.registry.getLending(borrow.protocolId);\n if (adapter) entries.push({ borrow, adapter });\n }\n\n const canPTB = entries.every(e => e.adapter.addRepayToTx);\n let totalRepaid = 0;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n // [v0.51.1] Group borrows by asset; fetch + merge coins per asset.\n // Pre-v0.51.1 we fetched USDC coins once and tried to repay every\n // borrow (including USDsui) from the same merged USDC. That works\n // when every borrow happens to be USDC; it silently breaks the\n // moment USDsui (or any other allowed borrow asset) appears.\n const assetMerged = new Map<string, TransactionObjectArgument>();\n const uniqueAssets = Array.from(new Set(entries.map((e) => e.borrow.asset)));\n for (const asset of uniqueAssets) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n if (!info) throw new T2000Error('ASSET_NOT_SUPPORTED', `Cannot repay unknown asset: ${asset}`);\n const coins = await this._fetchCoins(info.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${info.displayName} coins for repayment`);\n assetMerged.set(asset, this._mergeCoinsInTx(tx, coins));\n }\n\n for (const { borrow, adapter } of entries) {\n const info = SUPPORTED_ASSETS[borrow.asset as SupportedAsset]!;\n const merged = assetMerged.get(borrow.asset)!;\n const raw = BigInt(Math.floor(borrow.amount * 10 ** info.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, borrow.asset);\n totalRepaid += borrow.amount;\n }\n\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const { borrow, adapter } of entries) {\n const { tx } = await adapter.buildRepayTx(this._address, borrow.amount, borrow.asset);\n lastTx = tx;\n totalRepaid += borrow.amount;\n }\n return lastTx!;\n });\n\n const firstAdapter = entries[0]?.adapter;\n const hf = firstAdapter ? await firstAdapter.getHealth(this._address) : { borrowed: 0 };\n // [v0.51.1] Mixed-asset repay-all emits a 'repay' event per dominant\n // asset (largest by amount). Single-asset case still fires correctly.\n const dominantAsset = entries\n .reduce((acc, e) => acc.amount >= e.borrow.amount ? acc : e.borrow, entries[0]?.borrow ?? { asset: 'USDC', amount: 0 })\n .asset;\n this.emitBalanceChange(dominantAsset, totalRepaid, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalRepaid,\n asset: dominantAsset,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async maxBorrow(): Promise<MaxBorrowResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'borrow');\n return adapter.maxBorrow(this._address, 'USDC');\n }\n\n async healthFactor(): Promise<HealthFactorResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const hf = await adapter.getHealth(this._address);\n\n if (hf.healthFactor < 1.2) {\n this.emit('healthCritical', { healthFactor: hf.healthFactor, threshold: 1.5, severity: 'critical' });\n } else if (hf.healthFactor < 2.0) {\n this.emit('healthWarning', { healthFactor: hf.healthFactor, threshold: 2.0, severity: 'warning' });\n }\n\n return hf;\n }\n\n // -- Claim Rewards --\n\n async getPendingRewards(): Promise<PendingReward[]> {\n const adapters = this.registry.listLending().filter((a) => a.getPendingRewards);\n if (adapters.length === 0) return [];\n\n const results = await Promise.allSettled(\n adapters.map((a) => a.getPendingRewards!(this._address)),\n );\n const all: PendingReward[] = [];\n const errors: unknown[] = [];\n for (const r of results) {\n if (r.status === 'fulfilled') all.push(...r.value);\n else errors.push(r.reason);\n }\n // [S18-F20] If every adapter failed and we have nothing to show,\n // propagate the first error so the engine tool can surface\n // \"NAVI degraded\" instead of narrating \"no pending rewards\"\n // (a false negative). Today there is only one claim-capable adapter\n // (NAVI), so this collapses to \"if NAVI threw, throw\"; the loop\n // shape preserves graceful partial degradation when a 2nd adapter\n // (e.g. Suilend) lands.\n if (all.length === 0 && errors.length === adapters.length) {\n const first = errors[0];\n throw first instanceof Error ? first : new Error(String(first));\n }\n return all;\n }\n\n async claimRewards(): Promise<ClaimRewardsResult> {\n this.enforcer.assertNotLocked();\n\n const adapters = this.registry.listLending().filter((a) => a.addClaimRewardsToTx);\n if (adapters.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0 };\n }\n\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const allRewards: PendingReward[] = [];\n const errors: unknown[] = [];\n for (const adapter of adapters) {\n try {\n const claimed = await adapter.addClaimRewardsToTx!(tx, this._address);\n allRewards.push(...claimed);\n } catch (err) {\n errors.push(err);\n }\n }\n\n // [S18-F20] Propagate degradation when every adapter failed AND we\n // have nothing to claim. See `getPendingRewards` for the full\n // rationale — silent skip here was a primary contributor to the\n // engine narrating \"no pending rewards\" during NAVI degradation.\n if (allRewards.length === 0 && errors.length === adapters.length) {\n const first = errors[0];\n throw first instanceof Error ? first : new Error(String(first));\n }\n\n if (allRewards.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0 };\n }\n\n const claimResult = await executeTx(this.client, this._signer, async () => tx);\n await this.client.waitForTransaction({ digest: claimResult.digest });\n\n const totalValueUsd = allRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n\n return {\n success: true,\n tx: claimResult.digest,\n rewards: allRewards,\n totalValueUsd,\n gasCost: claimResult.gasCostSui,\n };\n }\n\n /**\n * Claim pending rewards, swap non-USDC tokens to USDC via Cetus, and deposit into NAVI.\n * Multi-step: claim (transfers to wallet) -> swap each reward token to USDC -> deposit USDC.\n * Minimum threshold: skips if total rewards < $0.10 (gas not worth it).\n */\n async compoundRewards(options: { minValueUsd?: number } = {}): Promise<CompoundRewardsResult> {\n this.enforcer.assertNotLocked();\n const minValue = options.minValueUsd ?? 0.10;\n const USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\n const USDC_DEC = SUPPORTED_ASSETS.USDC.decimals;\n\n const pending = await this.getPendingRewards();\n const nonTrivial = pending.filter((r) => r.amount > 0);\n if (nonTrivial.length === 0) {\n return {\n success: true, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n const totalPendingUsd = pending.reduce((s, r) => s + r.estimatedValueUsd, 0);\n if (totalPendingUsd > 0 && totalPendingUsd < minValue) {\n return {\n success: true, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n // Snapshot USDC balance before compounding to scope deposit correctly\n const preUsdcCoins = await this._fetchCoins(USDC_TYPE);\n const preUsdcRaw = preUsdcCoins.reduce((s, c) => s + BigInt(c.balance), 0n);\n\n // Step 1: Claim — transfers reward tokens to wallet\n const claimResult = await this.claimRewards();\n if (!claimResult.tx) {\n return {\n success: false, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n // Step 2: Swap each non-USDC reward token to USDC via Cetus\n const { findSwapRoute, buildSwapTx } = await import('./protocols/cetus-swap.js');\n const swapTxs: string[] = [];\n let totalGasCost = claimResult.gasCost;\n\n for (const reward of nonTrivial) {\n if (!reward.coinType) continue;\n if (reward.coinType === USDC_TYPE) continue;\n\n try {\n const decimals = getDecimalsForCoinType(reward.coinType) ?? 9;\n const rawAmount = BigInt(Math.floor(reward.amount * 10 ** decimals));\n if (rawAmount <= 0n) continue;\n\n const coins = await this._fetchCoins(reward.coinType);\n if (coins.length === 0) continue;\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: reward.coinType,\n to: USDC_TYPE,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!route || route.insufficientLiquidity) continue;\n\n const swapResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const freshCoins = await this._fetchCoins(reward.coinType);\n if (freshCoins.length === 0) return tx;\n\n const merged = this._mergeCoinsInTx(tx, freshCoins);\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage: 0.01,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n swapTxs.push(swapResult.digest);\n totalGasCost += swapResult.gasCostSui;\n } catch (err) {\n console.warn(`[compound] Failed to swap ${reward.symbol}:`, err instanceof Error ? err.message : err);\n }\n }\n\n // Step 3: Deposit only the NEW USDC gained from compounding (not pre-existing balance)\n const postUsdcCoins = await this._fetchCoins(USDC_TYPE);\n const postUsdcRaw = postUsdcCoins.reduce((s, c) => s + BigInt(c.balance), 0n);\n const gainedRaw = postUsdcRaw > preUsdcRaw ? postUsdcRaw - preUsdcRaw : 0n;\n const depositUsdc = Number(gainedRaw) / 10 ** USDC_DEC;\n\n let depositTx = '';\n if (gainedRaw > 0n) {\n try {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const depositResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n const coins = await this._fetchCoins(USDC_TYPE);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins after swap');\n const merged = this._mergeCoinsInTx(tx, coins);\n const [inputCoin] = tx.splitCoins(merged, [gainedRaw]);\n await adapter.addSaveToTx!(tx, this._address, inputCoin, 'USDC');\n return tx;\n });\n depositTx = depositResult.digest;\n totalGasCost += depositResult.gasCostSui;\n } catch (err) {\n console.warn('[compound] NAVI deposit failed:', err instanceof Error ? err.message : err);\n }\n }\n\n const hasSubstantiveResult = swapTxs.length > 0 || depositTx !== '';\n return {\n success: hasSubstantiveResult,\n claimTx: claimResult.tx,\n swapTxs,\n depositTx,\n rewards: nonTrivial,\n totalCompoundedUsdc: depositUsdc,\n totalGasCost,\n };\n }\n\n // -- Info --\n\n async positions(): Promise<PositionsResult> {\n const allPositions = await this.registry.allPositions(this._address);\n const positions = allPositions.flatMap(p =>\n [\n ...p.positions.supplies\n .filter(s => s.amount > 0.005)\n .map(s => ({\n protocol: p.protocolId,\n asset: s.asset,\n type: 'save' as const,\n amount: s.amount,\n amountUsd: s.amountUsd,\n apy: s.apy,\n })),\n ...p.positions.borrows\n .filter(b => b.amount > 0.005)\n .map(b => ({\n protocol: p.protocolId,\n asset: b.asset,\n type: 'borrow' as const,\n amount: b.amount,\n amountUsd: b.amountUsd,\n apy: b.apy,\n })),\n ],\n );\n return { positions };\n }\n\n async rates(): Promise<RatesResult> {\n const allRatesResult = await this.registry.allRatesAcrossAssets();\n const result: RatesResult = {};\n for (const entry of allRatesResult) {\n if (!result[entry.asset] || entry.rates.saveApy > result[entry.asset].saveApy) {\n result[entry.asset] = { saveApy: entry.rates.saveApy, borrowApy: entry.rates.borrowApy };\n }\n }\n if (!result.USDC) result.USDC = { saveApy: 0, borrowApy: 0 };\n return result;\n }\n\n async allRates(asset = 'USDC') {\n return this.registry.allRates(asset);\n }\n\n async allRatesAcrossAssets() {\n return this.registry.allRatesAcrossAssets();\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this._address);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this._address);\n }\n\n // -- Helpers --\n\n private async resolveLending(protocol: string | undefined, asset: string, capability: 'save' | 'withdraw' | 'borrow' | 'repay'): Promise<LendingAdapter> {\n if (protocol) {\n const adapter = this.registry.getLending(protocol);\n if (!adapter) throw new T2000Error('ASSET_NOT_SUPPORTED', `Lending adapter '${protocol}' not found`);\n return adapter;\n }\n\n if (capability === 'save') {\n const { adapter } = await this.registry.bestSaveRate(asset);\n return adapter;\n }\n\n if (capability === 'borrow' || capability === 'repay') {\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) &&\n a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => a.name).join(', ');\n const altAssets = [...new Set(alternatives.flatMap(a => [...a.supportedAssets]))].join(', ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Available for ${capability}: ${altList} (assets: ${altAssets})`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) && a.capabilities.includes(capability),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => `${a.name} (${[...a.supportedAssets].join(', ')})`).join('; ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Try: ${altList}`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n private emitBalanceChange(asset: string, amount: number, cause: string, tx?: string): void {\n this.emit('balanceChange', { asset, previous: 0, current: 0, cause, tx });\n }\n}\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 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 { getCoinMeta } from '../token-registry.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\n/**\n * [Track B follow-up / 2026-05-08] Stateless wrapper around `getPendingRewards`\n * that creates its own `SuiJsonRpcClient`. Used by the engine's\n * `pending_rewards` tool — engine doesn't import `@mysten/sui` directly\n * (would expand its dep surface), so this helper accepts just `(address,\n * suiRpcUrl?)` and instantiates the client internally.\n *\n * **Why this exists.** Pre-fix the engine tool went through\n * `requireAgent(context).getPendingRewards()`, which threw\n * \"Tool requires a T2000 agent instance — pass `agent` in EngineConfig\"\n * in audric prod (audric uses sponsored-tx flow, never instantiates a\n * T2000 agent). Live mainnet smoke on funkii's wallet 2026-05-08 caught\n * this immediately when the LLM correctly called pending_rewards before\n * harvest_rewards. This helper makes the audric/CLI paths symmetric\n * (both work, neither requires an agent).\n *\n * Defaults `suiRpcUrl` to mainnet fullnode for CLI / standalone callers\n * that don't pass one. Errors propagate with the same `T2000Error`\n * shape as the underlying `getPendingRewards` (PROTOCOL_UNAVAILABLE on\n * NAVI degradation, etc.) so the engine tool's catch path is unchanged.\n */\nexport async function getPendingRewardsByAddress(\n address: string,\n suiRpcUrl?: string,\n): Promise<PendingReward[]> {\n const { SuiJsonRpcClient, getJsonRpcFullnodeUrl } = await import('@mysten/sui/jsonRpc');\n const client = new SuiJsonRpcClient({\n url: suiRpcUrl ?? getJsonRpcFullnodeUrl('mainnet'),\n network: 'mainnet',\n });\n return getPendingRewards(client, address);\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 // [S.118 follow-up — 2026-05-08]\n // Read from the same source as `addClaimRewardsToTx` (raw\n // `userClaimableReward`) and reuse the same aggregator\n // (`aggregateClaimableRewards`). Pre-fix this read iterated\n // `summaryLendingRewards(rewards).rewards.available` — a different NAVI\n // aggregation that produced row-structure AND per-coinType-total drift\n // vs the claim path (smoke on funkii's mainnet wallet showed 2 rows\n // here vs 1 row from `addClaimRewardsToTx`, with totals diverging by\n // ~1.36e-7 for the same vSUI cert across two NAVI pools). Routing both\n // through the same source + same aggregator removes the drift class\n // entirely and makes the contract test a true equality check (not\n // a tolerance-based one).\n const claimable = rewards.filter((r) => Number(r.userClaimableReward) > 0);\n return aggregateClaimableRewards(claimable);\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 // [S18-F20 follow-up] Resolve symbol via canonical registry first; falls\n // back to raw struct name only for unregistered coins. Mirrors the same\n // resolution in `getPendingRewards` so both readers narrate vSUI rewards\n // as \"vSUI\" instead of the raw \"CERT\" struct name.\n const meta = getCoinMeta(coinType);\n const symbol = meta?.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 { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, address);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n const totalYieldEarned = dailyEarning * 30;\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, address);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\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 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","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 // Deposit variants (entry_deposit / deposit + account-cap form for\n // harvest's internal save leg)\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::deposit_with_account_cap': 'save',\n // Withdraw variants\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::withdraw_with_account_cap': 'withdraw',\n 'incentive_v3::withdraw_with_account_cap_v': 'withdraw',\n 'incentive_v3::withdraw': 'withdraw',\n 'incentive_v3::withdraw_v': 'withdraw',\n // Borrow variants\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::borrow': 'borrow',\n 'incentive_v3::borrow_v': 'borrow',\n 'incentive_v3::borrow_with_account_cap': 'borrow',\n 'incentive_v3::borrow_with_account_cap_v': 'borrow',\n // Repay variants\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n 'incentive_v3::repay_with_account_cap': 'repay',\n // Claim-reward variants — required for `claim_rewards` tagging AND for\n // `harvest` compound-op detection in the indexer (paired with a save\n // target, classified as `harvest` instead of `claim`).\n 'incentive_v3::claim_reward': 'claim',\n 'incentive_v3::claim_reward_entry': 'claim',\n 'incentive_v3::claim_reward_with_account_cap': 'claim',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","export interface SafeguardConfig {\n locked: boolean;\n maxPerTx: number;\n maxDailySend: number;\n dailyUsed: number;\n dailyResetDate: string;\n maxLeverage?: number;\n maxPositionSize?: number;\n}\n\nexport interface TxMetadata {\n operation:\n | 'send'\n | 'save'\n | 'withdraw'\n | 'borrow'\n | 'repay'\n | 'pay';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n]);\n\nexport const DEFAULT_SAFEGUARD_CONFIG: SafeguardConfig = {\n locked: false,\n maxPerTx: 0,\n maxDailySend: 0,\n dailyUsed: 0,\n dailyResetDate: '',\n};\n","import { T2000Error } from '../errors.js';\n\nexport type SafeguardRule = 'locked' | 'maxPerTx' | 'maxDailySend';\n\nexport interface SafeguardErrorDetails {\n attempted?: number;\n limit?: number;\n current?: number;\n}\n\nexport class SafeguardError extends T2000Error {\n readonly rule: SafeguardRule;\n readonly details: SafeguardErrorDetails;\n\n constructor(rule: SafeguardRule, details: SafeguardErrorDetails, message?: string) {\n const msg = message ?? buildMessage(rule, details);\n super('SAFEGUARD_BLOCKED' as any, msg, { rule, ...details });\n this.name = 'SafeguardError';\n this.rule = rule;\n this.details = details;\n }\n\n override toJSON() {\n return {\n error: 'SAFEGUARD_BLOCKED' as const,\n message: this.message,\n retryable: this.retryable,\n data: { rule: this.rule, ...this.details },\n };\n }\n}\n\nfunction buildMessage(rule: SafeguardRule, details: SafeguardErrorDetails): string {\n switch (rule) {\n case 'locked':\n return 'Agent is locked. All operations are frozen.';\n case 'maxPerTx':\n return `Amount $${(details.attempted ?? 0).toFixed(2)} exceeds per-transaction limit ($${(details.limit ?? 0).toFixed(2)})`;\n case 'maxDailySend':\n return `Daily send limit reached ($${(details.current ?? 0).toFixed(2)}/$${(details.limit ?? 0).toFixed(2)} used today)`;\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SafeguardConfig, TxMetadata } from './types.js';\nimport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './types.js';\nimport { SafeguardError } from './errors.js';\n\nexport class SafeguardEnforcer {\n private config: SafeguardConfig;\n private readonly configPath: string | null;\n\n constructor(configDir?: string) {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n this.configPath = configDir ? join(configDir, 'config.json') : null;\n }\n\n load(): void {\n if (!this.configPath) return;\n try {\n const raw = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n this.config = {\n ...DEFAULT_SAFEGUARD_CONFIG,\n locked: raw.locked ?? false,\n maxPerTx: raw.maxPerTx ?? 0,\n maxDailySend: raw.maxDailySend ?? 0,\n dailyUsed: raw.dailyUsed ?? 0,\n dailyResetDate: raw.dailyResetDate ?? '',\n };\n } catch {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n }\n }\n\n assertNotLocked(): void {\n this.load();\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n }\n\n check(metadata: TxMetadata): void {\n this.load();\n\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n\n if (!OUTBOUND_OPS.has(metadata.operation)) return;\n\n const amount = metadata.amount ?? 0;\n\n if (this.config.maxPerTx > 0 && amount > this.config.maxPerTx) {\n throw new SafeguardError('maxPerTx', {\n attempted: amount,\n limit: this.config.maxPerTx,\n });\n }\n\n this.resetDailyIfNewDay();\n\n if (this.config.maxDailySend > 0 && this.config.dailyUsed + amount > this.config.maxDailySend) {\n throw new SafeguardError('maxDailySend', {\n attempted: amount,\n limit: this.config.maxDailySend,\n current: this.config.dailyUsed,\n });\n }\n }\n\n recordUsage(amount: number): void {\n this.resetDailyIfNewDay();\n this.config.dailyUsed += amount;\n this.save();\n }\n\n lock(): void {\n this.config.locked = true;\n this.save();\n }\n\n unlock(): void {\n this.config.locked = false;\n this.save();\n }\n\n set(key: string, value: unknown): void {\n if (key === 'locked' && typeof value === 'boolean') {\n this.config.locked = value;\n } else if (key === 'maxPerTx' && typeof value === 'number') {\n this.config.maxPerTx = value;\n } else if (key === 'maxDailySend' && typeof value === 'number') {\n this.config.maxDailySend = value;\n }\n this.save();\n }\n\n getConfig(): SafeguardConfig {\n this.load();\n this.resetDailyIfNewDay();\n return { ...this.config };\n }\n\n isConfigured(): boolean {\n return this.config.maxPerTx > 0 || this.config.maxDailySend > 0;\n }\n\n private resetDailyIfNewDay(): void {\n const today = new Date().toISOString().slice(0, 10);\n if (this.config.dailyResetDate !== today) {\n this.config.dailyUsed = 0;\n this.config.dailyResetDate = today;\n this.save();\n }\n }\n\n private save(): void {\n if (!this.configPath) return;\n try {\n let existing: Record<string, unknown> = {};\n try {\n existing = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n } catch {\n // no existing config\n }\n\n const merged = {\n ...existing,\n locked: this.config.locked,\n maxPerTx: this.config.maxPerTx,\n maxDailySend: this.config.maxDailySend,\n dailyUsed: this.config.dailyUsed,\n dailyResetDate: this.config.dailyResetDate,\n };\n\n const dir = this.configPath.replace(/[/\\\\][^/\\\\]+$/, '');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.configPath, JSON.stringify(merged, null, 2) + '\\n');\n } catch {\n // Best-effort persistence\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { validateAddress } from './utils/sui.js';\nimport { T2000Error } from './errors.js';\n\nexport interface Contact {\n name: string;\n address: string;\n}\n\nexport type ContactMap = Record<string, Contact>;\n\nconst RESERVED_NAMES = new Set(['to', 'all', 'address']);\n\nexport class ContactManager {\n private contacts: ContactMap = {};\n private readonly filePath: string;\n private readonly dir: string;\n\n constructor(configDir?: string) {\n this.dir = configDir ?? join(homedir(), '.t2000');\n this.filePath = join(this.dir, 'contacts.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.contacts = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.contacts = {};\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.contacts, null, 2));\n }\n\n add(name: string, address: string): { action: 'added' | 'updated' } {\n this.validateName(name);\n const normalized = validateAddress(address);\n const key = name.toLowerCase();\n const existed = key in this.contacts;\n this.contacts[key] = { name, address: normalized };\n this.save();\n return { action: existed ? 'updated' : 'added' };\n }\n\n remove(name: string): boolean {\n const key = name.toLowerCase();\n if (!(key in this.contacts)) return false;\n delete this.contacts[key];\n this.save();\n return true;\n }\n\n get(name: string): Contact | undefined {\n this.load();\n return this.contacts[name.toLowerCase()];\n }\n\n list(): Contact[] {\n this.load();\n return Object.values(this.contacts);\n }\n\n resolve(nameOrAddress: string): { address: string; contactName?: string } {\n this.load();\n\n if (nameOrAddress.startsWith('0x') && nameOrAddress.length >= 42) {\n return { address: validateAddress(nameOrAddress) };\n }\n\n const contact = this.contacts[nameOrAddress.toLowerCase()];\n if (contact) {\n return { address: contact.address, contactName: contact.name };\n }\n\n throw new T2000Error(\n 'CONTACT_NOT_FOUND',\n `\"${nameOrAddress}\" is not a valid Sui address or saved contact.\\n` +\n ` Add it: t2000 contacts add ${nameOrAddress} 0x...`,\n );\n }\n\n private validateName(name: string): void {\n if (name.startsWith('0x')) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names cannot start with 0x');\n }\n if (!/^[a-zA-Z0-9_]+$/.test(name)) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names can only contain letters, numbers, and underscores');\n }\n if (name.length > 32) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names must be 32 characters or fewer');\n }\n if (RESERVED_NAMES.has(name.toLowerCase())) {\n throw new T2000Error('INVALID_CONTACT_NAME', `\"${name}\" is a reserved name and cannot be used as a contact`);\n }\n }\n}\n","export { T2000 } from './t2000.js';\nexport type { TransactionSigner } from './signer.js';\nexport { KeypairSigner } from './wallet/keypairSigner.js';\nexport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nexport { ContactManager } from './contacts.js';\nexport { T2000Error, mapWalletError, mapMoveAbortCode } from './errors.js';\nexport type { T2000ErrorCode, T2000ErrorData } from './errors.js';\nexport type {\n T2000Options,\n BalanceResponse,\n GasReserve,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n AssetRates,\n RatesResult,\n PositionEntry,\n PositionsResult,\n EarningsResult,\n FundStatusResult,\n DepositInfo,\n PaymentRequest,\n TransactionRecord,\n PendingReward,\n ClaimRewardsResult,\n CompoundRewardsResult,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n FinancialSummary,\n HFAlertLevel,\n} from './types.js';\nexport {\n MIST_PER_SUI,\n SUI_DECIMALS,\n USDC_DECIMALS,\n BPS_DENOMINATOR,\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n T2000_OVERLAY_FEE_WALLET,\n SUPPORTED_ASSETS,\n CLOCK_ID,\n DEFAULT_NETWORK,\n} from './constants.js';\nexport type { SupportedAsset, StableAsset } from './constants.js';\nexport {\n STABLE_ASSETS,\n ALL_NAVI_ASSETS,\n GAS_RESERVE_MIN,\n CETUS_USDC_SUI_POOL,\n OPERATION_ASSETS,\n isAllowedAsset,\n assertAllowedAsset,\n} from './constants.js';\nexport type { Operation } from './constants.js';\nexport { validateAddress, truncateAddress, normalizeCoinType } from './utils/sui.js';\nexport {\n KNOWN_TARGETS,\n LABEL_PATTERNS,\n classifyAction,\n classifyLabel,\n fallbackLabel,\n refineLendingLabel,\n classifyTransaction,\n extractTransferDetails,\n} from './wallet/classify.js';\nexport type {\n ClassifyBalanceChange,\n ClassifyResult,\n ExtractedTransfer,\n TxDirection,\n} from './wallet/classify.js';\nexport {\n parseSuiRpcTx,\n extractTxSender,\n extractTxCommands,\n queryHistory,\n queryTransaction,\n} from './wallet/history.js';\nexport type { SuiRpcTxBlock } from './wallet/history.js';\nexport {\n mistToSui,\n suiToMist,\n usdcToRaw,\n rawToUsdc,\n stableToRaw,\n rawToStable,\n getDecimals,\n formatUsd,\n formatSui,\n formatAssetAmount,\n normalizeAsset,\n} from './utils/format.js';\nexport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nexport { buildSendTx, addSendToTx } from './wallet/send.js';\nexport {\n fetchAllCoins,\n selectAndSplitCoin,\n selectSuiCoin,\n} from './wallet/coinSelection.js';\nexport type { CoinPage, SelectAndSplitResult } from './wallet/coinSelection.js';\nexport {\n composeTx,\n deriveAllowedAddressesFromPtb,\n WRITE_APPENDER_REGISTRY,\n} from './composeTx.js';\nexport type {\n WriteToolName,\n WriteStep,\n ComposeTxOptions,\n ComposeTxResult,\n ComposeTxFeeHooks,\n ComposeTxFeeHookContext,\n AppenderContext,\n StepPreview,\n SaveDepositInput,\n WithdrawInput,\n BorrowInput,\n RepayDebtInput,\n SendTransferInput,\n SwapExecuteInput,\n ClaimRewardsInput,\n VoloStakeInput,\n VoloUnstakeInput,\n} from './composeTx.js';\nexport { calculateFee, addFeeTransfer } from './protocols/protocolFee.js';\nexport type { ProtocolFeeInfo, FeeOperation } from './protocols/protocolFee.js';\nexport {\n getFinancialSummary,\n HF_WARN_THRESHOLD,\n HF_CRITICAL_THRESHOLD,\n} from './protocols/financialSummary.js';\nexport type { FinancialSummaryOptions } from './protocols/financialSummary.js';\nexport { simulateTransaction, throwIfSimulationFailed } from './utils/simulate.js';\nexport type { SimulationResult } from './utils/simulate.js';\nexport {\n getRates,\n getPendingRewards,\n getPendingRewardsByAddress,\n addClaimRewardsToTx,\n buildClaimRewardsTx,\n aggregateClaimableRewards,\n} from './protocols/navi.js';\n// [Track B / 2026-05-08] Single-PTB compound flow: claim NAVI rewards,\n// swap each non-USDC reward to USDC inline (Cetus chain mode), deposit\n// the merged USDC into the NAVI USDC pool. ONE confirm card, atomic\n// settlement. Powers the engine's `harvest_rewards` tool and the\n// audric \"🌾 HARVEST\" chip.\nexport { buildHarvestRewardsTx } from './protocols/navi-harvest.js';\nexport type {\n HarvestPlan,\n HarvestSwapLeg,\n HarvestSkippedLeg,\n BuildHarvestRewardsTxOptions,\n} from './protocols/navi-harvest.js';\nexport { getSwapQuote } from './swap-quote.js';\nexport {\n findSwapRoute,\n buildSwapTx,\n addSwapToTx,\n OVERLAY_FEE_RATE,\n} from './protocols/cetus-swap.js';\nexport type { SwapRouteResult, OverlayFeeConfig } from './protocols/cetus-swap.js';\nexport {\n COIN_REGISTRY,\n TOKEN_MAP,\n resolveTokenType,\n resolveSymbol,\n getDecimalsForCoinType,\n getCoinMeta,\n isInRegistry,\n isTier1,\n isTier2,\n isSupported,\n getTier,\n SUI_TYPE,\n USDC_TYPE,\n USDT_TYPE,\n USDSUI_TYPE,\n USDE_TYPE,\n ETH_TYPE,\n WBTC_TYPE,\n WAL_TYPE,\n NAVX_TYPE,\n IKA_TYPE,\n LOFI_TYPE,\n MANIFEST_TYPE,\n} from './token-registry.js';\nexport type { CoinMeta } from './token-registry.js';\nexport {\n buildStakeVSuiTx,\n buildUnstakeVSuiTx,\n addStakeVSuiToTx,\n addUnstakeVSuiToTx,\n getVoloStats,\n VSUI_TYPE,\n VOLO_PKG,\n VOLO_POOL,\n VOLO_METADATA,\n} from './protocols/volo.js';\nexport type { VoloStats } from './protocols/volo.js';\nexport {\n AUDRIC_PARENT_NAME,\n AUDRIC_PARENT_NFT_ID,\n buildAddLeafTx,\n buildRevokeLeafTx,\n displayHandle,\n fullHandle,\n validateLabel,\n} from './protocols/suins-leaf.js';\nexport type {\n BuildAddLeafParams,\n BuildRevokeLeafParams,\n LabelValidationResult,\n} from './protocols/suins-leaf.js';\nexport * from './adapters/index.js';\nexport { SafeguardEnforcer, SafeguardError } from './safeguards/index.js';\nexport type { SafeguardConfig, TxMetadata, SafeguardRule, SafeguardErrorDetails } from './safeguards/index.js';\nexport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './safeguards/index.js';\n","/**\n * NAVI rewards harvest — single-PTB compound flow.\n *\n * **Goal.** Bundle the three-step \"claim → swap → save\" reward-cycling\n * routine into ONE atomic Programmable Transaction Block so the user\n * sees ONE confirm card instead of three sequential ones, and so the\n * legs settle together (or revert together — no half-claimed-but-\n * unsaved drift).\n *\n * **Flow.**\n * 1. Read pending rewards via NAVI's `getUserAvailableLendingRewards`\n * (same source as `getPendingRewards` + `addClaimRewardsToTx`, so\n * what the user sees in `pending_rewards` is exactly what gets\n * harvested — no drift).\n * 2. Append `claimLendingRewardsPTB(... { customCoinReceive: { type: 'skip' }})`\n * so the claimed coin handles are returned as `TransactionObjectArgument`\n * handles instead of being transferred to the wallet — they stay\n * consumable inside the same PTB.\n * 3. For each claimed handle:\n * • If the reward IS USDC, hold the handle for the deposit step.\n * • If the reward is in `COIN_REGISTRY` AND tradeable on Cetus\n * (any tier-2 token effectively), append `addSwapToTx` in chain\n * mode using the claimed coin as `inputCoin`. Collect the USDC\n * output handle.\n * • Else (untradeable / non-registry), transfer the claimed coin\n * back to the user's wallet — preserves the reward but skips\n * the auto-deposit (the user keeps it as a wallet asset).\n * 4. Merge all collected USDC handles via `tx.mergeCoins`, then deposit\n * via `addSaveToTx`.\n *\n * **Atomicity.** Single PTB = single transaction = single sponsored-gas\n * envelope. Either ALL legs settle (claim + swap(s) + deposit) or none\n * do. No partial-state recovery code needed.\n *\n * **Sponsored-gas posture.** This builder appends ONLY chained move\n * calls — no `tx.gas` reads, no Pyth fee writes, no oracle Pyth updates.\n * Cetus chain-mode swaps with `slippage` ≤ 5% don't require Pyth either\n * (Cetus aggregator routes around Pyth-dependent providers when callers\n * pass `providers: getProvidersExcluding(...)`). Audric's host wires\n * the provider exclusion automatically for Enoki sponsorship — see\n * `cetus-swap.ts` JSDoc.\n *\n * **Dust filter.** Rewards with `amount * priceCache.get(symbol) <\n * minRewardUsd` are skipped from the swap leg AND from the deposit —\n * not worth the gas to swap dust. They get transferred back to the\n * wallet (preserving on-chain truth: the claim happened, the swap\n * didn't). Default minRewardUsd = $0.01.\n *\n * **Failure modes.**\n * - PROTOCOL_UNAVAILABLE — NAVI rewards lookup or claim PTB build failed.\n * Engine surfaces \"NAVI is degraded right now.\"\n * - SWAP_NO_ROUTE — a reward asset has no Cetus route. Logged + that\n * leg is skipped (rewards transferred to wallet). Other legs proceed.\n * - INVALID_AMOUNT — rewards array empty after dust filter (nothing\n * worth harvesting). Throws so the engine narrates \"nothing to\n * harvest right now\" instead of building a no-op PTB.\n *\n * **Why a separate file (not inside `navi.ts`).** This composition\n * crosses two protocols (NAVI + Cetus) — keeping it out of `navi.ts`\n * preserves the single-protocol-per-file invariant the rest of the SDK\n * follows. Mirrors how `cetus-swap.ts` already lives separately even\n * though it composes through `composeTx.ts`.\n */\n\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { getUserAvailableLendingRewards, claimLendingRewardsPTB } from '@naviprotocol/lending';\nimport { T2000Error } from '../errors.js';\nimport { getCoinMeta, USDC_TYPE } from '../token-registry.js';\nimport { addSaveToTx, aggregateClaimableRewards } from './navi.js';\nimport { addSwapToTx, type OverlayFeeConfig } from './cetus-swap.js';\nimport type { PendingReward } from '../adapters/types.js';\n\n// -- types --------------------------------------------------------------\n\nexport interface HarvestSwapLeg {\n /** Reward symbol pre-swap (e.g. 'vSUI', 'NAVX'). */\n fromSymbol: string;\n /** Reward coinType pre-swap. */\n fromCoinType: string;\n /** Always 'USDC' — this builder only deposits to the USDC pool. */\n toSymbol: 'USDC';\n /** Display-units input amount (the entire claimed reward for that coin). */\n inputAmount: number;\n /** Display-units USDC the swap quote estimated. Actual on-chain may differ within slippage. */\n expectedOutputUsdc: number;\n}\n\nexport interface HarvestSkippedLeg {\n /** Reward symbol skipped (untradeable, dust, or no-route). */\n symbol: string;\n coinType: string;\n /** Display-units claimed amount (still credited to user's wallet — just not auto-deposited). */\n amount: number;\n /** 'untradeable' | 'dust' | 'no-route' */\n reason: 'untradeable' | 'dust' | 'no-route';\n}\n\nexport interface HarvestPlan {\n /** Every reward that WILL be claimed by this PTB. */\n claimed: PendingReward[];\n /** Each non-USDC reward that WILL be swapped to USDC inline. */\n swaps: HarvestSwapLeg[];\n /** Rewards claimed but transferred back to wallet (no auto-deposit). */\n skipped: HarvestSkippedLeg[];\n /** Display-units USDC that will be deposited to the NAVI USDC pool. */\n expectedUsdcDeposited: number;\n}\n\n/**\n * Callback invoked right before the harvest's internal `addSaveToTx`.\n * Mirrors the shape of `composeTx`'s `feeHooks.save_deposit` so audric's\n * existing hook can be threaded straight through without adapters. The\n * SDK never invents a fee — the host decides whether to skim from\n * `coin` and to where. See CLAUDE.md rule #9 (fees are a host concern).\n */\nexport type HarvestSaveFeeHook = (ctx: {\n tx: Transaction;\n coin: TransactionObjectArgument;\n input: { asset: 'USDC'; amount: number };\n sender: string;\n}) => void | Promise<void>;\n\nexport interface BuildHarvestRewardsTxOptions {\n /** Per-swap slippage tolerance (0.001–0.05). Defaults to 0.01 (1%). */\n slippage?: number;\n /**\n * USD floor for \"is this worth swapping?\". Rewards below this threshold\n * get transferred back to the wallet instead of swapped. Default $0.01.\n * Pass 0 to disable the filter (always swap; useful for tests).\n */\n minRewardUsd?: number;\n /**\n * Symbol → USD price map. Sourced from the engine's `ToolContext.priceCache`\n * in production; tests can pass a literal Map. When undefined, the dust\n * filter degrades to \"skip nothing\" (every reward is swapped) so we don't\n * accidentally drop large rewards just because we couldn't price them.\n */\n priceCache?: Map<string, number>;\n /**\n * Cetus provider allow-list. Sponsored callers (Enoki) pass\n * `getProvidersExcluding(['pyth-dependent-list'])` to keep the PTB\n * Pyth-free. Non-sponsored callers omit this.\n */\n providers?: string[];\n /**\n * [v1.24.2 fee wiring] Overlay fee forwarded to EACH internal\n * `addSwapToTx` call. When set, every swap leg charges the rate to\n * the receiver (typically `T2000_OVERLAY_FEE_WALLET` for audric).\n * Omit for fee-free harvests (CLI / direct SDK callers).\n */\n overlayFee?: OverlayFeeConfig;\n /**\n * [v1.24.2 fee wiring] Fired immediately before the internal\n * `addSaveToTx` consumes the merged USDC deposit coin. The hook\n * receives the deposit handle so it can split a fee off via\n * `addFeeTransfer(...)` (host's call). Audric threads its\n * `feeHooks.save_deposit` straight through here so a harvest's\n * deposit leg pays the same `SAVE_FEE_BPS` as a single-op `save`.\n *\n * Order is load-bearing: this hook fires AFTER all USDC handles\n * are merged into one and BEFORE the NAVI deposit consumes it.\n * Fee receiver gets recorded as a top-level transferObjects, so\n * it's automatically picked up by `derivedAllowedAddresses`.\n */\n saveFeeHook?: HarvestSaveFeeHook;\n}\n\n// -- builders -----------------------------------------------------------\n\n/**\n * Append the harvest legs (claim → swap(s) → save) to an EXISTING PTB.\n * Used by `composeTx`'s `harvest_rewards` registry appender so harvest\n * fits the same orchestration pattern as every other write tool.\n *\n * Standalone callers (CLI, smoke tests) should use `buildHarvestRewardsTx`\n * which wraps this with `tx.setSender(address)` and a fresh `Transaction`.\n */\nexport async function addHarvestToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options: BuildHarvestRewardsTxOptions = {},\n): Promise<HarvestPlan> {\n const slippage = options.slippage ?? 0.01;\n const minRewardUsd = options.minRewardUsd ?? 0.01;\n const priceCache = options.priceCache;\n\n // Step 1 — read pending rewards. Same source + same shape as\n // `getPendingRewards` so users see EXACTLY what they're about to harvest.\n let rawRewards;\n try {\n rawRewards = await getUserAvailableLendingRewards(address, {\n env: 'prod',\n client: client as never,\n markets: ['main'],\n });\n } catch (err) {\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-harvest-read' },\n true,\n );\n }\n\n const claimable = (rawRewards ?? []).filter((r) => Number(r.userClaimableReward) > 0);\n if (claimable.length === 0) {\n throw new T2000Error(\n 'INVALID_AMOUNT',\n 'No pending rewards to harvest.',\n { source: 'navi-harvest' },\n );\n }\n\n // Pre-aggregate so the plan + the claim PTB receive the SAME view —\n // mirrors `addClaimRewardsToTx`'s aggregation step. The PTB still gets\n // the raw `claimable` list (NAVI iterates per-pool internally); the\n // plan output uses the aggregated view (one row per coin, like the\n // `pending_rewards` tool surfaces).\n const aggregated = aggregateClaimableRewards(claimable);\n\n let claimed: Array<{ coin: TransactionObjectArgument; coinType: string }>;\n try {\n const claimResult = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n // 'skip' = NAVI doesn't auto-transfer; coin handles stay in the PTB\n // for downstream consumption. Verified against NAVI lending source\n // (index.esm.js@1828–1911) — when type !== 'transfer' && type !==\n // 'depositNAVI', the `else` branch pushes `{ coin, identifier, ... }`\n // to the return without consuming the handle.\n customCoinReceive: { type: 'skip' as const },\n });\n // NAVI's claim emits ONE entry per (asset, reward-type) row, NOT one\n // per claimable input row. Group by coin type to match the swap-plan\n // shape (one swap per coin type, regardless of how many pools it\n // came from).\n const grouped = new Map<string, TransactionObjectArgument[]>();\n for (const c of claimResult) {\n // c.identifier is a NAVI Pool — the suiCoinType field is the reward coin's full type.\n const ct = (c.identifier as { suiCoinType?: string }).suiCoinType ?? '';\n if (!ct) continue;\n const list = grouped.get(ct) ?? [];\n list.push(c.coin);\n grouped.set(ct, list);\n }\n // For each coin type, merge all NAVI-emitted handles into one (so\n // each coin type yields exactly ONE handle for swap/save chaining).\n claimed = [];\n for (const [coinType, handles] of grouped.entries()) {\n if (handles.length === 1) {\n claimed.push({ coin: handles[0], coinType });\n } else {\n // mergeCoins: tx.mergeCoins(destination, [sources...]) — destination\n // is the first; absorbs the rest; returns destination ref.\n const [dest, ...rest] = handles;\n tx.mergeCoins(dest, rest);\n claimed.push({ coin: dest, coinType });\n }\n }\n } catch (err) {\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-harvest-claim-ptb' },\n true,\n );\n }\n\n // Step 3 — classify each claimed coin: USDC (deposit-eligible), tradeable\n // (swap then deposit), or untradeable (transfer to wallet).\n const usdcHandles: TransactionObjectArgument[] = [];\n const swaps: HarvestSwapLeg[] = [];\n const skipped: HarvestSkippedLeg[] = [];\n\n // For computing expected USDC totals — sum claimed USDC + each swap quote.\n let expectedUsdcDeposited = 0;\n\n for (const { coin, coinType } of claimed) {\n const aggRow = aggregated.find((r) => r.coinType === coinType);\n if (!aggRow) {\n // Defensive — shouldn't happen since claimable feeds both paths.\n continue;\n }\n\n if (coinType === USDC_TYPE) {\n usdcHandles.push(coin);\n expectedUsdcDeposited += aggRow.amount;\n continue;\n }\n\n const meta = getCoinMeta(coinType);\n const isTradeable = meta && (meta.tier === 1 || meta.tier === 2);\n if (!isTradeable) {\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'untradeable',\n });\n continue;\n }\n\n // Dust filter — only when we have a price for the symbol.\n if (priceCache && minRewardUsd > 0) {\n const px = priceCache.get(aggRow.symbol.toUpperCase());\n if (px && px > 0 && aggRow.amount * px < minRewardUsd) {\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'dust',\n });\n continue;\n }\n }\n\n // Tradeable + above-dust — append swap leg in chain mode.\n try {\n const swapResult = await addSwapToTx(tx, client, address, {\n from: aggRow.symbol,\n to: 'USDC',\n amount: aggRow.amount,\n slippage,\n inputCoin: coin,\n providers: options.providers,\n overlayFee: options.overlayFee,\n });\n usdcHandles.push(swapResult.coin);\n expectedUsdcDeposited += swapResult.expectedAmountOut;\n swaps.push({\n fromSymbol: aggRow.symbol,\n fromCoinType: coinType,\n toSymbol: 'USDC',\n inputAmount: swapResult.effectiveAmountIn,\n expectedOutputUsdc: swapResult.expectedAmountOut,\n });\n } catch (err) {\n // SWAP_NO_ROUTE / SWAP_FAILED for this leg → transfer to wallet\n // and continue. Other reward legs still settle.\n const code = err instanceof T2000Error ? err.code : 'UNKNOWN';\n if (code !== 'SWAP_NO_ROUTE' && code !== 'SWAP_FAILED') {\n // Non-routing failure (e.g. provider down) — re-throw so the user\n // doesn't silently get a degraded harvest.\n throw err;\n }\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'no-route',\n });\n }\n }\n\n // Step 4 — merge USDC handles + deposit, OR no-op if nothing to deposit.\n if (usdcHandles.length > 0) {\n let depositCoin: TransactionObjectArgument;\n if (usdcHandles.length === 1) {\n depositCoin = usdcHandles[0];\n } else {\n const [primary, ...rest] = usdcHandles;\n tx.mergeCoins(primary, rest);\n depositCoin = primary;\n }\n // [v1.24.2 fee wiring] Skim the host's save fee BEFORE deposit\n // consumes the coin. Same ordering rule as the single-op `save`\n // path: feeHooks.save_deposit fires after the user's USDC is in\n // hand, before the NAVI deposit move call. `expectedUsdcDeposited`\n // is the pre-fee total (claimed USDC + each swap quote); the hook\n // skims a fraction of it and the NAVI deposit consumes the\n // remainder.\n if (options.saveFeeHook) {\n await options.saveFeeHook({\n tx,\n coin: depositCoin,\n input: { asset: 'USDC', amount: expectedUsdcDeposited },\n sender: address,\n });\n }\n try {\n await addSaveToTx(tx, client, address, depositCoin, { asset: 'USDC' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI deposit failed during harvest: ${msg}`,\n { source: 'navi-harvest-deposit' },\n true,\n );\n }\n }\n // If usdcHandles is empty, all rewards were skipped (untradeable / dust /\n // no-route) and transferred to the wallet — no deposit needed. The plan\n // returns expectedUsdcDeposited = 0, which the engine tool surfaces as\n // \"claimed X but nothing to deposit; rewards are in your wallet.\"\n\n return {\n claimed: aggregated,\n swaps,\n skipped,\n expectedUsdcDeposited,\n };\n}\n\n/**\n * Standalone harvest builder — creates a fresh PTB, sets the sender,\n * appends the full harvest flow, and returns both the tx and the plan.\n * Used by CLI / direct SDK callers (smoke tests, scripts). The audric\n * host goes through `composeTx({ steps: [{ toolName: 'harvest_rewards' }] })`\n * which wires the appender + Enoki sponsorship.\n */\nexport async function buildHarvestRewardsTx(\n client: SuiJsonRpcClient,\n address: string,\n options: BuildHarvestRewardsTxOptions = {},\n): Promise<{ tx: Transaction; plan: HarvestPlan }> {\n const tx = new Transaction();\n tx.setSender(address);\n const plan = await addHarvestToTx(tx, client, address, options);\n return { tx, plan };\n}\n\n","/**\n * SPEC 7 v0.4 § Layer 0 — Canonical Write Architecture.\n *\n * `composeTx({ steps })` is the single canonical entry-point for every\n * Audric Enoki-sponsored write. The fragment-appender pattern (Layer 1)\n * is the implementation; this primitive dispatches each step to its\n * registered appender from the typed `WRITE_APPENDER_REGISTRY`.\n *\n * Single-write and multi-write go through the same code path. A 1-step\n * `composeTx([{ toolName: 'send_transfer', input: {...} }])` produces\n * the same shape of result as a 3-step bundle.\n *\n * **Why this exists**\n *\n * Pre-Layer-0, four parallel write stacks lived across the audric host:\n * `transactions/prepare` (fat ~600-line route), `services/prepare`\n * (hand-rolled), `debug-swap` (diagnostic), and PayButton (dapp-kit).\n * Each one re-implemented merge/split/transfer + hand-maintained the\n * `allowedAddresses` array Enoki requires. Two production bugs in the\n * past 60 days came from drift between them — PR-H1 (claim-rewards\n * self-transfer missing from allowedAddresses) and PR-H4 (borrow/\n * withdraw self-transfer same bug).\n *\n * Layer 0 collapses 3 of those stacks into one canonical primitive.\n * PayButton stays out by design (different signer, different trust\n * model — see `audric-canonical-write.mdc` for the rationale and the\n * `// CANONICAL-BYPASS:` escape-hatch contract).\n *\n * **What composeTx owns**\n *\n * - PTB assembly via per-tool wallet-mode appenders (the\n * `WRITE_APPENDER_REGISTRY`).\n * - Pre-built `txKindBytes` (`tx.build({ onlyTransactionKind: true })`)\n * ready for Enoki's `createSponsoredTransaction`.\n * - Auto-derived `derivedAllowedAddresses` from the assembled PTB's\n * top-level `transferObjects` calls — eliminates the PR-H1/H4 bug\n * class permanently. Hand-maintained arrays are now unreachable.\n * - S.38 Pyth flag plumbing — `sponsoredContext: true` automatically\n * applies `skipPythUpdate` (borrow/withdraw) and `skipOracle` (repay)\n * to NAVI appenders so Enoki doesn't reject `tx.gas`-as-argument.\n *\n * **What composeTx does NOT own**\n *\n * - **Fees** — Audric concern, not @t2000/sdk concern (CLAUDE.md\n * rule #9). The SDK is fee-free by design as of @t2000/sdk@1.1.0\n * (B5 v2). Audric host wraps composeTx with fee insertion in P2.2c.\n * - **Sponsorship** — caller's job. composeTx returns `txKindBytes`\n * pre-built for Enoki; the caller calls `createSponsoredTransaction`\n * with their JWT.\n * - **Chain-mode coin handoff between steps** — Layer 2 (engine\n * bundling) ships this. P2.2b is wallet-mode-only: each step fetches\n * coins independently. Layer 2 will extend by introducing\n * `inputCoinFromStep: number` to thread upstream output coins.\n *\n * **Cross-references**\n *\n * - Spec → `spec/SPEC_7_MULTI_WRITE_PTB.md` § \"Layer 0: Canonical\n * Write Architecture\"\n * - Read-side companion → `t2000/.cursor/rules/single-source-of-truth.mdc`\n * + `audric/.cursor/rules/audric-canonical-portfolio.mdc`\n * - Write-side rule → `audric/.cursor/rules/audric-canonical-write.mdc`\n */\n\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n Transaction,\n type TransactionObjectArgument,\n} from '@mysten/sui/transactions';\nimport type { OverlayFeeConfig } from './protocols/cetus-swap.js';\nimport {\n addSaveToTx,\n addWithdrawToTx,\n addBorrowToTx,\n addRepayToTx,\n addClaimRewardsToTx,\n} from './protocols/navi.js';\nimport { addHarvestToTx } from './protocols/navi-harvest.js';\nimport type { PendingReward } from './adapters/types.js';\nimport { addSwapToTx, type SwapRouteResult } from './protocols/cetus-swap.js';\nimport {\n addStakeVSuiToTx,\n addUnstakeVSuiToTx,\n} from './protocols/volo.js';\nimport { addSendToTx } from './wallet/send.js';\nimport { selectAndSplitCoin, selectSuiCoin } from './wallet/coinSelection.js';\nimport { resolveTokenType, getDecimalsForCoinType, SUI_TYPE } from './token-registry.js';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from './constants.js';\nimport { T2000Error } from './errors.js';\nimport { validateAddress } from './utils/sui.js';\n\n/**\n * Canonical write tools. The 10 tools that can be composed into a PTB\n * (Track B 2026-05-08 added `harvest_rewards`).\n *\n * Excluded by design:\n * - `pay_api` — recipient/amount unknown at compose time; the on-chain\n * leg uses `send_transfer` after the gateway 402 challenge resolves.\n * - `save_contact` — no on-chain leg (Prisma-only).\n */\nexport type WriteToolName =\n | 'save_deposit'\n | 'withdraw'\n | 'borrow'\n | 'repay_debt'\n | 'send_transfer'\n | 'swap_execute'\n | 'claim_rewards'\n // [Track B / 2026-05-08] Compound: claim NAVI rewards → swap each non-USDC\n // reward to USDC inline → deposit into NAVI USDC pool. ONE confirm card.\n | 'harvest_rewards'\n | 'volo_stake'\n | 'volo_unstake';\n\n// Per-tool input contracts. Match the engine tool input schemas, not the\n// audric host's loosely-typed `params` blob — the registry is the typed\n// surface that lets the host shed the `any`-typed switch statement.\n\nexport interface SaveDepositInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface WithdrawInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface BorrowInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface RepayDebtInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface SendTransferInput {\n to: string;\n amount: number;\n asset?: SupportedAsset;\n}\n\nexport interface SwapExecuteInput {\n from: string;\n to: string;\n amount: number;\n slippage?: number;\n byAmountIn?: boolean;\n /** Cetus provider allow-list. Sponsored callers MUST pass an exclusion list\n * to remove Pyth-dependent providers — see addSwapToTx JSDoc. composeTx\n * derives this automatically from `sponsoredContext` if omitted. */\n providers?: string[];\n}\n\nexport type ClaimRewardsInput = Record<string, never>;\n\n/**\n * [Track B] `harvest_rewards` accepts only optional tunables — no required\n * inputs, since the user's choice is binary (\"harvest now\" or not). Default\n * slippage 1%, default dust floor $0.01. The audric host's HARVEST chip\n * passes literal `{}` and gets sensible defaults.\n */\nexport interface HarvestRewardsInput {\n /** Per-swap slippage tolerance (0.001–0.05). Default 0.01 (1%). */\n slippage?: number;\n /** USD floor for \"is this worth swapping?\" — dust below transfers to wallet. Default $0.01. */\n minRewardUsd?: number;\n}\n\nexport interface VoloStakeInput {\n amountSui: number;\n}\n\nexport interface VoloUnstakeInput {\n amountVSui: number | 'all';\n}\n\n/**\n * Discriminated union mapping `toolName` → `input`. Used to type\n * `WriteStep` so consumers get autocomplete + compile-time validation\n * that the input matches the tool.\n *\n * **[SPEC 13 Phase 1] `inputCoinFromStep`** — consumer steps may\n * reference an earlier step's output coin handle by index. When set,\n * `composeTx`'s orchestration loop threads the producer's\n * `outputCoin` into this step's appender as the `inputCoin` arg,\n * bypassing the wallet pre-fetch path. The producer's terminal\n * `tx.transferObjects([coin], sender)` is suppressed automatically so\n * the same handle isn't double-consumed.\n *\n * Producer-only tools (`withdraw`, `borrow`, `claim_rewards`) don't\n * accept the field — they have no input coin slot. Consumer +\n * dual-mode tools all accept it.\n */\nexport type WriteStep =\n | { toolName: 'save_deposit'; input: SaveDepositInput; inputCoinFromStep?: number }\n | { toolName: 'withdraw'; input: WithdrawInput }\n | { toolName: 'borrow'; input: BorrowInput }\n | { toolName: 'repay_debt'; input: RepayDebtInput; inputCoinFromStep?: number }\n | { toolName: 'send_transfer'; input: SendTransferInput; inputCoinFromStep?: number }\n | { toolName: 'swap_execute'; input: SwapExecuteInput; inputCoinFromStep?: number }\n | { toolName: 'claim_rewards'; input: ClaimRewardsInput }\n // Self-contained compound — internally claims, swaps, and deposits in\n // one PTB. Doesn't accept `inputCoinFromStep` because it's the only\n // step in the bundle (it's a \"macro\" appender, not a chainable producer\n // or consumer).\n | { toolName: 'harvest_rewards'; input: HarvestRewardsInput }\n | { toolName: 'volo_stake'; input: VoloStakeInput; inputCoinFromStep?: number }\n | { toolName: 'volo_unstake'; input: VoloUnstakeInput; inputCoinFromStep?: number };\n\nexport interface ComposeTxOptions {\n sender: string;\n steps: WriteStep[];\n client: SuiJsonRpcClient;\n /**\n * S.38 Pyth flag (sponsorship-critical). When true:\n * - NAVI borrow/withdraw appenders apply `skipPythUpdate: true`\n * (preserves on-chain price-feed updates, skips the tx.gas-using\n * Pyth fee payment that Enoki rejects).\n * - NAVI repay appender applies `skipOracle: true` (debt reduction\n * has no health-factor risk, full oracle bypass is safe).\n * - Cetus swap appender applies `getProvidersExcluding([HAEDALPMM,\n * METASTABLE, OBRIC, STEAMM_OMM, STEAMM_OMM_V2, SEVENK,\n * HAEDALHMMV2])` — Pyth-dependent providers reference `tx.gas` for\n * oracle fees, also rejected by Enoki.\n * - SUI sends fetch coins via `getCoins` (tx.gas belongs to sponsor,\n * not user) instead of splitting from `tx.gas`.\n *\n * Self-funded callers (CLI, MCP, server tasks) leave this `false` /\n * omit — they pay all oracle/Pyth fees from their own SUI gas.\n */\n sponsoredContext?: boolean;\n /**\n * Per-call overlay fee config for Cetus swaps. Audric host passes\n * `{ rate: 0.001, receiver: T2000_OVERLAY_FEE_WALLET }` to charge the\n * 0.1% swap overlay. CLI / direct SDK callers omit. Forwarded to\n * `addSwapToTx`'s `input.overlayFee`.\n */\n overlayFee?: OverlayFeeConfig;\n /**\n * Optional fee-injection hooks for save_deposit + borrow. Fires inside\n * the appender at the exact moment the user's coin is in hand and BEFORE\n * the protocol step consumes (save) or the canonical transferObjects\n * finalizes (borrow). Audric host uses this to inline `addFeeTransfer`\n * for USDC SAVE_FEE_BPS / BORROW_FEE_BPS without ever leaving the\n * canonical write contract — keeps the SDK fee-free per CLAUDE.md\n * rule #9 while letting hosts charge their own overlay fees.\n *\n * Hooks are fire-and-forget (no return value). They mutate `tx` directly\n * (e.g., `addFeeTransfer(tx, coin, ...)` splits the fee chunk off and\n * appends a top-level `transferObjects` to the host's fee wallet — that\n * recipient automatically appears in `derivedAllowedAddresses`).\n */\n feeHooks?: ComposeTxFeeHooks;\n}\n\n/**\n * Per-tool fee-injection callbacks. Each hook fires at a tool-specific\n * moment in the appender flow (see field JSDoc). Currently scoped to\n * the 2 fee-eligible tools — extend if/when new ones land.\n */\nexport interface ComposeTxFeeHooks {\n /**\n * Fires inside the `save_deposit` appender AFTER the user's USDC/USDsui\n * coin is split into the deposit amount, BEFORE NAVI's `deposit` move\n * call consumes the coin. Order matters: the `coin` reference passed in\n * is the SAME `TransactionObjectArgument` that flows into the deposit,\n * so any `splitCoins(coin, [feeAmount])` inside the hook reduces the\n * deposit by exactly that fee.\n */\n save_deposit?: (ctx: ComposeTxFeeHookContext<SaveDepositInput>) => void | Promise<void>;\n /**\n * Fires inside the `borrow` appender AFTER NAVI returns the borrowed\n * coin, BEFORE the canonical `transferObjects(coin, sender)` finalizes.\n * The `coin` reference is the borrowed-and-not-yet-transferred output;\n * splitting a fee here means the user receives the remainder.\n */\n borrow?: (ctx: ComposeTxFeeHookContext<BorrowInput>) => void | Promise<void>;\n}\n\n/**\n * Context object passed to every fee hook. Carries the `tx` (mutate it),\n * the in-flight `coin` (split fees off it), the resolved tool input\n * (asset/amount for fee-policy decisions), and the sender (rarely needed\n * but kept for symmetry with `AppenderContext`).\n */\nexport interface ComposeTxFeeHookContext<TInput> {\n tx: Transaction;\n coin: TransactionObjectArgument;\n input: TInput;\n sender: string;\n}\n\n/** Per-step preview returned by each registry appender. Tool-specific shape. */\nexport type StepPreview =\n | { toolName: 'save_deposit'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'withdraw'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'borrow'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'repay_debt'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'send_transfer'; effectiveAmount: number; recipient: string; asset: SupportedAsset }\n | { toolName: 'swap_execute'; effectiveAmountIn: number; expectedAmountOut: number; route: SwapRouteResult }\n | { toolName: 'claim_rewards'; rewards: PendingReward[] }\n // Compact: the audric host renders a multi-line \"Claim → Swap → Save\"\n // breakdown card from this preview (claimed[], swaps[], skipped[],\n // expectedUsdcDeposited). One signature, one settlement.\n | {\n toolName: 'harvest_rewards';\n claimed: PendingReward[];\n swaps: Array<{\n fromSymbol: string;\n fromCoinType: string;\n toSymbol: 'USDC';\n inputAmount: number;\n expectedOutputUsdc: number;\n }>;\n skipped: Array<{\n symbol: string;\n coinType: string;\n amount: number;\n reason: 'untradeable' | 'dust' | 'no-route';\n }>;\n expectedUsdcDeposited: number;\n }\n | { toolName: 'volo_stake'; effectiveAmountMist: bigint }\n | { toolName: 'volo_unstake'; effectiveAmountMist: bigint | 'all' };\n\nexport interface ComposeTxResult {\n tx: Transaction;\n /**\n * Pre-built bytes for Enoki's `createSponsoredTransaction`. Built\n * with `onlyTransactionKind: true` so the gas coin can be supplied\n * by the sponsor.\n */\n txKindBytes: Uint8Array;\n /**\n * Auto-derived from the assembled PTB's top-level `transferObjects`\n * commands. Replaces hand-maintained `allowedAddresses` arrays in\n * audric host's `transactions/prepare` + `services/prepare` —\n * eliminates the PR-H1/H4 bug class permanently.\n */\n derivedAllowedAddresses: string[];\n perStepPreviews: StepPreview[];\n}\n\n/**\n * Per-appender context passed into every registry entry. Carries the\n * RPC client, sender, sponsorship flag, optional per-call overlay\n * fee config (Cetus swaps), and SPEC 13 Phase 1 chain-mode fields.\n */\nexport interface AppenderContext {\n client: SuiJsonRpcClient;\n sender: string;\n sponsoredContext: boolean;\n overlayFee?: OverlayFeeConfig;\n feeHooks?: ComposeTxFeeHooks;\n /**\n * [SPEC 13 Phase 1] When set, the consumer appender consumes this\n * coin handle directly instead of pre-fetching from the wallet via\n * `selectAndSplitCoin` / `selectSuiCoin`. Provided by the\n * orchestration loop when the step has `inputCoinFromStep` set; the\n * loop looks up `priorOutputs[step.inputCoinFromStep]` and threads\n * it through here.\n *\n * In chain mode, the consumer consumes the handle IN FULL — the\n * `input.amount` field is treated as informational (used for preview\n * math). This matches Cetus's `routerSwap`, NAVI's `deposit`/`repay`,\n * and the Sui `transferObjects` semantics: each takes a coin object\n * and consumes its entire balance.\n */\n chainedCoin?: TransactionObjectArgument;\n /**\n * [SPEC 13 Phase 1] True when this step's output coin will be\n * consumed by a downstream step (some later step has\n * `inputCoinFromStep === currentStepIndex`). Producer appenders MUST\n * skip their terminal `tx.transferObjects([coin], ctx.sender)` call\n * when this is true — otherwise the same `TransactionObjectArgument`\n * gets used twice (once by the consumer, once by the transfer) and\n * the PTB build fails or the on-chain leg reverts.\n */\n isOutputConsumed?: boolean;\n}\n\n/**\n * [SPEC 13 Phase 1] Appender return shape. Producers populate\n * `outputCoin` so the orchestration loop can thread it into a\n * downstream consumer's `chainedCoin`. Terminal consumers\n * (`save_deposit`, `repay_debt`, `send_transfer`) omit it.\n *\n * `swap_execute`, `volo_stake`, and `volo_unstake` are dual-mode —\n * they accept `chainedCoin` AND populate `outputCoin`.\n */\nexport interface AppenderResult<TPreview extends StepPreview> {\n preview: TPreview;\n outputCoin?: TransactionObjectArgument;\n}\n\ntype AppenderFn<TInput, TPreview extends StepPreview> = (\n tx: Transaction,\n input: TInput,\n ctx: AppenderContext,\n) => Promise<AppenderResult<TPreview>>;\n\n/**\n * Cetus provider exclusion list for sponsored flows. Mirrors the\n * audric host's `SPONSORED_TX_PROVIDERS` constant — these 7 providers\n * reference `tx.gas` for Pyth oracle fee payments, which Enoki rejects.\n *\n * NOTE: keeping this hardcoded means `findSwapRoute` doesn't need a\n * dependency on `@cetusprotocol/aggregator-sdk`'s `getProvidersExcluding`\n * helper — composeTx forwards the literal list to Cetus, Cetus does the\n * inverse lookup. Result is identical.\n */\nconst SPONSORED_PYTH_DEPENDENT_PROVIDERS = [\n 'HAEDALPMM',\n 'METASTABLE',\n 'OBRIC',\n 'STEAMM_OMM',\n 'STEAMM_OMM_V2',\n 'SEVENK',\n 'HAEDALHMMV2',\n] as const;\n\n/**\n * Get all eligible Cetus provider names except the Pyth-dependent ones,\n * for sponsored swap context. Computed from the Cetus SDK's\n * `getAllProviders()` minus the exclusion list.\n */\nasync function getSponsoredSwapProviders(): Promise<string[]> {\n const { getProvidersExcluding } = await import('@cetusprotocol/aggregator-sdk');\n return getProvidersExcluding([...SPONSORED_PYTH_DEPENDENT_PROVIDERS]);\n}\n\n/** Resolve canonical asset symbol or throw `INVALID_ASSET`. */\nfunction resolveSaveableAsset(asset: 'USDC' | 'USDsui' | undefined): 'USDC' | 'USDsui' {\n if (!asset) return 'USDC';\n if (asset !== 'USDC' && asset !== 'USDsui') {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Saveable asset must be USDC or USDsui, got ${asset}`);\n }\n return asset;\n}\n\n/**\n * The typed registry. Each entry is a wallet-mode dispatcher that takes\n * (tx, input, ctx) and returns a per-step preview. Compile-time check\n * that all 10 `WriteToolName` values have an entry — TypeScript will\n * fail the build if a tool is missing.\n */\nexport const WRITE_APPENDER_REGISTRY: {\n save_deposit: AppenderFn<SaveDepositInput, Extract<StepPreview, { toolName: 'save_deposit' }>>;\n withdraw: AppenderFn<WithdrawInput, Extract<StepPreview, { toolName: 'withdraw' }>>;\n borrow: AppenderFn<BorrowInput, Extract<StepPreview, { toolName: 'borrow' }>>;\n repay_debt: AppenderFn<RepayDebtInput, Extract<StepPreview, { toolName: 'repay_debt' }>>;\n send_transfer: AppenderFn<SendTransferInput, Extract<StepPreview, { toolName: 'send_transfer' }>>;\n swap_execute: AppenderFn<SwapExecuteInput, Extract<StepPreview, { toolName: 'swap_execute' }>>;\n claim_rewards: AppenderFn<ClaimRewardsInput, Extract<StepPreview, { toolName: 'claim_rewards' }>>;\n harvest_rewards: AppenderFn<HarvestRewardsInput, Extract<StepPreview, { toolName: 'harvest_rewards' }>>;\n volo_stake: AppenderFn<VoloStakeInput, Extract<StepPreview, { toolName: 'volo_stake' }>>;\n volo_unstake: AppenderFn<VoloUnstakeInput, Extract<StepPreview, { toolName: 'volo_unstake' }>>;\n} = {\n save_deposit: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be greater than zero');\n }\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveAmount: bigint;\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveAmount = rawAmount;\n } else {\n const r = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = r.coin;\n effectiveAmount = r.effectiveAmount;\n }\n\n if (ctx.feeHooks?.save_deposit) {\n await ctx.feeHooks.save_deposit({ tx, coin, input, sender: ctx.sender });\n }\n await addSaveToTx(tx, ctx.client, ctx.sender, coin, { asset });\n return {\n preview: {\n toolName: 'save_deposit',\n effectiveAmount: Number(effectiveAmount) / 10 ** assetInfo.decimals,\n asset,\n },\n };\n },\n\n withdraw: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdraw amount must be greater than zero');\n }\n const { coin, effectiveAmount } = await addWithdrawToTx(\n tx, ctx.client, ctx.sender, input.amount,\n { asset, skipPythUpdate: ctx.sponsoredContext },\n );\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([coin], ctx.sender);\n }\n return {\n preview: { toolName: 'withdraw', effectiveAmount, asset },\n outputCoin: coin,\n };\n },\n\n borrow: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be greater than zero');\n }\n const coin = await addBorrowToTx(\n tx, ctx.client, ctx.sender, input.amount,\n { asset, skipPythUpdate: ctx.sponsoredContext },\n );\n if (ctx.feeHooks?.borrow) {\n await ctx.feeHooks.borrow({ tx, coin, input, sender: ctx.sender });\n }\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([coin], ctx.sender);\n }\n return {\n preview: { toolName: 'borrow', effectiveAmount: input.amount, asset },\n outputCoin: coin,\n };\n },\n\n repay_debt: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be greater than zero');\n }\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveAmount: bigint;\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveAmount = rawAmount;\n } else {\n const r = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = r.coin;\n effectiveAmount = r.effectiveAmount;\n }\n\n await addRepayToTx(tx, ctx.client, ctx.sender, coin, {\n asset,\n skipOracle: ctx.sponsoredContext,\n });\n return {\n preview: {\n toolName: 'repay_debt',\n effectiveAmount: Number(effectiveAmount) / 10 ** assetInfo.decimals,\n asset,\n },\n };\n },\n\n send_transfer: async (tx, input, ctx) => {\n const recipient = validateAddress(input.to);\n const asset: SupportedAsset = input.asset ?? 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (!assetInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Send amount must be greater than zero');\n }\n\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveRaw: bigint;\n\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveRaw = rawAmount;\n } else if (asset === 'SUI') {\n const result = await selectSuiCoin(tx, ctx.client, ctx.sender, rawAmount, ctx.sponsoredContext);\n coin = result.coin;\n effectiveRaw = result.effectiveAmount;\n } else {\n const result = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = result.coin;\n effectiveRaw = result.effectiveAmount;\n }\n\n addSendToTx(tx, coin, recipient);\n return {\n preview: {\n toolName: 'send_transfer',\n effectiveAmount: Number(effectiveRaw) / 10 ** assetInfo.decimals,\n recipient,\n asset,\n },\n };\n },\n\n swap_execute: async (tx, input, ctx) => {\n const fromType = resolveTokenType(input.from);\n const toType = resolveTokenType(input.to);\n if (!fromType || !toType) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `Unknown token in swap: from=${input.from}, to=${input.to}`,\n );\n }\n\n const providers = input.providers\n ?? (ctx.sponsoredContext ? await getSponsoredSwapProviders() : undefined);\n\n const result = await addSwapToTx(tx, ctx.client, ctx.sender, {\n from: input.from,\n to: input.to,\n amount: input.amount,\n slippage: input.slippage,\n byAmountIn: input.byAmountIn,\n overlayFee: ctx.overlayFee,\n providers,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: {\n toolName: 'swap_execute',\n effectiveAmountIn: result.effectiveAmountIn,\n expectedAmountOut: result.expectedAmountOut,\n route: result.route,\n },\n outputCoin: result.coin,\n };\n },\n\n claim_rewards: async (tx, _input, ctx) => {\n const rewards = await addClaimRewardsToTx(tx, ctx.client, ctx.sender);\n return { preview: { toolName: 'claim_rewards', rewards } };\n },\n\n // [Track B / 2026-05-08] Macro appender — assembles claim → swap(s) →\n // save inline. The audric host wires `getSponsoredSwapProviders()` into\n // `options.providers` automatically when `ctx.sponsoredContext === true`\n // (parity with `swap_execute` below). Slippage + dust-floor pulled from\n // the input; price cache is forwarded from the host so the dust filter\n // can compare claimed amounts to USD.\n harvest_rewards: async (tx, input, ctx) => {\n const providers = ctx.sponsoredContext ? await getSponsoredSwapProviders() : undefined;\n // [v1.24.2 fee wiring] Forward host fee config into the harvest macro\n // so each internal swap leg charges the overlay AND the deposit leg\n // skims the save fee. Without this, harvest_rewards bypassed both\n // mechanisms (live-prod regression observed 2026-05-08 — see S.120).\n // The save_deposit hook is reused as-is; the harvest macro calls it\n // with `input.asset === 'USDC'` and the merged USDC deposit coin,\n // matching what the audric host's hook already expects.\n const plan = await addHarvestToTx(tx, ctx.client, ctx.sender, {\n slippage: input.slippage,\n minRewardUsd: input.minRewardUsd,\n providers,\n overlayFee: ctx.overlayFee,\n saveFeeHook: ctx.feeHooks?.save_deposit,\n });\n return {\n preview: {\n toolName: 'harvest_rewards',\n claimed: plan.claimed,\n swaps: plan.swaps,\n skipped: plan.skipped,\n expectedUsdcDeposited: plan.expectedUsdcDeposited,\n },\n };\n },\n\n volo_stake: async (tx, input, ctx) => {\n if (input.amountSui <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Stake amount must be greater than zero');\n }\n const amountMist = BigInt(Math.floor(input.amountSui * 1e9));\n const result = await addStakeVSuiToTx(tx, ctx.client, ctx.sender, {\n amountMist,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: { toolName: 'volo_stake', effectiveAmountMist: result.effectiveAmountMist },\n outputCoin: result.coin,\n };\n },\n\n volo_unstake: async (tx, input, ctx) => {\n const amountMist =\n input.amountVSui === 'all' ? 'all' : BigInt(Math.floor(input.amountVSui * 1e9));\n if (amountMist !== 'all' && amountMist <= 0n) {\n throw new T2000Error('INVALID_AMOUNT', 'Unstake amount must be greater than zero');\n }\n const result = await addUnstakeVSuiToTx(tx, ctx.client, ctx.sender, {\n amountMist,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: { toolName: 'volo_unstake', effectiveAmountMist: result.effectiveAmountMist },\n outputCoin: result.coin,\n };\n },\n};\n\n// Reference unused import to suppress noUnusedLocals; SUI_TYPE is used\n// by selectSuiCoin internally and re-export from index.ts.\nvoid SUI_TYPE;\nvoid getDecimalsForCoinType;\n\n/**\n * Walks the assembled PTB's command list and extracts every recipient\n * address from top-level `TransferObjects` commands. Top-level only —\n * recipients inside nested Move calls are NOT inspected (Enoki only\n * cross-checks top-level commands).\n *\n * Replaces hand-maintained `allowedAddresses` arrays. Two production\n * bugs in 60 days came from drift between the array and the actual\n * PTB recipients (PR-H1 + PR-H4). Computing this from the PTB makes\n * drift impossible by construction.\n */\nexport function deriveAllowedAddressesFromPtb(tx: Transaction): string[] {\n const addresses = new Set<string>();\n const data = tx.getData();\n\n for (const cmd of data.commands) {\n // The Sui transaction-builder stores each top-level command as a\n // tagged object: { TransferObjects: { objects, address } }.\n // Inspect the `TransferObjects.address` field — it's a typed input\n // reference that resolves to a literal `Pure` input holding the\n // recipient bytes.\n const transferCmd = (cmd as { TransferObjects?: unknown }).TransferObjects;\n if (!transferCmd) continue;\n\n const addressArg = (transferCmd as { address?: unknown }).address;\n if (!addressArg) continue;\n\n const addressInputIndex = (addressArg as { Input?: number }).Input;\n if (addressInputIndex === undefined) continue;\n\n const input = data.inputs[addressInputIndex];\n if (!input) continue;\n\n const pureBytes = (input as { Pure?: { bytes?: string } }).Pure?.bytes;\n if (!pureBytes) continue;\n\n // Pure bytes are base64-encoded BCS for Sui addresses (32 bytes →\n // 44-char base64). Decode + format as 0x-prefixed hex.\n try {\n const bytes = base64ToBytes(pureBytes);\n if (bytes.length !== 32) continue; // not an address\n const hex = '0x' + Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n addresses.add(hex);\n } catch {\n // not a parseable address — skip\n }\n }\n\n return Array.from(addresses);\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof Buffer !== 'undefined') {\n return Uint8Array.from(Buffer.from(b64, 'base64'));\n }\n // Browser fallback (in case this ever runs in a worker)\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/**\n * Compose a PTB from a list of canonical write steps. Each step\n * dispatches to its registered fragment-appender; the assembled PTB is\n * returned alongside pre-built `txKindBytes` ready for Enoki sponsorship\n * + auto-derived `derivedAllowedAddresses`.\n *\n * Single-step: `composeTx({ steps: [{ toolName: 'send_transfer', input: {...} }], ... })`\n * Multi-step (Layer 2): `composeTx({ steps: [{...}, {...}, {...}], ... })`\n *\n * Throws:\n * - `T2000Error('NO_APPENDER')` — unknown `toolName`\n * - Any error thrown by the per-step appender (insufficient balance,\n * asset not supported, route not found, etc.) — propagates as-is.\n */\nexport async function composeTx(opts: ComposeTxOptions): Promise<ComposeTxResult> {\n const tx = new Transaction();\n tx.setSender(opts.sender);\n\n const baseCtx = {\n client: opts.client,\n sender: opts.sender,\n sponsoredContext: opts.sponsoredContext ?? false,\n overlayFee: opts.overlayFee,\n feeHooks: opts.feeHooks,\n };\n\n // [SPEC 13 Phase 1] First pass: validate every `inputCoinFromStep`\n // reference and build the `consumedSteps` set. Forward-only\n // references; producer-only tools can't be consumers.\n const consumedSteps = new Set<number>();\n for (let i = 0; i < opts.steps.length; i++) {\n const step = opts.steps[i];\n const stepWithChain = step as { inputCoinFromStep?: number };\n const idx = stepWithChain.inputCoinFromStep;\n if (idx === undefined) continue;\n\n if (!Number.isInteger(idx) || idx < 0 || idx >= i) {\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) has inputCoinFromStep=${idx}, ` +\n `which must be a non-negative integer < ${i} (forward-only references).`,\n );\n }\n\n const producer = opts.steps[idx];\n if (\n producer.toolName === 'save_deposit' ||\n producer.toolName === 'repay_debt' ||\n producer.toolName === 'send_transfer' ||\n producer.toolName === 'claim_rewards'\n ) {\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) references step ${idx} (${producer.toolName}) as ` +\n `producer, but '${producer.toolName}' is a terminal consumer that does not ` +\n `produce a chainable coin handle. Allowed producers: withdraw, borrow, ` +\n `swap_execute, volo_stake, volo_unstake.`,\n );\n }\n\n consumedSteps.add(idx);\n }\n\n // [SPEC 13 Phase 1] Second pass: dispatch each step in order,\n // capturing producers' output handles in `priorOutputs` and threading\n // them into consumers' `chainedCoin`.\n const priorOutputs: (TransactionObjectArgument | null)[] = [];\n const previews: StepPreview[] = [];\n for (let i = 0; i < opts.steps.length; i++) {\n const step = opts.steps[i];\n const appender = (WRITE_APPENDER_REGISTRY as Record<string, AppenderFn<unknown, StepPreview>>)[step.toolName];\n if (!appender) {\n throw new T2000Error(\n 'UNKNOWN',\n `No fragment appender registered for tool '${step.toolName}'. ` +\n `Allowed: ${(Object.keys(WRITE_APPENDER_REGISTRY) as WriteToolName[]).join(', ')}`,\n );\n }\n\n const stepWithChain = step as { inputCoinFromStep?: number };\n let chainedCoin: TransactionObjectArgument | undefined;\n if (stepWithChain.inputCoinFromStep !== undefined) {\n const upstream = priorOutputs[stepWithChain.inputCoinFromStep];\n if (!upstream) {\n // Producer didn't return an outputCoin (shouldn't happen given the\n // first-pass guard, but defends against future appender bugs).\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) expected a coin handle from step ` +\n `${stepWithChain.inputCoinFromStep}, but the producer did not return one.`,\n );\n }\n chainedCoin = upstream;\n }\n\n const stepCtx: AppenderContext = {\n ...baseCtx,\n chainedCoin,\n isOutputConsumed: consumedSteps.has(i),\n };\n\n const result = await appender(tx, step.input, stepCtx);\n priorOutputs.push(result.outputCoin ?? null);\n previews.push(result.preview);\n }\n\n const txKindBytes = await tx.build({ client: opts.client, onlyTransactionKind: true });\n const derivedAllowedAddresses = deriveAllowedAddressesFromPtb(tx);\n\n return {\n tx,\n txKindBytes,\n derivedAllowedAddresses,\n perStepPreviews: previews,\n };\n}\n","/**\n * Protocol fee primitives — wallet-direct transfer model.\n *\n * Fees are collected by splitting from the payment coin and transferring directly\n * to the treasury wallet inside the same PTB. Atomic with the operation (PTB\n * semantics); the wallet IS the ledger; the server-side indexer reads\n * `balanceChanges` and writes a `ProtocolFeeLedger` row tagged with the operation\n * classified from the tx's moveCall targets.\n *\n * The SDK / CLI never call this helper — they're fee-free by design (t2000 = infra\n * brand, no opinion on fees). Audric's `prepare/route.ts` is the canonical caller.\n */\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n USDC_DECIMALS,\n} from '../constants.js';\nimport { stableToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'borrow' | 'swap';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n // Swap uses Cetus's overlay-fee mechanism (taken from output by the aggregator\n // and transferred to `overlayFee.receiver`). We list the rate here for display\n // / quote calculations only — `addFeeTransfer` is NOT called for swaps.\n swap: 10n, // 0.1%\n};\n\n/**\n * Compute the fee amount for a given operation against a USD-denominated input.\n * Used pre-tx for receipt display + quote math. Does not modify any tx.\n */\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = stableToRaw(feeAmount, USDC_DECIMALS);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Split a fee from `paymentCoin` and transfer it to `receiver` inside the given PTB.\n *\n * **Order is load-bearing.** Call this BEFORE the protocol operation that consumes\n * `paymentCoin` (e.g. NAVI deposit). `splitCoins` mutates the source coin in place,\n * leaving the remainder for the protocol step. If you split AFTER the deposit,\n * the deposit will have consumed the coin and the split will fail.\n *\n * Atomicity: `splitCoins` + `transferObjects` are PTB ops; if anything later in\n * the PTB reverts, the fee transfer reverts too.\n *\n * @param tx Active PTB\n * @param paymentCoin Coin to split the fee from (mutated in place)\n * @param feeBps Fee rate in basis points (e.g. `SAVE_FEE_BPS = 10n` = 0.1%)\n * @param receiver Treasury wallet address (typically `T2000_OVERLAY_FEE_WALLET`)\n * @param amount Display-units input amount (matches what was passed to the\n * protocol operation; used to compute the raw fee amount)\n * @param decimals Coin decimals for raw conversion. Defaults to USDC_DECIMALS\n * (6). Pass the actual coin decimals when skimming a fee\n * from a non-USDC coin (e.g. USDsui = 6, GOLD = 6, ETH = 8,\n * SUI = 9). Backward-compatible: existing USDC callers can\n * omit. Wrong decimals → wrong raw amount → either fee\n * too small (silent loss) or too large (PTB revert from\n * insufficient coin balance).\n */\nexport function addFeeTransfer(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n feeBps: bigint,\n receiver: string,\n amount: number,\n decimals: number = USDC_DECIMALS,\n): void {\n if (feeBps <= 0n) return;\n if (amount <= 0) return;\n\n const feeAmount = amount * Number(feeBps) / Number(BPS_DENOMINATOR);\n const rawFee = stableToRaw(feeAmount, decimals);\n if (rawFee <= 0n) return;\n\n const [feeCoin] = tx.splitCoins(paymentCoin, [tx.pure.u64(rawFee)]);\n tx.transferObjects([feeCoin], tx.pure.address(receiver));\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { FinancialSummary, HFAlertLevel, HealthFactorResult } from '../types.js';\nimport { getHealthFactor, getRates } from './navi.js';\n\nconst HF_WARN_THRESHOLD = 1.8;\nconst HF_CRITICAL_THRESHOLD = 1.3;\n\nconst HF_FALLBACK: HealthFactorResult = {\n healthFactor: Infinity,\n supplied: 0,\n borrowed: 0,\n maxBorrow: 0,\n liquidationThreshold: 0.75,\n};\n\nfunction classifyHF(hf: number, hasBorrow: boolean): HFAlertLevel {\n if (!hasBorrow || !Number.isFinite(hf)) return 'none';\n if (hf <= HF_CRITICAL_THRESHOLD) return 'critical';\n if (hf <= HF_WARN_THRESHOLD) return 'warn';\n return 'none';\n}\n\nasync function fetchSuiPriceUsd(client: SuiJsonRpcClient): Promise<number> {\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const sqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n if (sqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtFloat = Number(sqrtPrice) / Number(Q64);\n const price = 1000 / (sqrtFloat * sqrtFloat);\n if (price > 0.01 && price < 1000) return price;\n }\n }\n } catch { /* fallback */ }\n return 1.0;\n}\n\n// Reserved for future per-call options. Keeping the shape stable avoids a\n// breaking-change for callers that pass `{}` defensively. Using a type alias\n// (not `interface {}`) so eslint's no-empty-object-type rule is happy.\nexport type FinancialSummaryOptions = Record<string, never>;\n\n/**\n * Fetch a complete financial snapshot for one wallet in parallel.\n * Designed for the indexer HF hook + chain-memory cron.\n *\n * Every sub-call has a fallback so a single RPC failure doesn't\n * crash the entire batch. Callers can check individual zero values\n * to detect degraded data.\n */\nexport async function getFinancialSummary(\n client: SuiJsonRpcClient,\n walletAddress: string,\n _options: FinancialSummaryOptions = {},\n): Promise<FinancialSummary> {\n const [usdcBal, suiBal, hf, rates, suiPrice] = await Promise.all([\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.USDC.type })\n .catch(() => ({ totalBalance: '0' })),\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.SUI.type })\n .catch(() => ({ totalBalance: '0' })),\n getHealthFactor(client, walletAddress)\n .catch(() => HF_FALLBACK),\n getRates(client),\n fetchSuiPriceUsd(client),\n ]);\n\n const usdcAvailable = Number(usdcBal.totalBalance) / 10 ** SUPPORTED_ASSETS.USDC.decimals;\n const gasReserveSui = Number(suiBal.totalBalance) / Number(MIST_PER_SUI);\n const saveApy = rates.USDC?.saveApy ?? 0;\n const borrowApy = rates.USDC?.borrowApy ?? 0;\n const dailyYield = hf.supplied * (saveApy / 365);\n\n return {\n walletAddress,\n usdcAvailable,\n savingsBalance: hf.supplied,\n debtBalance: hf.borrowed,\n idleUsdc: Math.max(0, usdcAvailable),\n healthFactor: hf.healthFactor,\n hfAlertLevel: classifyHF(hf.healthFactor, hf.borrowed > 0),\n saveApy,\n borrowApy,\n dailyYield,\n gasReserveSui,\n gasReserveUsd: gasReserveSui * suiPrice,\n fetchedAt: Date.now(),\n };\n}\n\nexport { HF_WARN_THRESHOLD, HF_CRITICAL_THRESHOLD };\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\nimport { mapMoveAbortCode } from '../errors.js';\n\nexport interface SimulationResult {\n success: boolean;\n gasEstimateSui: number;\n error?: {\n moveAbortCode?: number;\n moveModule?: string;\n reason: string;\n rawError: string;\n };\n}\n\nexport async function simulateTransaction(\n client: SuiJsonRpcClient,\n tx: Transaction,\n sender: string,\n): Promise<SimulationResult> {\n tx.setSender(sender);\n\n try {\n const txBytes = await tx.build({ client });\n const dryRun = await client.dryRunTransactionBlock({\n transactionBlock: Buffer.from(txBytes).toString('base64'),\n });\n\n const status = dryRun.effects?.status;\n const gasUsed = dryRun.effects?.gasUsed;\n\n const gasEstimateSui = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) / 1e9\n : 0;\n\n if (status?.status === 'failure') {\n const rawError = status.error ?? 'Unknown simulation error';\n const parsed = parseMoveAbort(rawError);\n\n return {\n success: false,\n gasEstimateSui,\n error: {\n moveAbortCode: parsed.abortCode,\n moveModule: parsed.module,\n reason: parsed.reason,\n rawError,\n },\n };\n }\n\n return { success: true, gasEstimateSui };\n } catch (err) {\n const rawError = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n gasEstimateSui: 0,\n error: {\n reason: 'Simulation failed: ' + rawError,\n rawError,\n },\n };\n }\n}\n\nexport function throwIfSimulationFailed(sim: SimulationResult): void {\n if (sim.success) return;\n\n throw new T2000Error(\n 'SIMULATION_FAILED',\n sim.error?.reason ?? 'Transaction simulation failed',\n {\n moveAbortCode: sim.error?.moveAbortCode,\n moveModule: sim.error?.moveModule,\n reason: sim.error?.reason,\n rawError: sim.error?.rawError,\n },\n );\n}\n\nfunction parseMoveAbort(errorStr: string): {\n abortCode?: number;\n module?: string;\n reason: string;\n} {\n // Pattern: MoveAbort(MoveLocation { module: ModuleId { ... name: \"module\" }, ... }, code)\n const abortMatch = errorStr.match(/MoveAbort\\([^,]*,\\s*(\\d+)\\)/);\n const moduleMatch = errorStr.match(/name:\\s*Identifier\\(\"([^\"]+)\"\\)/);\n\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n const module = moduleMatch?.[1];\n const reason = mapMoveAbortCode(code);\n return { abortCode: code, module, reason };\n }\n\n // Pattern: MovePrimitiveRuntimeError\n if (errorStr.includes('MovePrimitiveRuntimeError')) {\n const module = moduleMatch?.[1];\n return {\n module,\n reason: `Move runtime error in ${module ?? 'unknown'} module`,\n };\n }\n\n return { reason: errorStr };\n}\n","/**\n * Standalone swap quote — no T2000 agent instance required.\n * Only needs a wallet address for Cetus Aggregator routing.\n */\nimport { getDecimalsForCoinType } from './token-registry.js';\nimport type { SwapQuoteResult } from './types.js';\n\nexport async function getSwapQuote(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n}): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new Error(`Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new Error(`Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: params.walletAddress,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new Error(`No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new Error(`Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p: { provider?: string }) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n}\n","/**\n * SuiNS leaf-subname builders for the `audric.sui` parent NFT.\n *\n * Used by SPEC 10 v0.2.1 Phase A.1 — Audric Passport Identity. Lets the audric host\n * mint and revoke `username.audric.sui` leaves under the parent NFT held by the\n * dedicated custody address (`0xaca29165…23d11`).\n *\n * **Why a dedicated SDK module (not inline in the audric route):**\n * - Consumers (audric/web's `/api/identity/{reserve,change,release}` routes) can import\n * the canonical builder shape without re-discovering the `SuinsTransaction` API.\n * - Single source of truth for the parent NFT ID + parent name.\n * - Single source of truth for label validation (length / charset / hyphen rules).\n *\n * **Signer model — read this before wiring into a route:**\n * These builders are signed by the **service account** (the parent NFT custody address),\n * NOT by the user's zkLogin key. Per `audric/.cursor/rules/audric-canonical-write.mdc`,\n * the SPEC 10 leaf-mint API routes are explicitly documented as a CANONICAL-BYPASS of\n * the `composeTx` write contract — they are server-to-server, the user's key is never\n * in the loop, and Enoki sponsors the gas. PTB atomicity requires single-signer, so\n * leaf mints cannot be bundled with chat-agent writes via composeTx.\n *\n * **Reference:** `spec/runbooks/RUNBOOK_audric_sui_parent.md` §1 (parent NFT ID) +\n * §3 (validated SDK reference shape) + §4 (mainnet smoke test 2026-05-01).\n */\n\nimport { Transaction } from '@mysten/sui/transactions';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { SuinsTransaction, type SuinsClient } from '@mysten/suins';\n\n/**\n * Parent name registered on SuiNS mainnet. Audric's identity namespace anchor.\n *\n * Every leaf created via `buildAddLeafTx` becomes `<label>.audric.sui` and resolves\n * via the standard SuiNS resolver (`suix_resolveNameServiceAddress`).\n */\nexport const AUDRIC_PARENT_NAME = 'audric.sui';\n\n/**\n * On-chain object ID of the `audric.sui` parent NFT (a `SuinsRegistration`).\n *\n * Owned by the dedicated custody address `0xaca29165188f10136073788f648e1186dd25100100146186ebecedaf94b23d11`\n * (per `RUNBOOK_audric_sui_parent.md` §1). Every leaf mint / revoke MUST be signed\n * by the address that owns this NFT. Mainnet only.\n */\nexport const AUDRIC_PARENT_NFT_ID =\n '0x070456e283ec988b6302bdd6cc5172bbdcb709998cf116586fb98d19b0870198';\n\nexport interface BuildAddLeafParams {\n /** Bare label, e.g. `'alice'` — NOT the full `'alice.audric.sui'` path. */\n label: string;\n /** Sui address the leaf will resolve to (typically the user's zkLogin wallet). */\n targetAddress: string;\n}\n\nexport interface BuildRevokeLeafParams {\n /** Bare label of the leaf to revoke. */\n label: string;\n}\n\nexport type LabelValidationResult = { valid: true } | { valid: false; reason: string };\n\n/**\n * SuiNS labels accept lowercase ASCII letters, digits, and hyphens. Hyphens cannot\n * lead or trail. The 3–63 char window matches SuiNS protocol rules and the SuiNS\n * dashboard's own `Register` form.\n *\n * The regex permits a single character only when it is alphanumeric (rejected by\n * the length check below for being < 3, but the pattern itself stays internally\n * consistent with DNS conventions).\n *\n * SUINS-LABEL-RULE — paired with `audric/apps/web/lib/identity/validate-label.ts`.\n * The audric host duplicates these rules inline to avoid pulling the SDK's\n * transitive deps (e.g. `@pythnetwork/pyth-sui-js` → `node:buffer`) into the\n * client bundle when the picker uses validation. If SuiNS ever changes its\n * label rules, BOTH this file and the audric copy need updating.\n */\nconst LABEL_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\n\n/**\n * Validate a leaf label against SuiNS protocol rules. Pure function; no I/O.\n *\n * Pre-call this before `buildAddLeafTx` / `buildRevokeLeafTx` if you want a\n * structured error (the builder functions throw on invalid labels). The audric\n * `/api/identity/check` endpoint uses this to drive the picker's real-time\n * availability indicator.\n *\n * Reserved-name policy (specific Audric handles like `support`, `admin`,\n * `official`) is NOT enforced here — that's a UI / route-level concern owned\n * by the audric host, not a protocol-level rule. See SPEC 10 D3.\n */\nexport function validateLabel(label: unknown): LabelValidationResult {\n if (typeof label !== 'string') {\n return { valid: false, reason: 'label must be a string' };\n }\n if (label.length < 3) {\n return { valid: false, reason: 'label must be at least 3 characters' };\n }\n if (label.length > 63) {\n return { valid: false, reason: 'label must be at most 63 characters' };\n }\n if (!LABEL_PATTERN.test(label)) {\n return {\n valid: false,\n reason:\n 'label may only contain lowercase letters, digits, and hyphens, and may not start or end with a hyphen',\n };\n }\n if (label.includes('--')) {\n return { valid: false, reason: 'label may not contain consecutive hyphens' };\n }\n return { valid: true };\n}\n\n/**\n * Build an unsigned PTB that creates a `<label>.audric.sui` leaf subname pointing\n * to `targetAddress`.\n *\n * The returned `Transaction` has neither sender nor gas configured — the caller\n * (audric's `/api/identity/reserve` route) sets the sender to the parent NFT\n * custody address and submits via Enoki sponsorship. See `audric-transaction-flow.mdc`\n * for the sponsored-tx wrapper pattern; note SPEC 10 leaf-mint is a documented\n * CANONICAL-BYPASS of `composeTx` because the signer is the service account, not\n * the user's zkLogin key.\n *\n * Throws synchronously if `label` violates protocol rules or `targetAddress` is\n * not a valid Sui address — fail-closed before bytes are built.\n */\nexport function buildAddLeafTx(\n suinsClient: SuinsClient,\n { label, targetAddress }: BuildAddLeafParams,\n): Transaction {\n const labelCheck = validateLabel(label);\n if (!labelCheck.valid) {\n throw new Error(`buildAddLeafTx: invalid label \"${label}\" — ${labelCheck.reason}`);\n }\n if (typeof targetAddress !== 'string' || !isValidSuiAddress(normalizeSuiAddress(targetAddress))) {\n throw new Error(`buildAddLeafTx: invalid targetAddress \"${targetAddress}\"`);\n }\n\n const tx = new Transaction();\n const suinsTx = new SuinsTransaction(suinsClient, tx);\n suinsTx.createLeafSubName({\n parentNft: AUDRIC_PARENT_NFT_ID,\n name: `${label}.${AUDRIC_PARENT_NAME}`,\n targetAddress: normalizeSuiAddress(targetAddress),\n });\n return tx;\n}\n\n/**\n * Build an unsigned PTB that revokes a `<label>.audric.sui` leaf subname.\n *\n * Used by:\n * 1. The change-username flow (`/api/identity/change`): revoke old leaf inside\n * the same PTB as the new leaf creation, atomically.\n * 2. The release-username flow (`/api/admin/identity/release`): admin recovery\n * of squatted / impersonating handles.\n * 3. Account-deletion flow (future): revoke leaf when user deletes their account.\n *\n * The mainnet smoke test (2026-05-01) confirmed revocation gas cost is roughly\n * negative net (storage rebate exceeds computation) — see RUNBOOK §4.\n */\nexport function buildRevokeLeafTx(\n suinsClient: SuinsClient,\n { label }: BuildRevokeLeafParams,\n): Transaction {\n const labelCheck = validateLabel(label);\n if (!labelCheck.valid) {\n throw new Error(`buildRevokeLeafTx: invalid label \"${label}\" — ${labelCheck.reason}`);\n }\n\n const tx = new Transaction();\n const suinsTx = new SuinsTransaction(suinsClient, tx);\n suinsTx.removeLeafSubName({\n parentNft: AUDRIC_PARENT_NFT_ID,\n name: `${label}.${AUDRIC_PARENT_NAME}`,\n });\n return tx;\n}\n\n/**\n * Convenience: turn a bare label into the full `<label>.audric.sui` path.\n *\n * **Use this for ON-CHAIN operations** — SuiNS leaf NFT `name` field, the\n * `createLeafSubName` / `removeLeafSubName` move calls, and any RPC call\n * that returns/expects the canonical name string. The `<label>.audric.sui`\n * form is what the SuiNS protocol writes into the NFT `name` field.\n *\n * **Do NOT use this for UI rendering** — that's `displayHandle()`'s job\n * (S.118 reversal of SPEC 10 D10, see audric-build-tracker). Pre-S.118\n * we surfaced the full `.sui` form everywhere; we now use the SuiNS V2\n * `@` form (`alice@audric`) for display because it's shorter, fits the\n * agent harness mono aesthetic, and matches SuiNS's own V2 standard.\n *\n * Both forms resolve to the same address via SuiNS RPC (verified\n * mainnet 2026-05-08 PF1) — `displayHandle()` is purely a render-layer\n * choice, not a backend storage change.\n */\nexport function fullHandle(label: string): string {\n return `${label}.${AUDRIC_PARENT_NAME}`;\n}\n\n/**\n * SuiNS V2 short-form display alias. `displayHandle('alice')` →\n * `'alice@audric'`. Use for chat narration, permission cards, receipts,\n * profile pages, share-to-X copy, OG metadata, and lookup_user output.\n *\n * **Why a separate function from `fullHandle`:**\n * - `fullHandle('alice')` → `'alice.audric.sui'` is the **on-chain**\n * NFT name field; SuiNS's `createLeafSubName` writes exactly this\n * string and `suix_resolveNameServiceAddress` accepts it.\n * - `displayHandle('alice')` → `'alice@audric'` is the **UI** form\n * that users see and share. SuiNS RPC also accepts this form\n * (verified mainnet 2026-05-08 PF1 — both forms return the same\n * address), so we have one storage form (`<label>.audric.sui`) and\n * two interchangeable input forms (the user can paste either).\n *\n * Reverses SPEC 10 D10 (\"full handle ALWAYS\"). See audric-build-tracker\n * S.118 for the rationale; see also `audric/apps/web/lib/identity/`\n * for canonicalization in the input parser (which is a no-op since\n * SuiNS RPC accepts both — kept available for future-proofing).\n */\nexport function displayHandle(label: string): string {\n // Strip trailing `.sui` from the parent for the display form.\n // Today AUDRIC_PARENT_NAME is `'audric.sui'` → `'audric'`. If the\n // parent ever changes (e.g. `audric.app.sui` becomes the parent),\n // this still produces a sensible display form by removing only the\n // top-level TLD.\n const parentDisplay = AUDRIC_PARENT_NAME.replace(/\\.sui$/, '');\n return `${label}@${parentDisplay}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/token-registry.ts","../../../node_modules/.pnpm/lodash.camelcase@4.3.0/node_modules/lodash.camelcase/index.js","../src/protocols/volo.ts","../src/wallet/coinSelection.ts","../src/protocols/cetus-swap.ts","../src/constants.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.ts","../src/wallet/send.ts","../src/utils/format.ts","../src/wallet/balance.ts","../src/wallet/classify.ts","../src/wallet/history.ts","../src/t2000.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/protocols/yieldTracker.ts","../src/adapters/registry.ts","../src/adapters/navi.ts","../src/adapters/descriptors.ts","../src/safeguards/types.ts","../src/safeguards/errors.ts","../src/safeguards/enforcer.ts","../src/contacts.ts","../src/index.ts","../src/protocols/navi-harvest.ts","../src/composeTx.ts","../src/protocols/protocolFee.ts","../src/protocols/financialSummary.ts","../src/utils/simulate.ts","../src/swap-quote.ts","../src/protocols/suins-leaf.ts"],"names":["map","exports","Symbol","Transaction","allowSwapAll","requested","swapAll","effectiveAmount","coin","SUI_TYPE","T2000Error","selectAndSplitCoin","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","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","claimLendingRewardsPTB","rewards","rewardMap","reward","rewardCoinType","ruleIds","owner","emodeId","ruleId","group","rewardCoins","assetIds","isEMode","matchedRewardFund","rewardBalance","rewardCoin","SuiJsonRpcClient","getJsonRpcFullnodeUrl","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","buildStakeVSuiTx","getVoloStats","buildUnstakeVSuiTx","VSUI_TYPE","findSwapRoute","buildSwapTx","resolveTokenType","USDC_TYPE","adapters","ct","isValidSuiAddress","normalizeSuiAddress"],"mappings":"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AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAC1E,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MACtB,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MACtB,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MACtB,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAC1E,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAC1E,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAAK,MAAA,EAAQ,GAAA;AAAA,MAChD,MAAA,EAAQ,GAAA;AAAA,MAAM,MAA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","file":"index.js","sourcesContent":["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","/**\n * Unified token registry — single source of truth for coin types, decimals, symbols, and tiers.\n *\n * ZERO heavy dependencies. Safe to import from any context (server, browser, Edge).\n *\n * Tier 1: USDC — the financial layer (save, borrow, receive, yield, allowances, marketplace, MPP).\n * Tier 2: 15 curated swap assets — hold, trade, and send only.\n * No tier: Legacy tokens kept for display accuracy (existing NAVI positions). No new operations.\n *\n * To add a new token: add ONE entry to COIN_REGISTRY below. Everything else derives from it.\n * Gate for Tier 2 addition: confirmed deep Cetus liquidity + clear user need.\n */\n\nexport interface CoinMeta {\n type: string;\n decimals: number;\n symbol: string;\n tier?: 1 | 2;\n}\n\n/**\n * Canonical coin registry.\n * Key = user-friendly name (used in swap_execute, CLI, prompts).\n */\nexport const COIN_REGISTRY: Record<string, CoinMeta> = {\n // ── Tier 1 — Financial layer ──────────────────────────────────────────\n USDC: { type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', decimals: 6, symbol: 'USDC', tier: 1 },\n\n // ── Tier 2 — Swap assets (15 tokens) ──────────────────────────────────\n SUI: { type: '0x2::sui::SUI', decimals: 9, symbol: 'SUI', tier: 2 },\n wBTC: { type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC', decimals: 8, symbol: 'wBTC', tier: 2 },\n ETH: { type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH', decimals: 8, symbol: 'ETH', tier: 2 },\n GOLD: { type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM', decimals: 9, symbol: 'GOLD', tier: 2 },\n DEEP: { type: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP', decimals: 6, symbol: 'DEEP', tier: 2 },\n WAL: { type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL', decimals: 9, symbol: 'WAL', tier: 2 },\n NS: { type: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS', decimals: 6, symbol: 'NS', tier: 2 },\n IKA: { type: '0x7262fb2f7a3a14c888c438a3cd9b912469a58cf60f367352c46584262e8299aa::ika::IKA', decimals: 9, symbol: 'IKA', tier: 2 },\n CETUS: { type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS', decimals: 9, symbol: 'CETUS', tier: 2 },\n NAVX: { type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX', decimals: 9, symbol: 'NAVX', tier: 2 },\n vSUI: { type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT', decimals: 9, symbol: 'vSUI', tier: 2 },\n haSUI: { type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI', decimals: 9, symbol: 'haSUI', tier: 2 },\n afSUI: { type: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI', decimals: 9, symbol: 'afSUI', tier: 2 },\n LOFI: { type: '0xf22da9a24ad027cccb5f2d496cbe91de953d363513db08a3a734d361c7c17503::LOFI::LOFI', decimals: 9, symbol: 'LOFI', tier: 2 },\n MANIFEST: { type: '0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST', decimals: 9, symbol: 'MANIFEST', tier: 2 },\n\n // ── Legacy — no tier, kept for display accuracy on existing positions ──\n USDT: { type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT', decimals: 6, symbol: 'USDT' },\n USDe: { type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE', decimals: 6, symbol: 'USDe' },\n USDSUI: { type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI', decimals: 6, symbol: 'USDsui' },\n};\n\n/** Reverse lookup: coin type → CoinMeta. Built once at import time. */\nconst BY_TYPE = new Map<string, CoinMeta>();\nfor (const meta of Object.values(COIN_REGISTRY)) {\n BY_TYPE.set(meta.type, meta);\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Returns the registry metadata for a coin type, or `undefined` if the coin\n * is not in the registry. Use this when you need to distinguish \"known coin\"\n * from \"supported coin\" — `isSupported` only flags tiered (active) coins,\n * but legacy coins like USDsui / USDe / USDT are in the registry without a\n * tier and still need canonical-symbol resolution.\n */\nexport function getCoinMeta(coinType: string): CoinMeta | undefined {\n return BY_TYPE.get(coinType);\n}\n\n/**\n * Returns true if the coin type appears anywhere in COIN_REGISTRY (tier 1, 2,\n * OR legacy/no-tier). Different from `isSupported`, which excludes legacy\n * entries. The blockvision-prices canonical-symbol gate uses this looser\n * check so that USDsui (legacy/no-tier today, but with a registry-canonical\n * mixed-case symbol) still wins over BlockVision's uppercase 'USDSUI'.\n */\nexport function isInRegistry(coinType: string): boolean {\n return BY_TYPE.has(coinType);\n}\n\n// ── Tier helpers ─────────────────────────────────────────────────────────\n\n/** Returns true if the coin type is Tier 1 (USDC — the financial layer). */\nexport function isTier1(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 1;\n}\n\n/** Returns true if the coin type is Tier 2 (curated swap asset). */\nexport function isTier2(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 2;\n}\n\n/** Returns true if the coin type is actively supported (Tier 1 or Tier 2). */\nexport function isSupported(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier !== undefined;\n}\n\n/** Returns the tier for a coin type, or undefined if legacy/unknown. */\nexport function getTier(coinType: string): 1 | 2 | undefined {\n return BY_TYPE.get(coinType)?.tier;\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Get decimals for any coin type. Checks full type match, then suffix match, then defaults to 9.\n * Works for both tiered and legacy tokens.\n */\nexport function getDecimalsForCoinType(coinType: string): number {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.decimals;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.decimals;\n }\n }\n\n return 9;\n}\n\n/**\n * Resolve a full coin type to a user-friendly symbol.\n * Returns the last `::` segment if not in the registry.\n */\nexport function resolveSymbol(coinType: string): string {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.symbol;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.symbol;\n }\n }\n\n return coinType.split('::').pop() ?? coinType;\n}\n\n/**\n * Name → type map for swap resolution. Derived from COIN_REGISTRY.\n * Contains BOTH original-case and UPPERCASE keys for case-insensitive lookup.\n */\nexport const TOKEN_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const [name, meta] of Object.entries(COIN_REGISTRY)) {\n map[name] = meta.type;\n map[name.toUpperCase()] = meta.type;\n }\n return map;\n})();\n\n/**\n * Resolve a user-friendly token name to its full coin type.\n * Returns the input unchanged if already a full coin type (contains \"::\").\n * Case-insensitive: 'usde', 'USDe', 'USDE' all resolve correctly.\n */\nexport function resolveTokenType(nameOrType: string): string | null {\n if (nameOrType.includes('::')) return nameOrType;\n return TOKEN_MAP[nameOrType] ?? TOKEN_MAP[nameOrType.toUpperCase()] ?? null;\n}\n\n/** Common type constants for direct import. */\nexport const SUI_TYPE = COIN_REGISTRY.SUI.type;\nexport const USDC_TYPE = COIN_REGISTRY.USDC.type;\nexport const USDT_TYPE = COIN_REGISTRY.USDT.type;\nexport const USDSUI_TYPE = COIN_REGISTRY.USDSUI.type;\nexport const USDE_TYPE = COIN_REGISTRY.USDe.type;\nexport const ETH_TYPE = COIN_REGISTRY.ETH.type;\nexport const WBTC_TYPE = COIN_REGISTRY.wBTC.type;\nexport const WAL_TYPE = COIN_REGISTRY.WAL.type;\nexport const NAVX_TYPE = COIN_REGISTRY.NAVX.type;\nexport const IKA_TYPE = COIN_REGISTRY.IKA.type;\nexport const LOFI_TYPE = COIN_REGISTRY.LOFI.type;\nexport const MANIFEST_TYPE = COIN_REGISTRY.MANIFEST.type;\n","/**\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","/**\n * VOLO vSUI liquid staking — thin transaction builders.\n * No SDK dependency. Two Move calls, immutable contract addresses.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { SUI_TYPE } from '../token-registry.js';\n\nexport const VOLO_PKG = '0x68d22cf8bdbcd11ecba1e094922873e4080d4d11133e2443fddda0bfd11dae20';\nexport const VOLO_POOL = '0x2d914e23d82fedef1b5f56a32d5c64bdcc3087ccfea2b4d6ea51a71f587840e5';\nexport const VOLO_METADATA = '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60';\nexport const VSUI_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\nexport const SUI_SYSTEM_STATE = '0x05';\nexport const MIN_STAKE_MIST = 1_000_000_000n; // 1 SUI\n\nconst VOLO_STATS_URL = 'https://open-api.naviprotocol.io/api/volo/stats';\n\nexport interface VoloStats {\n apy: number;\n exchangeRate: number;\n tvl: number;\n}\n\n/**\n * Fetch VOLO vSUI staking stats (APY, exchange rate, TVL).\n */\nexport async function getVoloStats(): Promise<VoloStats> {\n const res = await fetch(VOLO_STATS_URL, {\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`VOLO stats API error: HTTP ${res.status}`);\n }\n\n const data = await res.json() as {\n apy?: number;\n exchange_rate?: number;\n exchangeRate?: number;\n tvl?: number;\n data?: { apy?: number; exchange_rate?: number; exchangeRate?: number; tvl?: number };\n };\n\n const d = data.data ?? data;\n\n return {\n apy: d.apy ?? 0,\n exchangeRate: d.exchange_rate ?? d.exchangeRate ?? 1,\n tvl: d.tvl ?? 0,\n };\n}\n\n/**\n * Build a PTB to stake SUI for vSUI.\n */\nexport async function buildStakeVSuiTx(\n _client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint,\n): Promise<Transaction> {\n if (amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${amountMist}`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [suiCoin] = tx.splitCoins(tx.gas, [amountMist]);\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n tx.transferObjects([vSuiCoin], address);\n return tx;\n}\n\n/**\n * Build a PTB to unstake vSUI back to SUI.\n */\nexport async function buildUnstakeVSuiTx(\n client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint | 'all',\n): Promise<Transaction> {\n const coins = await fetchCoinsByType(client, address, VSUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\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\n let vSuiCoin: TransactionObjectArgument;\n if (amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [amountMist]);\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n tx.transferObjects([suiCoin], address);\n return tx;\n}\n\n/**\n * SPEC 7 § \"Layer 1\" Volo stake appender. Two modes.\n *\n * Wallet mode (`inputCoin` omitted): fetches SUI coins from the\n * sender's wallet (paginated), merges/splits to `amountMist`. Mirrors\n * the audric host's `transactions/prepare/route.ts:524-545` volo-stake\n * branch — sponsored-flow safe (does NOT consume `tx.gas`, which\n * belongs to the Enoki sponsor in sponsored flows).\n *\n * For non-sponsored flows where the caller owns `tx.gas`, prefer\n * `buildStakeVSuiTx` directly (it splits from gas, which is more\n * efficient by avoiding the extra getCoins RTT).\n *\n * Chain mode (`inputCoin` provided): consumes the passed-in SUI coin\n * ref entirely. Used for chained flows like \"swap USDC → SUI → stake\".\n * The caller is responsible for splitting upstream if they only want\n * part of the input coin staked.\n *\n * @returns\n * - `coin`: vSUI output coin ref, ready for downstream consumption or\n * wallet transfer (`tx.transferObjects`).\n * - `effectiveAmountMist`: SUI mist consumed (echoes `input.amountMist`\n * in both modes; chain-mode trusts the caller-supplied value since\n * the actual coin balance is opaque).\n */\nexport async function addStakeVSuiToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n amountMist: bigint;\n inputCoin?: TransactionObjectArgument;\n },\n): Promise<{ coin: TransactionObjectArgument; effectiveAmountMist: bigint }> {\n if (input.amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${input.amountMist}`);\n }\n\n let suiCoin: TransactionObjectArgument;\n\n if (input.inputCoin) {\n suiCoin = input.inputCoin;\n } else {\n const coins = await fetchCoinsByType(client, address, SUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No SUI coins found in wallet');\n }\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < input.amountMist) {\n throw new Error(`Insufficient SUI: need ${input.amountMist} MIST, have ${totalBalance}`);\n }\n\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 [suiCoin] = tx.splitCoins(primary, [input.amountMist]);\n }\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n return { coin: vSuiCoin, effectiveAmountMist: input.amountMist };\n}\n\n/**\n * SPEC 7 § \"Layer 1\" Volo unstake appender. Two modes.\n *\n * Wallet mode (`inputCoin` omitted): fetches vSUI coins from the\n * sender's wallet (paginated), merges to a primary coin, splits to\n * `amountMist` (or consumes the entire merged primary if `'all'`).\n *\n * Chain mode (`inputCoin` provided): consumes the passed-in vSUI coin\n * ref. With `amountMist = 'all'`, the entire input coin is unstaked.\n * With a bigint `amountMist`, the input coin is split internally and\n * only that portion unstaked (the leftover stays accessible via the\n * original ref). Used for chained flows where vSUI was just produced\n * by a prior step.\n *\n * @returns\n * - `coin`: SUI output coin ref, ready for downstream consumption\n * (e.g. `addSendToTx`, `addStakeVSuiToTx` re-stake) or wallet\n * transfer (`tx.transferObjects`).\n * - `effectiveAmountMist`: input vSUI mist consumed; echoes\n * `input.amountMist` (`'all'` is preserved as-is — the actual SUI\n * received differs from input vSUI by the pool exchange rate, so\n * callers needing the SUI amount must query `getVoloStats` or\n * parse balance changes from the executed tx).\n */\nexport async function addUnstakeVSuiToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n amountMist: bigint | 'all';\n inputCoin?: TransactionObjectArgument;\n },\n): Promise<{ coin: TransactionObjectArgument; effectiveAmountMist: bigint | 'all' }> {\n let vSuiCoin: TransactionObjectArgument;\n\n if (input.inputCoin) {\n if (input.amountMist === 'all') {\n vSuiCoin = input.inputCoin;\n } else {\n [vSuiCoin] = tx.splitCoins(input.inputCoin, [input.amountMist]);\n }\n } else {\n const coins = await fetchCoinsByType(client, address, VSUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\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\n if (input.amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [input.amountMist]);\n }\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n return { coin: suiCoin, effectiveAmountMist: input.amountMist };\n}\n\n/**\n * Paginated coin lookup by coin type. Local helper shared between\n * `buildUnstakeVSuiTx` (fetches vSUI), `addStakeVSuiToTx` (fetches\n * SUI), and `addUnstakeVSuiToTx` (fetches vSUI). P2.2c may extract\n * a shared `wallet/coinSelection.ts` once `addSendFromWalletToTx` and\n * the registry adapter need the same prelude.\n */\nasync function fetchCoinsByType(\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({\n owner,\n coinType,\n cursor: cursor ?? undefined,\n });\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","/**\n * Wallet-side coin selection helpers — shared paginated coin lookup +\n * merge + split prelude used by every wallet-mode appender that needs\n * a `TransactionObjectArgument` reference to a specific amount of a\n * given coin type.\n *\n * Replaces three earlier inline implementations:\n * - `cetus-swap.ts:fetchAllCoinsForSwap` (deleted 2026-05-02 — addSwapToTx\n * now calls `selectAndSplitCoin` directly so the merge cache is shared\n * across every appender in a multi-write bundle)\n * - `volo.ts:fetchCoinsByType` (kept for backwards-compat, delegates\n * here)\n * - audric host's `transactions/prepare/route.ts:fetchCoinsForSwap`\n * (P2.2c retires this when migrating to `composeTx`)\n *\n * Single source of truth for the \"fetch coins of type X owned by\n * address Y, paginated\" pattern. P2.2b extracts this so `composeTx`'s\n * registry adapters can build a wallet-mode `TransactionObjectArgument`\n * uniformly across save / send / repay / etc. The 2026-05-02 P2.7 fix\n * adds a per-PTB merge cache so multi-write bundles that touch the same\n * coin type twice (swap+save, save+send, etc.) only emit `mergeCoins`\n * once — see `ptbMergeCache` JSDoc below.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\n\nexport interface CoinPage {\n ids: string[];\n totalBalance: bigint;\n}\n\n/**\n * Per-PTB merge cache. Keyed by `(sender|coinType)`, stores the primary\n * coin reference + remaining unconsumed balance.\n *\n * **Why this exists.** Pre-2026-05-02 every appender call re-fetched the\n * sender's coins of `coinType` and re-emitted `mergeCoins(primary,\n * [secondaries])`. That works in a single-write PTB. In a multi-write\n * bundle that touches the same coin type twice (e.g. swap+save+send all\n * spending USDC), the second `mergeCoins` references `Input(secondary)`\n * slots that the FIRST `mergeCoins` already consumed — Enoki's dry-run\n * rejects with `CommandArgumentError { kind: ArgumentWithoutValue }`.\n *\n * The cache makes the first call for `(sender, coinType)` do the full\n * fetch + merge + split, and subsequent calls split from the cached\n * primary directly. No re-fetch, no re-merge, no double-consume.\n *\n * Lives on the `Transaction` instance via a WeakMap so it auto-clears\n * once the PTB is built and the Transaction is GC'd.\n */\nconst ptbMergeCache = new WeakMap<\n Transaction,\n Map<string, { primary: TransactionObjectArgument; remaining: bigint }>\n>();\n\nfunction getMergeCache(tx: Transaction) {\n let cache = ptbMergeCache.get(tx);\n if (!cache) {\n cache = new Map();\n ptbMergeCache.set(tx, cache);\n }\n return cache;\n}\n\n/**\n * Paginated coin lookup. Fetches every coin object of `coinType` owned\n * by `owner` (walks the cursor until `hasNextPage === false`). Returns\n * the list of object IDs + summed balance.\n *\n * Replaces inline `client.getCoins` calls that miss coins on the second\n * page when wallets accumulate many small coin objects (the bug class\n * that bit `buildSendTx` pre-P2.2 — captured for SPEC 12).\n */\nexport async function fetchAllCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<CoinPage> {\n const ids: string[] = [];\n let totalBalance = 0n;\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 for (const c of page.data) {\n ids.push(c.coinObjectId);\n totalBalance += BigInt(c.balance);\n }\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return { ids, totalBalance };\n}\n\nexport interface SelectAndSplitResult {\n /** TransactionObjectArgument for a coin holding `effectiveAmount` raw units. */\n coin: TransactionObjectArgument;\n /** Actual raw amount the returned coin holds. May be < requested if `swapAll` is true. */\n effectiveAmount: bigint;\n /** True iff the request consumed the entire wallet balance (no split needed). */\n swapAll: boolean;\n}\n\n/**\n * Wallet-mode coin selection prelude. Fetches every coin of `coinType`\n * owned by `owner`, merges them into a primary, and splits off the\n * requested `amount` (or returns the merged primary directly if the\n * request meets/exceeds the total balance — `swapAll` semantics).\n *\n * Throws `T2000Error` (`INSUFFICIENT_BALANCE`) when:\n * - No coins of `coinType` exist for `owner`\n * - `amount` is bigger than the total balance AND the caller did NOT\n * opt into `swapAll: true` clipping\n *\n * Used by:\n * - `composeTx` registry adapters (save_deposit, send_transfer,\n * repay_debt — non-SUI assets) for the wallet-mode prelude\n * - Layer 1 dual-mode appenders (`addSwapToTx`, `addStakeVSuiToTx`,\n * `addUnstakeVSuiToTx`) when `inputCoin` is omitted\n *\n * @param tx — PTB to append `mergeCoins` + `splitCoins` commands to.\n * @param client — Sui RPC client for the paginated `getCoins` lookup.\n * @param owner — wallet address whose coins to fetch.\n * @param coinType — fully-qualified Sui coin type\n * (`\"0x...::usdc::USDC\"`).\n * @param amount — raw amount to split out (in MIST / smallest unit).\n * Pass `'all'` to consume the entire merged primary directly.\n * @param options.allowSwapAll — if true (default), `amount` >=\n * totalBalance auto-clips to total (matches audric host's swap\n * branch). If false, throws `INSUFFICIENT_BALANCE` when over.\n *\n * @returns\n * - `coin` — `TransactionObjectArgument` ready for downstream\n * consumption (e.g. `addSaveToTx`, `tx.transferObjects`).\n * - `effectiveAmount` — the raw amount the returned coin actually\n * holds (handles swapAll clipping).\n * - `swapAll` — true iff the entire merged primary was consumed.\n */\nexport async function selectAndSplitCoin(\n tx: Transaction,\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n amount: bigint | 'all',\n options: { allowSwapAll?: boolean } = {},\n): Promise<SelectAndSplitResult> {\n const cache = getMergeCache(tx);\n const cacheKey = `${owner}|${coinType}`;\n const cached = cache.get(cacheKey);\n\n // Fast path — second+ call for this (sender, coinType) inside the same PTB.\n // First call already merged all on-chain coin objects into a single primary\n // and stashed it in the cache; we just split off another chunk here. No RPC\n // re-fetch, no re-emitted MergeCoins (which would reference already-consumed\n // input slots and trip Enoki's dry-run with ArgumentWithoutValue — the\n // P2.7 multi-write bundle bug).\n if (cached) {\n const allowSwapAll = options.allowSwapAll ?? true;\n if (amount !== 'all' && amount > cached.remaining && !allowSwapAll) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance for ${coinType}`, {\n available: cached.remaining.toString(),\n required: amount.toString(),\n });\n }\n const requested = amount === 'all' ? cached.remaining : amount;\n const swapAll = amount === 'all' || requested >= cached.remaining;\n const effectiveAmount = swapAll ? cached.remaining : requested;\n\n // `swapAll` from a cached primary means \"consume the whole remainder\" —\n // callers that pass 'all' (or oversize amount with allowSwapAll) get the\n // primary itself, leaving the cache slot drained for any future caller.\n const coin = swapAll ? cached.primary : tx.splitCoins(cached.primary, [effectiveAmount])[0];\n cached.remaining = swapAll ? 0n : cached.remaining - effectiveAmount;\n return { coin, effectiveAmount, swapAll };\n }\n\n // Slow path — first call for this (sender, coinType).\n const { ids, totalBalance } = await fetchAllCoins(client, owner, coinType);\n if (ids.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No coins found for ${coinType}`);\n }\n\n const allowSwapAll = options.allowSwapAll ?? true;\n\n if (amount !== 'all' && amount > totalBalance && !allowSwapAll) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance for ${coinType}`, {\n available: totalBalance.toString(),\n required: amount.toString(),\n });\n }\n\n const requested = amount === 'all' ? totalBalance : amount;\n const swapAll = amount === 'all' || requested >= totalBalance;\n const effectiveAmount = swapAll ? totalBalance : requested;\n\n const primary = tx.object(ids[0]);\n if (ids.length > 1) {\n tx.mergeCoins(primary, ids.slice(1).map((id) => tx.object(id)));\n }\n\n const coin = swapAll ? primary : tx.splitCoins(primary, [effectiveAmount])[0];\n\n // Cache the primary + remaining balance for any subsequent caller in the\n // same PTB. If the first caller drained everything (`swapAll`), remaining\n // is 0 and the next caller will hit INSUFFICIENT_BALANCE — which is\n // correct: the primary has no value left to split.\n cache.set(cacheKey, {\n primary,\n remaining: swapAll ? 0n : totalBalance - effectiveAmount,\n });\n\n return { coin, effectiveAmount, swapAll };\n}\n\n/**\n * SUI-specific coin selection. Branches on sponsorship context:\n *\n * - **Sponsored (`sponsoredContext: true`)** — fetches SUI coins via\n * `getCoins` and merges/splits, because `tx.gas` belongs to the\n * Enoki sponsor (NOT the user) under sponsored flows. Same shape as\n * `selectAndSplitCoin` for any other coin type.\n *\n * - **Self-funded (`sponsoredContext: false`)** — splits from `tx.gas`\n * directly (the user's gas coin IS their SUI). More efficient — no\n * getCoins RTT.\n *\n * Captures the SUI-vs-other-asset divergence that lives inline in\n * `buildSendTx` today (`tx.splitCoins(tx.gas, ...)` vs paginated\n * lookup). composeTx's `send_transfer` adapter routes through this\n * helper to handle both.\n */\nexport async function selectSuiCoin(\n tx: Transaction,\n client: SuiJsonRpcClient,\n owner: string,\n amountMist: bigint,\n sponsoredContext: boolean,\n): Promise<SelectAndSplitResult> {\n if (sponsoredContext) {\n const { SUI_TYPE } = await import('../token-registry.js');\n return selectAndSplitCoin(tx, client, owner, SUI_TYPE, amountMist);\n }\n\n const [coin] = tx.splitCoins(tx.gas, [amountMist]);\n return { coin, effectiveAmount: amountMist, swapAll: false };\n}\n","/**\n * Cetus Aggregator V3 SDK wrapper — the ONLY file that imports @cetusprotocol/aggregator-sdk.\n * Documented CLAUDE.md exception: multi-DEX routing cannot be feasibly replaced by thin tx builders.\n *\n * [B5 v2 / @t2000/sdk@1.1.0 / 2026-04-30]\n * Overlay fee config is now per-call instead of a module-level singleton. CLI / direct\n * SDK callers (`T2000.swap()`) DON'T pass `overlayFee` → fee-free swap. Audric's\n * prepare/route.ts ALWAYS passes `overlayFee = { rate: OVERLAY_FEE_RATE, receiver:\n * T2000_OVERLAY_FEE_WALLET }` → fee charged. Structural inclusion (Audric's code can't\n * forget to pass it because it IS the code), not a toggle that defaults to safe.\n *\n * Pre-1.1.0: a module-level `OVERLAY_FEE_RECEIVER` constant defaulted to a Move object\n * ID. USDC sent there became OwnedObjects keyed to the object and was inaccessible.\n * Fixed by making the receiver a regular wallet address (T2000_OVERLAY_FEE_WALLET) AND\n * by removing the singleton pattern that hid the misconfig.\n */\nimport { AggregatorClient, Env, type FindRouterParams, type RouterDataV3 } from '@cetusprotocol/aggregator-sdk';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { resolveTokenType, getDecimalsForCoinType } from '../token-registry.js';\n\nexport interface OverlayFeeConfig {\n /** Fee rate as a fraction (e.g. 0.001 = 0.1%). Pass 0 to disable. */\n rate: number;\n /** Wallet address that receives the overlay fee. */\n receiver: string;\n}\n\nexport interface SwapRouteResult {\n routerData: RouterDataV3;\n amountIn: string;\n amountOut: string;\n byAmountIn: boolean;\n priceImpact: number;\n insufficientLiquidity: boolean;\n}\n\n/**\n * Default Audric swap overlay fee — 0.1%. Exported for consumers that want to use\n * the canonical Audric rate (the Audric prepare-route does this). Changing this\n * rate requires a coordinated SDK + audric release.\n */\nexport const OVERLAY_FEE_RATE = 0.001;\n\n/**\n * Cache `AggregatorClient` instances by `(signer + overlay rate + overlay receiver)`.\n * Per-call instantiation is cheap (the client is mostly config), but caching avoids\n * pointless re-allocation when the same caller swaps multiple times in a loop.\n */\nconst clientCache = new Map<string, AggregatorClient>();\n\nfunction getClient(walletAddress: string, overlayFee?: OverlayFeeConfig): AggregatorClient {\n const rate = overlayFee?.rate ?? 0;\n const receiver = overlayFee?.receiver ?? '';\n const key = `${walletAddress}|${rate}|${receiver}`;\n\n const cached = clientCache.get(key);\n if (cached) return cached;\n\n const client = new AggregatorClient({\n signer: walletAddress,\n env: Env.Mainnet,\n ...(rate > 0 && receiver\n ? { overlayFeeRate: rate, overlayFeeReceiver: receiver }\n : {}),\n });\n clientCache.set(key, client);\n return client;\n}\n\n/**\n * Find the optimal swap route via Cetus Aggregator REST API.\n *\n * Pass `overlayFee` to charge an overlay fee on the output (Audric's pattern).\n * Omit it for a fee-free swap (CLI / direct SDK pattern).\n */\nexport async function findSwapRoute(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: bigint;\n byAmountIn: boolean;\n overlayFee?: OverlayFeeConfig;\n /**\n * Optional Cetus provider allow-list. When omitted, all 30+ DEXes\n * are eligible. Sponsored flows (Enoki) MUST pass an exclusion list\n * computed via `getProvidersExcluding([...])` from the Cetus SDK to\n * remove Pyth-dependent providers (HAEDALPMM, METASTABLE, OBRIC,\n * STEAMM_OMM, STEAMM_OMM_V2, SEVENK, HAEDALHMMV2) — those reference\n * `tx.gas` for oracle fees, which Enoki rejects in sponsored txs.\n * Non-sponsored callers (CLI, direct SDK) leave this undefined.\n */\n providers?: string[];\n}): Promise<SwapRouteResult | null> {\n const client = getClient(params.walletAddress, params.overlayFee);\n\n const findParams: FindRouterParams = {\n from: params.from,\n target: params.to,\n amount: params.amount.toString(),\n byAmountIn: params.byAmountIn,\n ...(params.providers ? { providers: params.providers } : {}),\n };\n\n const routerData = await client.findRouters(findParams);\n if (!routerData) return null;\n\n if (routerData.insufficientLiquidity) {\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: normalizePriceImpact(routerData.deviationRatio),\n insufficientLiquidity: true,\n };\n }\n\n if (routerData.error) {\n const { T2000Error } = await import('../errors.js');\n throw new T2000Error('SWAP_FAILED', `Cetus routing error: ${routerData.error.msg} (code ${routerData.error.code})`);\n }\n\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: normalizePriceImpact(routerData.deviationRatio),\n insufficientLiquidity: false,\n };\n}\n\n/**\n * Cetus' aggregator types `deviationRatio` as `number`, but in some routes\n * the router actually returns a string (\"0.001234\"). The SDK type lies, so we\n * always coerce to a finite number here (NaN/null/undefined → 0). Without\n * this every downstream consumer that calls `priceImpact.toFixed(...)` will\n * crash at runtime — including the Audric SwapQuoteCard, which takes the\n * whole chat UI down through its error boundary.\n */\nfunction normalizePriceImpact(value: unknown): number {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * Build a swap PTB from a route result. The caller must provide an input coin\n * obtained by splitting/merging wallet coins.\n *\n * **Important:** Cetus's `routerSwap` reads the overlay-fee config from the\n * AggregatorClient instance. The `overlayFee` param here MUST match the one\n * passed to `findSwapRoute` for the same swap (otherwise you'll hit the cache\n * boundary and get a different client with different overlay config).\n */\nexport async function buildSwapTx(params: {\n walletAddress: string;\n route: SwapRouteResult;\n tx: Transaction;\n inputCoin: TransactionObjectArgument;\n slippage: number;\n overlayFee?: OverlayFeeConfig;\n}): Promise<TransactionObjectArgument> {\n const client = getClient(params.walletAddress, params.overlayFee);\n const clampedSlippage = Math.max(0.001, Math.min(params.slippage, 0.05));\n\n const outputCoin = await client.routerSwap({\n router: params.route.routerData,\n inputCoin: params.inputCoin,\n slippage: clampedSlippage,\n txb: params.tx,\n });\n\n return outputCoin;\n}\n\n/**\n * Append a swap fragment to an existing PTB. SPEC 7 § \"Layer 1\" Cetus\n * appender. Two modes, dispatched by the presence of `input.inputCoin`:\n *\n * - **Wallet mode** (`inputCoin` omitted) — fetches `from`-asset coins\n * from the sender's wallet (paginated), merges/splits to the\n * requested amount, runs the swap. Mirrors the audric host's\n * `transactions/prepare/route.ts` swap branch (P2.2c will retire that\n * branch in favor of this appender via `composeTx`).\n *\n * - **Chain mode** (`inputCoin` provided) — consumes the passed-in coin\n * reference (typically produced by an upstream appender like\n * `addWithdrawToTx`) directly, no wallet fetch / no merge / no\n * split. This is the SPEC 7 multi-write enabler (\"withdraw → swap →\n * save\" without intermediate wallet materialization).\n *\n * **SUI in wallet mode:** uses `client.getCoins` like every other\n * token. This works for sponsored flows (Enoki — `tx.gas` belongs to\n * the sponsor, swap input comes from the user's separate SUI coin\n * objects). For non-sponsored flows where `tx.gas` IS the user's SUI,\n * the caller should pre-build the inputCoin via\n * `tx.splitCoins(tx.gas, [rawAmount])[0]` and pass it via chain mode\n * instead. (`T2000.swap()` already handles this internally — direct SDK\n * users go through the high-level class, not through this appender.)\n *\n * **`swapAll` semantics (wallet mode):** if the requested raw amount\n * is >= the wallet's total `from` balance, the appender consumes the\n * entire merged primary coin (not a split), matching audric's host\n * route's `swapAll` clipping. The returned `effectiveAmountIn` reflects\n * the actual consumed amount in display units.\n *\n * **Slippage:** clamped to [0.001, 0.05] (0.1% – 5%). Defaults to 0.01.\n *\n * @returns\n * - `coin` — output coin reference, ready for downstream consumption\n * (e.g. `addSaveToTx`) or wallet transfer (`tx.transferObjects`).\n * - `effectiveAmountIn` — display-units input amount the swap actually\n * consumes (handles `swapAll` clipping in wallet mode; in chain mode\n * echoes the requested `input.amount`).\n * - `expectedAmountOut` — display-units output amount per the route\n * quote. Actual on-chain output may differ within slippage.\n * - `route` — raw `SwapRouteResult` for downstream telemetry / logging.\n */\nexport async function addSwapToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n from: string;\n to: string;\n amount: number;\n slippage?: number;\n byAmountIn?: boolean;\n overlayFee?: OverlayFeeConfig;\n inputCoin?: TransactionObjectArgument;\n /**\n * Optional Cetus provider allow-list. Forwarded to `findSwapRoute`.\n * Sponsored flows (Enoki) MUST pass `getProvidersExcluding([...])`\n * to remove Pyth-dependent providers — see `findSwapRoute`'s JSDoc\n * for the exclusion list. Non-sponsored callers omit this.\n */\n providers?: string[];\n },\n): Promise<{\n coin: TransactionObjectArgument;\n effectiveAmountIn: number;\n expectedAmountOut: number;\n route: SwapRouteResult;\n}> {\n const { T2000Error } = await import('../errors.js');\n\n const fromType = resolveTokenType(input.from);\n const toType = resolveTokenType(input.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${input.from}. Provide the symbol (USDC, SUI, ...) or full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${input.to}. Provide the symbol (USDC, SUI, ...) or full coin type.`);\n if (fromType === toType) throw new T2000Error('SWAP_FAILED', 'Cannot swap a token to itself');\n if (!Number.isFinite(input.amount) || input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n }\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const toDecimals = getDecimalsForCoinType(toType);\n const requestedRaw = BigInt(Math.floor(input.amount * 10 ** fromDecimals));\n\n const slippage = Math.max(0.001, Math.min(input.slippage ?? 0.01, 0.05));\n const byAmountIn = input.byAmountIn ?? true;\n\n let inputCoin: TransactionObjectArgument;\n let effectiveRaw: bigint;\n\n if (input.inputCoin) {\n inputCoin = input.inputCoin;\n effectiveRaw = requestedRaw;\n } else {\n // Delegate to the canonical wallet-mode prelude. Critically, this path\n // shares a per-PTB merge cache with every other appender via\n // `selectAndSplitCoin` — when a multi-write bundle includes\n // `swap_execute` alongside `save_deposit`/`send_transfer` of the same\n // input asset (e.g. swap+save+send all from USDC), the second/third\n // appender hits the cache and splits from the already-merged primary\n // instead of re-emitting `mergeCoins` on consumed input slots. That's\n // the P2.7 multi-write bundle fix landed 2026-05-02.\n const { selectAndSplitCoin } = await import('../wallet/coinSelection.js');\n const result = await selectAndSplitCoin(tx, client, address, fromType, requestedRaw);\n inputCoin = result.coin;\n effectiveRaw = result.effectiveAmount;\n }\n\n const route = await findSwapRoute({\n walletAddress: address,\n from: fromType,\n to: toType,\n amount: effectiveRaw,\n byAmountIn,\n overlayFee: input.overlayFee,\n providers: input.providers,\n });\n\n if (!route) {\n throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${input.from} → ${input.to}`);\n }\n if (route.insufficientLiquidity) {\n throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${input.from} → ${input.to}`);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: address,\n route,\n tx,\n inputCoin,\n slippage,\n overlayFee: input.overlayFee,\n });\n\n return {\n coin: outputCoin,\n effectiveAmountIn: Number(effectiveRaw) / 10 ** fromDecimals,\n expectedAmountOut: Number(route.amountOut) / 10 ** toDecimals,\n route,\n };\n}\n\n/**\n * Simulate a swap transaction without executing it.\n */\nexport async function simulateSwap(params: {\n walletAddress: string;\n tx: Transaction;\n overlayFee?: OverlayFeeConfig;\n}): Promise<{ success: boolean; error?: string }> {\n const client = getClient(params.walletAddress, params.overlayFee);\n try {\n await client.devInspectTransactionBlock(params.tx);\n return { success: true };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// Re-export from the canonical token registry for backward-compat.\nexport { TOKEN_MAP, resolveTokenType } from '../token-registry.js';\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 { SuiJsonRpcClient, getJsonRpcFullnodeUrl } from '@mysten/sui/jsonRpc';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiJsonRpcClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiJsonRpcClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiJsonRpcClient({ url, network: 'mainnet' });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiJsonRpcClient {\n return new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl(network), network });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Normalize a Sui coin type to its canonical long-form 64-hex address.\n * `0x2::sui::SUI` → `0x0000…0002::sui::SUI`. Idempotent on already-long\n * forms. Returns the input unchanged if it doesn't look like a coin type\n * (`<address>::<module>::<name>`) so callers can pass arbitrary strings\n * without crashing.\n *\n * Why this exists: BlockVision's `/v2/sui/coin/price/list` endpoint\n * silently returns an empty `prices` map for short-form coin types\n * (notably `0x2::sui::SUI` — the native gas coin). Internal callers must\n * pass the long form, but external callers (LLM tool args, cached\n * coin-type strings, audit logs) commonly use the short form. Normalize\n * before the network call, denormalize back to the caller's input shape\n * after, and short/long become interchangeable.\n */\nexport function normalizeCoinType(coinType: string): string {\n const parts = coinType.split('::');\n if (parts.length !== 3) return coinType;\n const [addr, mod, name] = parts;\n if (!addr.startsWith('0x')) return coinType;\n return `${normalizeSuiAddress(addr)}::${mod}::${name}`;\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'node:crypto';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from '../errors.js';\nimport { DEFAULT_KEY_PATH } from '../constants.js';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst SCRYPT_N = 2 ** 14; // 16384 — secure and fast enough\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SALT_LENGTH = 32;\nconst IV_LENGTH = 16;\n\ninterface EncryptedKey {\n version: 1;\n algorithm: typeof ALGORITHM;\n salt: string;\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, 32, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P });\n}\n\nfunction encrypt(data: Buffer, passphrase: string): EncryptedKey {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 1,\n algorithm: ALGORITHM,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: tag.toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n };\n}\n\nfunction decrypt(encrypted: EncryptedKey, passphrase: string): Buffer {\n const salt = Buffer.from(encrypted.salt, 'hex');\n const key = deriveKey(passphrase, salt);\n const iv = Buffer.from(encrypted.iv, 'hex');\n const tag = Buffer.from(encrypted.tag, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n try {\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n } catch {\n throw new T2000Error('WALLET_LOCKED', 'Invalid PIN');\n }\n}\n\nexport function generateKeypair(): Ed25519Keypair {\n return Ed25519Keypair.generate();\n}\n\nexport function keypairFromPrivateKey(privateKey: string): Ed25519Keypair {\n if (privateKey.startsWith('suiprivkey')) {\n const decoded = decodeSuiPrivateKey(privateKey);\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n }\n const bytes = Buffer.from(privateKey.replace(/^0x/, ''), 'hex');\n return Ed25519Keypair.fromSecretKey(bytes);\n}\n\nexport async function saveKey(\n keypair: Ed25519Keypair,\n passphrase: string,\n keyPath?: string,\n): Promise<string> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n try {\n await access(filePath);\n throw new T2000Error('WALLET_EXISTS', `Wallet already exists at ${filePath}`);\n } catch (error) {\n if (error instanceof T2000Error) throw error;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const bech32Key = keypair.getSecretKey();\n const encrypted = encrypt(Buffer.from(bech32Key, 'utf-8'), passphrase);\n\n await writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n\n return filePath;\n}\n\nexport async function loadKey(passphrase: string, keyPath?: string): Promise<Ed25519Keypair> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n throw new T2000Error('WALLET_NOT_FOUND', `No wallet found at ${filePath}`);\n }\n\n const encrypted: EncryptedKey = JSON.parse(content);\n const decrypted = decrypt(encrypted, passphrase);\n const bech32Key = decrypted.toString('utf-8');\n const decoded = decodeSuiPrivateKey(bech32Key);\n\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n}\n\nexport async function walletExists(keyPath?: string): Promise<boolean> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function exportPrivateKey(keypair: Ed25519Keypair): string {\n return keypair.getSecretKey();\n}\n\nexport function getAddress(keypair: Ed25519Keypair): string {\n return keypair.getPublicKey().toSuiAddress();\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiJsonRpcClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\n/**\n * Fragment-appender for the chain-mode send leg of SPEC 7 multi-write\n * Payment Intents. Consumes a coin reference produced by a previous\n * appender (e.g. `addWithdrawToTx`, `addSwapToTx`) and transfers it to\n * `recipient` within the same Payment Intent — no intermediate wallet\n * materialization.\n *\n * Codifies the hand-built send leg from\n * `scripts/smoke-spec7-withdraw-then-send.ts` (P2.1) into a typed\n * appender. SPEC 7 § \"Layer 1\" — P2.2b will register this in the\n * `WRITE_APPENDER_REGISTRY` under `send_transfer` for chain-mode\n * dispatch; the registry adapter will handle the wallet-fetch fallback\n * by delegating to `buildSendTx` when no upstream coin is available.\n *\n * For single-step send_transfer flows (no chained predecessor), use\n * `buildSendTx` directly — it builds a complete tx including the\n * wallet-coin selection / merge / split prelude.\n *\n * @returns void — the coin is consumed by `tx.transferObjects`. Callers\n * that need the post-transfer \"effective amount\" should rely on the\n * upstream appender's `effectiveAmount` (e.g. `addWithdrawToTx`'s\n * return), not on this appender.\n */\nexport function addSendToTx(\n tx: Transaction,\n coin: TransactionObjectArgument,\n recipient: string,\n): void {\n const validRecipient = validateAddress(recipient);\n tx.transferObjects([coin], validRecipient);\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { StableAsset } from '../constants.js';\nimport type { BalanceResponse } from '../types.js';\n\nconst SUI_PRICE_FALLBACK = 1.0;\nlet _cachedSuiPrice = 0;\nlet _priceLastFetched = 0;\nconst PRICE_CACHE_TTL_MS = 60_000;\n\n/**\n * Fetch SUI price in USD from the Cetus USDC/SUI pool's sqrt_price.\n *\n * Pool is Pool<USDC, SUI> so coin_a = USDC (6 dec), coin_b = SUI (9 dec).\n * current_sqrt_price (Q64 fixed-point) encodes sqrt(raw_price) where\n * raw_price = SUI_raw / USDC_raw.\n *\n * USDC per SUI = 10^(decimals_a - decimals_b) / raw_price\n * = 10^(6-9) / raw_price\n * = 1 / (raw_price * 1000)\n *\n * Equivalently: 1000 / raw_price\n */\nasync function fetchSuiPrice(client: SuiJsonRpcClient): Promise<number> {\n const now = Date.now();\n if (_cachedSuiPrice > 0 && now - _priceLastFetched < PRICE_CACHE_TTL_MS) {\n return _cachedSuiPrice;\n }\n\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const currentSqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n\n if (currentSqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtPriceFloat = Number(currentSqrtPrice) / Number(Q64);\n const rawPrice = sqrtPriceFloat * sqrtPriceFloat;\n const price = 1000 / rawPrice;\n if (price > 0.01 && price < 1000) {\n _cachedSuiPrice = price;\n _priceLastFetched = now;\n }\n }\n }\n } catch {\n // Use cached/fallback price\n }\n\n return _cachedSuiPrice || SUI_PRICE_FALLBACK;\n}\n\nexport async function queryBalance(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<BalanceResponse> {\n const stableBalancePromises = STABLE_ASSETS.map((asset) =>\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS[asset].type })\n .then((b) => ({ asset, amount: Number(b.totalBalance) / 10 ** SUPPORTED_ASSETS[asset].decimals }))\n .catch(() => ({ asset, amount: 0 })),\n );\n\n const [suiBalance, suiPriceUsd, ...stableResults] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ...stableBalancePromises,\n ]);\n\n const stables = {} as Record<StableAsset, number>;\n let totalStables = 0;\n for (const { asset, amount } of stableResults) {\n stables[asset] = amount;\n totalStables += amount;\n }\n\n const suiAmount = Number(suiBalance.totalBalance) / Number(MIST_PER_SUI);\n const savings = 0; // Merged from NAVI in T2000.balance()\n const usdEquiv = suiAmount * suiPriceUsd;\n const total = totalStables + savings + usdEquiv;\n\n return {\n available: totalStables,\n savings,\n debt: 0,\n pendingRewards: 0,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n stables,\n };\n}\n","/**\n * Shared transaction classifier.\n *\n * Consumed by both the SDK's `parseTxRecord` (production agent path) and\n * the engine's `transaction_history` tool (cold-start RPC path). Keeping\n * a single source of truth here prevents the two paths from drifting —\n * see v1.5.3 regression where the SDK path was emitting `action:\n * 'transaction'` (rendered as \"On-chain\") while the engine path was\n * already producing fine-grained labels.\n */\n\nimport { getDecimalsForCoinType, resolveSymbol, SUI_TYPE } from '../token-registry.js';\n\n/**\n * Coarse action bucket — one of `'send' | 'lending' | 'swap' |\n * 'transaction'`. Used by the ACI `action` filter on the\n * `transaction_history` tool. STABLE: downstream queries depend on\n * exactly these values.\n *\n * Order matters: more specific buckets first. Lending patterns precede\n * swap patterns so a NAVI `::swap` helper (if one ever existed) would\n * still bucket as lending.\n */\nexport const KNOWN_TARGETS: readonly [RegExp, string][] = [\n [/::suilend|::obligation/, 'lending'],\n [/::navi|::lending_core|::incentive_v\\d+|::oracle_pro/, 'lending'],\n /**\n * DEX modules — both direct calls and aggregator legs. The Cetus\n * aggregator dispatches through a per-DEX module (e.g.\n * `cetus::swap`, `flowx_amm::swap`, `aftermath::swap`, …) plus\n * router glue functions. We list every DEX module the aggregator\n * supports today so a single-DEX call still classifies cleanly.\n */\n [/::cetus(?:_dlmm)?::|::pool::|::deepbook|::flowx_(?:amm|clmm)::|::kriya_(?:amm|clmm)::|::turbos::|::aftermath::|::afsui::|::bluefin::|::bluemove::|::ferra_(?:clmm|dlmm)::|::haedal_hmm::|::hasui::|::hawal::|::magma::|::momentum::|::obric::|::springsui::|::steamm_cpmm::|::fullsail::|::alphafi::|::volo_swap::/, 'swap'],\n /**\n * Cetus aggregator router glue. These are the swap-context and\n * balance-handling helpers the aggregator emits around per-DEX\n * legs. Without this entry a tx that ONLY had router calls\n * (theoretically possible for setup/cleanup) would slip through;\n * in practice these always coexist with a DEX leg, but the entry\n * is cheap insurance.\n */\n [/::router::(?:new_swap_context(?:_v)?|confirm_swap|transfer_balance|take_balance|transfer_or_destroy_coin)/, 'swap'],\n [/::transfer::public_transfer/, 'send'],\n];\n\n/**\n * Finer-grained display labels — derived from MoveCall function names.\n * The card renders `label ?? action`, so when this map matches we get\n * \"Deposit\" / \"Withdraw\" / \"Borrow\" / \"Repay\" / \"Payment link\" instead\n * of the generic \"Lending\" or \"Transaction\".\n *\n * Order matters: more specific patterns first. Each entry is\n * (regex, label) where the regex is matched against the\n * fully-qualified MoveCall target `pkg::module::function`.\n */\nexport const LABEL_PATTERNS: readonly [RegExp, string][] = [\n [/::pay(?:ment_kit|_kit)?::|::create_payment_link|::pay_link/, 'payment_link'],\n [/::create_invoice|::invoice::/, 'invoice'],\n [/::deposit|::supply|::mint_ctokens/, 'deposit'],\n [/::withdraw|::redeem|::redeem_ctokens/, 'withdraw'],\n [/::borrow/, 'borrow'],\n [/::repay/, 'repay'],\n [/::claim_reward|::claim::|::claim_incentive/, 'claim'],\n [/::stake/, 'stake'],\n [/::unstake|::burn::/, 'unstake'],\n [/::liquidate/, 'liquidate'],\n];\n\nexport interface ClassifyBalanceChange {\n owner: { AddressOwner?: string } | string;\n coinType: string;\n amount: string;\n}\n\nfunction resolveOwner(owner: ClassifyBalanceChange['owner']): string | null {\n if (typeof owner === 'object' && owner.AddressOwner) return owner.AddressOwner;\n if (typeof owner === 'string') return owner;\n return null;\n}\n\nexport function classifyAction(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of KNOWN_TARGETS) {\n if (pattern.test(target)) return label;\n }\n }\n if (commandTypes.includes('TransferObjects') && !commandTypes.includes('MoveCall')) return 'send';\n return 'transaction';\n}\n\n/**\n * Last-resort fallback when neither `LABEL_PATTERNS` nor the action\n * bucket produces something useful.\n *\n * Returns the first MoveCall's *module* name (e.g. \"navi\", \"spam\") so\n * the card shows something better than the literal word \"transaction\".\n * When no MoveCall exists, returns 'on-chain'.\n *\n * Note: callers should prefer `classifyLabel` which now layers\n * pattern-match → coarse action → module name (see commentary there).\n */\nexport function fallbackLabel(targets: string[]): string {\n if (!targets.length) return 'on-chain';\n const first = targets[0];\n const parts = first.split('::');\n if (parts.length >= 2 && parts[1]) return parts[1].toLowerCase();\n return 'on-chain';\n}\n\n/**\n * Three-tier label resolution for the transaction history card:\n * 1. Specific keyword match in `LABEL_PATTERNS` (\"deposit\",\n * \"payment_link\", …).\n * 2. Coarse action bucket from `classifyAction` (\"swap\", \"send\",\n * \"lending\") — prevents leaking opaque internal module names like\n * \"router\" (Cetus aggregator) or \"cross_swap\" (third-party DEX\n * aggregators) for txs that we already classified as a swap.\n * 3. Module name from the first MoveCall (`fallbackLabel`) — only\n * used when the action bucket itself is the generic \"transaction\".\n *\n * Pre-v0.46.2 we skipped tier 2, so swaps showed labels like \"router\",\n * \"cross_swap\", \"scallop_router\", etc. instead of the clean \"swap\".\n */\nexport function classifyLabel(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of LABEL_PATTERNS) {\n if (pattern.test(target)) return label;\n }\n }\n if (commandTypes.includes('TransferObjects') && !commandTypes.includes('MoveCall')) return 'send';\n const action = classifyAction(targets, commandTypes);\n if (action !== 'transaction') return action;\n return fallbackLabel(targets);\n}\n\n/**\n * Balance-direction tiebreaker for ambiguous lending calls.\n *\n * Many lending modules expose generic entry points (NAVI's bundled\n * flash actions, `lending_core::*::entry_*`, etc.) that don't carry\n * a `deposit`/`withdraw`/`borrow`/`repay` keyword in the function\n * name. When `classifyLabel` falls back to a bare module name like\n * `\"lending\"` for a known lending tx, infer direction from the user's\n * non-SUI balance change:\n * - net outflow of the supplied asset → deposit (also covers repay,\n * but repay-without-keyword is essentially never emitted).\n * - net inflow of the supplied asset → withdraw (also covers borrow).\n * SUI is excluded so gas-only transactions don't get mislabeled.\n *\n * If `LABEL_PATTERNS` matched a specific keyword, the existing label is\n * returned unchanged.\n */\nexport function refineLendingLabel(\n currentAction: string,\n currentLabel: string,\n moveCallTargets: string[],\n changes: ClassifyBalanceChange[],\n address: string,\n): string {\n if (currentAction !== 'lending') return currentLabel;\n const labelMatchedSpecific = LABEL_PATTERNS.some(([p]) =>\n moveCallTargets.some((t) => p.test(t)),\n );\n if (labelMatchedSpecific) return currentLabel;\n\n const userNonSuiOutflow = changes.find(\n (c) => resolveOwner(c.owner) === address && c.coinType !== SUI_TYPE && BigInt(c.amount) < 0n,\n );\n if (userNonSuiOutflow) return 'deposit';\n\n const userNonSuiInflow = changes.find(\n (c) => resolveOwner(c.owner) === address && c.coinType !== SUI_TYPE && BigInt(c.amount) > 0n,\n );\n if (userNonSuiInflow) return 'withdraw';\n\n return currentLabel;\n}\n\nexport interface ClassifyResult {\n action: string;\n label: string;\n}\n\nexport function classifyTransaction(\n moveCallTargets: string[],\n commandTypes: string[],\n balanceChanges: ClassifyBalanceChange[],\n address: string,\n): ClassifyResult {\n const action = classifyAction(moveCallTargets, commandTypes);\n const baseLabel = classifyLabel(moveCallTargets, commandTypes);\n const label = refineLendingLabel(action, baseLabel, moveCallTargets, balanceChanges, address);\n return { action, label };\n}\n\n/**\n * Direction of the user's net non-gas movement for this transaction.\n *\n * - `'out'` — the user spent the asset (sends, deposits, repays,\n * swap-in, payment-link payouts).\n * - `'in'` — the user received the asset (withdraws, borrows,\n * swap-out, claims, deposits credited from another wallet).\n *\n * Used by the `TransactionHistoryCard` to choose the `+`/`−` sign and\n * color. Direction is computed from the actual on-chain balance change\n * — never from the textual label — so opaque action types (`'router'`,\n * `'cross_swap'`, …) still render the correct sign.\n */\nexport type TxDirection = 'in' | 'out';\n\nexport interface ExtractedTransfer {\n amount?: number;\n asset?: string;\n recipient?: string;\n direction?: TxDirection;\n}\n\n/**\n * Extracts the principal amount/asset/direction for a transaction\n * from its `balanceChanges`.\n *\n * Algorithm:\n * 1. Restrict to the user's *own* balance changes.\n * 2. Prefer non-SUI changes (gas-only SUI deltas are noise).\n * 3. Pick the change with the largest absolute value — the \"principal\".\n * 4. If no non-SUI change exists, fall back to the largest SUI change\n * so pure-SUI transfers (stake/unstake/native send) still render.\n * 5. Direction follows the sign of the principal.\n * 6. Recipient is set only on outflows, by finding a matching inflow\n * on a *non-user* address with the same coinType.\n *\n * Pre-v0.46.2 this function only inspected outflows, so withdraws,\n * borrows, claims, swap-receives and payment-link receives all\n * rendered with no amount on the rich card (and with a wrong sign,\n * because the card guessed direction from the label string).\n */\nexport function extractTransferDetails(\n changes: ClassifyBalanceChange[] | undefined,\n sender: string,\n): ExtractedTransfer {\n if (!changes || changes.length === 0) return {};\n\n const userChanges = changes.filter((c) => resolveOwner(c.owner) === sender);\n if (userChanges.length === 0) return {};\n\n const userNonSui = userChanges.filter((c) => c.coinType !== SUI_TYPE);\n const pool = userNonSui.length > 0 ? userNonSui : userChanges;\n\n let primary = pool[0];\n let primaryAbs = bigintAbs(BigInt(primary.amount));\n for (let i = 1; i < pool.length; i++) {\n const abs = bigintAbs(BigInt(pool[i].amount));\n if (abs > primaryAbs) {\n primary = pool[i];\n primaryAbs = abs;\n }\n }\n\n const raw = BigInt(primary.amount);\n if (raw === 0n) return {};\n\n const decimals = getDecimalsForCoinType(primary.coinType);\n const amount = Number(primaryAbs) / 10 ** decimals;\n const asset = resolveSymbol(primary.coinType);\n const direction: TxDirection = raw < 0n ? 'out' : 'in';\n\n let recipient: string | undefined;\n if (direction === 'out') {\n const recipientChange = changes.find(\n (c) =>\n resolveOwner(c.owner) !== sender &&\n c.coinType === primary.coinType &&\n BigInt(c.amount) > 0n,\n );\n recipient = recipientChange ? resolveOwner(recipientChange.owner) ?? undefined : undefined;\n }\n\n return { amount, asset, recipient, direction };\n}\n\nfunction bigintAbs(n: bigint): bigint {\n return n < 0n ? -n : n;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { TransactionRecord } from '../types.js';\nimport {\n classifyTransaction,\n extractTransferDetails,\n type ClassifyBalanceChange,\n} from './classify.js';\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => parseTxRecord(tx as unknown as SuiRpcTxBlock, address));\n}\n\nexport async function queryTransaction(\n client: SuiJsonRpcClient,\n digest: string,\n senderAddress: string,\n): Promise<TransactionRecord | null> {\n try {\n const tx = await client.getTransactionBlock({\n digest,\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n });\n return parseTxRecord(tx as unknown as SuiRpcTxBlock, senderAddress);\n } catch {\n return null;\n }\n}\n\n/**\n * Shape of a transaction block as returned by `suix_queryTransactionBlocks`\n * with `showEffects | showInput | showBalanceChanges` enabled. Exported so\n * downstream consumers (audric dashboard `/api/history`, `/api/activity`,\n * etc.) can type their RPC calls without redeclaring the structure.\n */\nexport interface SuiRpcTxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: ClassifyBalanceChange[];\n}\n\n/**\n * Convert a single Sui RPC transaction block to a {@link TransactionRecord}\n * using the canonical (shared) classifier and balance-change extractor.\n *\n * This is the single source of truth for transaction parsing across the\n * agent-tool path AND the dashboard-API path. Use it instead of writing\n * a bespoke parser per surface.\n *\n * @param tx Raw RPC tx block (must include `effects`, `input`, `balanceChanges`).\n * @param address Wallet address whose perspective we're parsing from.\n */\nexport function parseSuiRpcTx(tx: SuiRpcTxBlock, address: string): TransactionRecord {\n return parseTxRecord(tx, address);\n}\n\n/**\n * Extract the sender (signer) address from a raw RPC tx block.\n * Returns `null` if the block shape is unexpected.\n */\nexport function extractTxSender(txBlock: unknown): string | null {\n try {\n if (!txBlock || typeof txBlock !== 'object') return null;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return null;\n return ((data as Record<string, unknown>).sender as string) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract MoveCall targets (`<pkg>::<module>::<function>`) and the\n * sequence of programmable-transaction command types (e.g. `MoveCall`,\n * `TransferObjects`) from a raw RPC tx block. Tolerates both the\n * legacy `inner.transactions` field and the newer `inner.commands`\n * field.\n */\nexport function extractTxCommands(txBlock: unknown): {\n moveCallTargets: string[];\n commandTypes: string[];\n} {\n return extractCommands(txBlock);\n}\n\nfunction parseTxRecord(tx: SuiRpcTxBlock, address: string): TransactionRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n const { moveCallTargets, commandTypes } = extractCommands(tx.transaction);\n const balanceChanges = tx.balanceChanges ?? [];\n const { amount, asset, recipient, direction } = extractTransferDetails(balanceChanges, address);\n const { action, label } = classifyTransaction(\n moveCallTargets,\n commandTypes,\n balanceChanges,\n address,\n );\n\n return {\n digest: tx.digest,\n action,\n label,\n amount,\n asset,\n recipient,\n direction,\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n}\n\ninterface CommandInfo {\n moveCallTargets: string[];\n commandTypes: string[];\n}\n\nfunction extractCommands(txBlock: unknown): CommandInfo {\n const result: CommandInfo = { moveCallTargets: [], commandTypes: [] };\n try {\n if (!txBlock || typeof txBlock !== 'object') return result;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return result;\n const inner = 'transaction' in (data as Record<string, unknown>)\n ? (data as Record<string, unknown>).transaction\n : undefined;\n if (!inner || typeof inner !== 'object') return result;\n const commands = 'commands' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).commands\n : 'transactions' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).transactions\n : undefined;\n if (!Array.isArray(commands)) return result;\n\n for (const cmd of commands as Record<string, unknown>[]) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n result.moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n result.commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n result.commandTypes.push('TransferObjects');\n }\n }\n } catch { /* best effort */ }\n return result;\n}\n","import { EventEmitter } from 'eventemitter3';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { createPaymentTransactionUri } from '@mysten/payment-kit';\nimport { getSuiClient } from './utils/sui.js';\nimport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nimport type { TransactionSigner } from './signer.js';\nimport { KeypairSigner } from './wallet/keypairSigner.js';\nimport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory, queryTransaction } from './wallet/history.js';\nimport { getDecimalsForCoinType, resolveSymbol } from './token-registry.js';\n// [B5 v2 / 2026-04-30] No fee imports — CLI / direct SDK is fee-free. Consumer\n// apps (Audric) own fee policy via `addFeeTransfer` from `./protocols/protocolFee.js`.\nimport * as yieldTracker from './protocols/yieldTracker.js';\nimport { ProtocolRegistry } from './adapters/registry.js';\nimport { NaviAdapter } from './adapters/navi.js';\nimport type { LendingAdapter } from './adapters/types.js';\nimport type {\n T2000Options,\n BalanceResponse,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n RatesResult,\n PositionsResult,\n TransactionRecord,\n DepositInfo,\n PaymentRequest,\n EarningsResult,\n FundStatusResult,\n ClaimRewardsResult,\n CompoundRewardsResult,\n PendingReward,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, assertAllowedAsset, type SupportedAsset } from './constants.js';\n\nimport { truncateAddress } from './utils/sui.js';\nimport { SafeguardEnforcer } from './safeguards/enforcer.js';\nimport { ContactManager } from './contacts.js';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.t2000');\n\ninterface T2000Events {\n balanceChange: (event: { asset: string; previous: number; current: number; cause: string; tx?: string }) => void;\n healthWarning: (event: { healthFactor: number; threshold: number; severity: 'warning' }) => void;\n healthCritical: (event: { healthFactor: number; threshold: number; severity: 'critical' }) => void;\n yield: (event: { earned: number; total: number; apy: number; timestamp: number }) => void;\n error: (error: T2000Error) => void;\n}\n\n// Sign + execute a transaction with the agent's signer. Replaces the pre-v2 gas\n// manager — every transaction is now self-funded by the agent's wallet.\ntype SuiTransactionEffects = NonNullable<Awaited<ReturnType<SuiJsonRpcClient['executeTransactionBlock']>>['effects']>;\n\nasync function executeTx(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Promise<Transaction> | Transaction,\n): Promise<{ digest: string; gasCostSui: number; effects: SuiTransactionEffects | undefined }> {\n const tx = await buildTx();\n tx.setSender(signer.getAddress());\n const txBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(txBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: txBytes,\n signature,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n const gasUsed = result.effects?.gasUsed;\n let gasCostSui = 0;\n if (gasUsed) {\n const total = BigInt(gasUsed.computationCost) + BigInt(gasUsed.storageCost) - BigInt(gasUsed.storageRebate);\n gasCostSui = Number(total) / 1e9;\n }\n return { digest: result.digest, gasCostSui, effects: result.effects ?? undefined };\n}\n\nexport class T2000 extends EventEmitter<T2000Events> {\n private readonly _signer: TransactionSigner;\n private readonly _keypair?: Ed25519Keypair;\n private readonly client: SuiJsonRpcClient;\n private readonly _address: string;\n private readonly registry: ProtocolRegistry;\n readonly enforcer: SafeguardEnforcer;\n readonly contacts: ContactManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string);\n private constructor(signer: TransactionSigner, client: SuiJsonRpcClient, registry: ProtocolRegistry | undefined, configDir: string | undefined, isSignerMode: true);\n private constructor(\n keypairOrSigner: Ed25519Keypair | TransactionSigner,\n client: SuiJsonRpcClient,\n registry?: ProtocolRegistry,\n configDir?: string,\n isSignerMode?: boolean,\n ) {\n super();\n if (isSignerMode) {\n this._signer = keypairOrSigner as TransactionSigner;\n this._keypair = undefined;\n this._address = this._signer.getAddress();\n } else {\n const kp = keypairOrSigner as Ed25519Keypair;\n this._keypair = kp;\n this._signer = new KeypairSigner(kp);\n this._address = getAddress(kp);\n }\n this.client = client;\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n }\n\n private static createDefaultRegistry(client: SuiJsonRpcClient): ProtocolRegistry {\n const registry = new ProtocolRegistry();\n const naviAdapter = new NaviAdapter();\n naviAdapter.initSync(client);\n registry.registerLending(naviAdapter);\n return registry;\n }\n\n static async create(options: T2000Options = {}): Promise<T2000> {\n const { keyPath, pin, passphrase, rpcUrl } = options;\n const secret = pin ?? passphrase;\n\n const client = getSuiClient(rpcUrl);\n\n const exists = await walletExists(keyPath);\n if (!exists) {\n throw new T2000Error(\n 'WALLET_NOT_FOUND',\n 'No wallet found. Run `t2000 init` to create one.',\n );\n }\n\n if (!secret) {\n throw new T2000Error('WALLET_LOCKED', 'PIN required to unlock wallet');\n }\n\n const keypair = await loadKey(secret, keyPath);\n return new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n }\n\n static fromPrivateKey(privateKey: string, options: { network?: 'mainnet' | 'testnet'; rpcUrl?: string } = {}): T2000 {\n const keypair = keypairFromPrivateKey(privateKey);\n const client = getSuiClient(options.rpcUrl);\n return new T2000(keypair, client);\n }\n\n static async init(options: { pin: string; passphrase?: string; keyPath?: string; name?: string }): Promise<{ agent: T2000; address: string }> {\n const secret = options.pin ?? options.passphrase ?? '';\n const keypair = generateKeypair();\n await saveKey(keypair, secret, options.keyPath);\n\n const client = getSuiClient();\n const agent = new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n const address = agent.address();\n\n return { agent, address };\n }\n\n // -- Gas --\n\n /** SuiJsonRpcClient used by this agent — exposed for integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for CLI/MCP integrations. */\n get keypair(): Ed25519Keypair {\n if (!this._keypair) {\n throw new T2000Error('WALLET_NOT_FOUND', 'Keypair not available — this instance uses zkLogin');\n }\n return this._keypair;\n }\n\n /** Transaction signer (works for both keypair and zkLogin). */\n get signer(): TransactionSigner {\n return this._signer;\n }\n\n // -- MPP Payments --\n\n async pay(options: PayOptions): Promise<PayResult> {\n this.enforcer.assertNotLocked();\n this.enforcer.check({ operation: 'pay', amount: options.maxPrice ?? 1.0 });\n\n const { Mppx } = await import('mppx/client');\n const { sui } = await import('@suimpp/mpp/client');\n\n const client = this.client;\n const signer = this._signer;\n const signerAddress = signer.getAddress();\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [sui({\n client,\n signer: { toSuiAddress: () => signerAddress } as Parameters<typeof sui>[0]['signer'],\n execute: async (tx) => {\n const result = await executeTx(client, signer, () => tx);\n return { digest: result.digest, effects: result.effects };\n },\n })],\n });\n\n const method = (options.method ?? 'GET').toUpperCase();\n const canHaveBody = method !== 'GET' && method !== 'HEAD';\n\n const response = await mppx.fetch(options.url, {\n method,\n headers: options.headers,\n body: canHaveBody ? options.body : undefined,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n let body: unknown;\n try {\n body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n } catch {\n body = null;\n }\n\n const receiptHeader = response.headers.get('x-payment-receipt');\n const paid = !!receiptHeader;\n\n if (paid) {\n this.enforcer.recordUsage(options.maxPrice ?? 1.0);\n }\n\n return {\n status: response.status,\n body,\n paid,\n cost: paid ? (options.maxPrice ?? undefined) : undefined,\n receipt: receiptHeader\n ? { reference: receiptHeader, timestamp: new Date().toISOString() }\n : undefined,\n };\n }\n\n // -- VOLO vSUI Staking --\n\n async stakeVSui(params: { amount: number }): Promise<StakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildStakeVSuiTx, getVoloStats } = await import('./protocols/volo.js');\n\n const amountMist = BigInt(Math.floor(params.amount * Number(MIST_PER_SUI)));\n const stats = await getVoloStats();\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n return buildStakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const vSuiReceived = params.amount / stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n amountSui: params.amount,\n vSuiReceived,\n apy: stats.apy,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async unstakeVSui(params: { amount: number | 'all' }): Promise<UnstakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildUnstakeVSuiTx, getVoloStats, VSUI_TYPE } = await import('./protocols/volo.js');\n\n let amountMist: bigint | 'all';\n let vSuiAmount: number;\n\n if (params.amount === 'all') {\n amountMist = 'all';\n const coins = await this._fetchCoins(VSUI_TYPE);\n vSuiAmount = coins.reduce((sum, c) => sum + Number(c.balance), 0) / 1e9;\n } else {\n amountMist = BigInt(Math.floor(params.amount * 1e9));\n vSuiAmount = params.amount;\n }\n\n const stats = await getVoloStats();\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n return buildUnstakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const suiReceived = vSuiAmount * stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n vSuiAmount,\n suiReceived,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n // -- Swap --\n\n async swap(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n slippage?: number;\n }): Promise<SwapResult> {\n this.enforcer.assertNotLocked();\n\n const { findSwapRoute, buildSwapTx, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n const slippage = Math.min(params.slippage ?? 0.01, 0.05);\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n if (route.priceImpact > 0.05) {\n console.warn(`[swap] High price impact: ${(route.priceImpact * 100).toFixed(2)}%`);\n }\n\n const toDecimals = getDecimalsForCoinType(toType);\n\n // Snapshot pre-swap balance for fallback diff calculation\n let preBalRaw = 0n;\n try {\n const preBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n preBalRaw = BigInt(preBal.totalBalance);\n } catch { /* first time holding this token — balance is 0 */ }\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n let inputCoin: TransactionObjectArgument;\n if (fromType === '0x2::sui::SUI') {\n [inputCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(fromType);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${params.from} coins found.`);\n const merged = this._mergeCoinsInTx(tx, coins);\n [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n let toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n // --- Primary: parse balance changes from the finalized transaction ---\n const toTypeSuffix = toType.split('::').slice(1).join('::');\n try {\n const fullTx = await this.client.waitForTransaction({\n digest: gasResult.digest,\n options: { showBalanceChanges: true },\n timeout: 8_000,\n pollInterval: 400,\n });\n type BalChange = { coinType: string; amount: string; owner: { AddressOwner?: string } };\n const changes = ((fullTx as { balanceChanges?: BalChange[] }).balanceChanges ?? []);\n const received = changes.find((c) => {\n if (BigInt(c.amount) <= 0n) return false;\n const ownerAddr = (c.owner as { AddressOwner?: string })?.AddressOwner;\n if (!ownerAddr || ownerAddr.toLowerCase() !== this._address.toLowerCase()) return false;\n if (c.coinType === toType) return true;\n return c.coinType.endsWith(toTypeSuffix);\n });\n if (received) {\n const actual = Number(BigInt(received.amount)) / 10 ** toDecimals;\n if (actual > 0) toAmount = actual;\n }\n } catch {\n // waitForTransaction timeout — fall through to balance diff\n }\n\n // --- Fallback: pre/post getBalance diff ---\n const cetusEstimate = Number(route.amountOut) / 10 ** toDecimals;\n if (Math.abs(toAmount - cetusEstimate) < 0.001) {\n try {\n await new Promise((r) => setTimeout(r, 2000));\n const postBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n const postRaw = BigInt(postBal.totalBalance);\n const delta = Number(postRaw - preBalRaw) / 10 ** toDecimals;\n if (delta > 0) toAmount = delta;\n } catch {\n // Balance diff fallback failed — use Cetus estimate\n }\n }\n\n // Resolve full coin types to user-friendly token names\n const fromName = resolveSymbol(fromType);\n const toName = resolveSymbol(toType);\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n success: true,\n tx: gasResult.digest,\n fromToken: fromName,\n toToken: toName,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async swapQuote(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n }): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n this.enforcer.assertNotLocked();\n\n const asset = (params.asset ?? 'USDC') as keyof typeof SUPPORTED_ASSETS;\n if (!(asset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n\n const resolved = this.contacts.resolve(params.to);\n const sendAmount = params.amount;\n const sendTo = resolved.address;\n\n const gasResult = await executeTx(this.client, this._signer, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n );\n\n this.enforcer.recordUsage(sendAmount);\n const balance = await this.balance();\n\n this.emitBalanceChange(asset, sendAmount, 'send', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: sendAmount,\n to: resolved.address,\n contactName: resolved.contactName,\n gasCost: gasResult.gasCostSui,\n gasCostUnit: 'SUI',\n balance,\n };\n }\n\n async balance(): Promise<BalanceResponse> {\n const bal = await queryBalance(this.client, this._address);\n\n let chainTotal = bal.available + bal.gasReserve.usdEquiv;\n\n try {\n const positions = await this.positions();\n for (const pos of positions.positions) {\n const usdValue = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') {\n chainTotal += usdValue;\n bal.savings += usdValue;\n } else if (pos.type === 'borrow') {\n chainTotal -= usdValue;\n bal.debt += usdValue;\n }\n }\n } catch {\n // Protocol unavailable — chain total limited to wallet\n }\n\n try {\n const pendingRewards = await this.getPendingRewards();\n bal.pendingRewards = pendingRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n } catch {\n bal.pendingRewards = 0;\n }\n\n bal.total = chainTotal;\n return bal;\n }\n\n async history(params?: { limit?: number }): Promise<TransactionRecord[]> {\n return queryHistory(this.client, this._address, params?.limit);\n }\n\n async transactionDetail(digest: string): Promise<TransactionRecord | null> {\n return queryTransaction(this.client, digest, this._address);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'mainnet',\n supportedAssets: ['USDC', 'USDT', 'SUI'],\n instructions: [\n `Send USDC to: ${this._address}`,\n `Network: Sui Mainnet`,\n `Or buy USDC on an exchange and withdraw to this address.`,\n `USDC contract: ${SUPPORTED_ASSETS.USDC.type}`,\n ].join('\\n'),\n };\n }\n\n receive(params?: { amount?: number; currency?: string; memo?: string; label?: string }): PaymentRequest {\n const amount = params?.amount ?? null;\n const currency = params?.currency ?? 'USDC';\n const memo = params?.memo ?? null;\n const label = params?.label ?? null;\n const nonce = crypto.randomUUID();\n\n let qrUri: string;\n if (amount != null && amount > 0) {\n const decimals = currency === 'SUI' ? 9 : 6;\n const coinType = currency === 'SUI'\n ? '0x2::sui::SUI'\n : SUPPORTED_ASSETS.USDC.type;\n const rawAmount = BigInt(Math.floor(amount * 10 ** decimals));\n qrUri = createPaymentTransactionUri({\n receiverAddress: this._address,\n amount: rawAmount,\n coinType,\n nonce,\n ...(label ? { label } : {}),\n ...(memo ? { message: memo } : {}),\n });\n } else {\n const qrParts = [`sui:${this._address}`];\n const queryParams: string[] = [];\n if (currency !== 'SUI') queryParams.push(`currency=${currency}`);\n if (memo) queryParams.push(`memo=${encodeURIComponent(memo)}`);\n if (label) queryParams.push(`label=${encodeURIComponent(label)}`);\n qrUri = queryParams.length > 0 ? `${qrParts[0]}?${queryParams.join('&')}` : qrParts[0];\n }\n\n const amountStr = amount != null ? `$${amount.toFixed(2)} ` : '';\n const displayParts = [`Send ${amountStr}${currency} to ${truncateAddress(this._address)}`];\n if (memo) displayParts.push(`Memo: ${memo}`);\n\n return {\n address: this._address,\n network: 'mainnet',\n amount,\n currency,\n memo,\n label,\n nonce,\n qrUri,\n displayText: displayParts.join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n static fromZkLogin(opts: {\n ephemeralKeypair: Ed25519Keypair;\n zkProof: ZkLoginProof;\n userAddress: string;\n maxEpoch: number;\n rpcUrl?: string;\n }): T2000 {\n const signer = new ZkLoginSigner(opts.ephemeralKeypair, opts.zkProof, opts.userAddress, opts.maxEpoch);\n const client = getSuiClient(opts.rpcUrl);\n return new T2000(signer, client, undefined, undefined, true);\n }\n\n async registerAdapter(adapter: LendingAdapter): Promise<void> {\n await adapter.init(this.client);\n this.registry.registerLending(adapter);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<SaveResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('save', params.asset);\n // [v0.51.0] Default USDC, but honor params.asset for the strategic-exception\n // set (currently USDC, USDsui — see OPERATION_ASSETS.save). Hardcoding 'USDC'\n // here previously silently rewrote the user's intent.\n const asset: SupportedAsset = (params.asset as SupportedAsset | undefined) ?? 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n let amount: number;\n if (params.amount === 'all') {\n // [v0.51.0] Per-asset balance query — `queryBalance.available` is the sum\n // of STABLE_ASSETS (USDC), not the requested asset. For USDsui we need the\n // raw on-chain balance for that specific coin type.\n const assetBalance = await this._queryAssetBalance(assetInfo.type, assetInfo.decimals);\n amount = assetBalance - 1.0;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} available to save`, {\n reason: 'insufficient_balance', asset,\n });\n }\n } else {\n amount = params.amount;\n const assetBalance = await this._queryAssetBalance(assetInfo.type, assetInfo.decimals);\n if (amount > assetBalance) {\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient ${assetInfo.displayName} balance. Available: ${assetBalance.toFixed(assetInfo.decimals === 6 ? 2 : 4)}, requested: ${amount.toFixed(assetInfo.decimals === 6 ? 2 : 4)}`,\n );\n }\n }\n\n // [B5 v2 / 2026-04-30] CLI / direct SDK calls are fee-free. Consumer apps\n // (Audric) charge their own fees by adding `addFeeTransfer` to the tx before\n // calling the SDK builders. `fee` is reported as 0 in the result.\n const saveAmount = amount;\n const adapter = await this.resolveLending(params.protocol, asset, 'save');\n const canPTB = !!adapter.addSaveToTx;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n const merged = this._mergeCoinsInTx(tx, coins);\n const rawAmount = BigInt(Math.floor(saveAmount * 10 ** assetInfo.decimals));\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n await adapter.addSaveToTx!(tx, this._address, inputCoin, asset);\n return tx;\n }\n\n const { tx } = await adapter.buildSaveTx(this._address, saveAmount, asset);\n return tx;\n });\n\n const rates = await adapter.getRates(asset);\n this.emitBalanceChange(asset, saveAmount, 'save', gasResult.digest);\n\n let savingsBalance = saveAmount;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const positions = await this.positions();\n const actual = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n if (actual > 0) {\n savingsBalance = actual;\n break;\n }\n } catch { /* retry */ }\n await new Promise(r => setTimeout(r, 2000));\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.saveApy,\n fee: 0,\n gasCost: gasResult.gasCostSui,\n savingsBalance,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; asset?: string; protocol?: string }): Promise<WithdrawResult> {\n this.enforcer.assertNotLocked();\n if (params.amount === 'all' && !params.protocol && !params.asset) {\n return this.withdrawAllProtocols();\n }\n\n const allPositions = await this.registry.allPositions(this._address);\n const supplies: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const s of pos.positions.supplies) {\n if (s.amount > 0.001) {\n if (params.asset && s.asset !== params.asset) continue;\n supplies.push({ protocolId: pos.protocolId, asset: s.asset, amount: s.amount, apy: s.apy });\n }\n }\n }\n\n if (supplies.length === 0) {\n throw new T2000Error('NO_COLLATERAL', params.asset ? `No ${params.asset} savings to withdraw` : 'No savings to withdraw');\n }\n\n supplies.sort((a, b) => {\n const aIsUsdc = a.asset === 'USDC' ? 0 : 1;\n const bIsUsdc = b.asset === 'USDC' ? 0 : 1;\n if (aIsUsdc !== bIsUsdc) return aIsUsdc - bIsUsdc;\n return a.apy - b.apy;\n });\n const target = supplies[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n let amount: number;\n if (params.amount === 'all') {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n amount = maxResult.maxAmount;\n if (amount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw');\n }\n } else {\n amount = params.amount;\n\n const hf = await adapter.getHealth(this._address);\n if (hf.borrowed > 0) {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n if (amount > maxResult.maxAmount) {\n throw new T2000Error(\n 'WITHDRAW_WOULD_LIQUIDATE',\n `Withdrawing $${amount.toFixed(2)} would drop health factor below 1.5`,\n {\n safeWithdrawAmount: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n projectedHF: maxResult.healthFactorAfter,\n },\n );\n }\n }\n }\n\n const withdrawAmount = amount;\n let finalAmount = withdrawAmount;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (adapter.addWithdrawToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const { coin, effectiveAmount } = await adapter.addWithdrawToTx!(tx, this._address, withdrawAmount, target.asset);\n finalAmount = effectiveAmount;\n tx.transferObjects([coin], this._address);\n return tx;\n }\n\n const built = await adapter.buildWithdrawTx(this._address, withdrawAmount, target.asset);\n finalAmount = built.effectiveAmount;\n return built.tx;\n });\n\n this.emitBalanceChange(target.asset, finalAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: finalAmount,\n asset: target.asset,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n private async withdrawAllProtocols(): Promise<WithdrawResult> {\n const allPositions = await this.registry.allPositions(this._address);\n\n const withdrawable: Array<{ protocolId: string; asset: string; amount: number }> = [];\n for (const pos of allPositions) {\n for (const supply of pos.positions.supplies) {\n if (supply.amount > 0.01) {\n withdrawable.push({ protocolId: pos.protocolId, asset: supply.asset, amount: supply.amount });\n }\n }\n }\n\n if (withdrawable.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n const protocolMaxes = new Map<string, number>();\n const entries: Array<{ protocolId: string; asset: string; maxAmount: number; adapter: LendingAdapter }> = [];\n for (const entry of withdrawable) {\n const adapter = this.registry.getLending(entry.protocolId);\n if (!adapter) continue;\n if (!protocolMaxes.has(entry.protocolId)) {\n const maxResult = await adapter.maxWithdraw(this._address, entry.asset);\n protocolMaxes.set(entry.protocolId, maxResult.maxAmount);\n }\n const remaining = protocolMaxes.get(entry.protocolId)!;\n const perAssetMax = Math.min(entry.amount, remaining);\n if (perAssetMax > 0.01) {\n entries.push({ ...entry, maxAmount: perAssetMax, adapter });\n protocolMaxes.set(entry.protocolId, remaining - perAssetMax);\n }\n }\n\n if (entries.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n let totalReceived = 0;\n const canPTB = entries.every(e => e.adapter.addWithdrawToTx);\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n for (const entry of entries) {\n const { coin, effectiveAmount } = await entry.adapter.addWithdrawToTx!(\n tx, this._address, entry.maxAmount, entry.asset,\n );\n totalReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const entry of entries) {\n const built = await entry.adapter.buildWithdrawTx(this._address, entry.maxAmount, entry.asset);\n totalReceived += built.effectiveAmount;\n lastTx = built.tx;\n }\n return lastTx!;\n });\n\n if (totalReceived <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalReceived,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n /**\n * [v0.51.0] Per-asset wallet balance lookup.\n *\n * `queryBalance.available` rolls up only `STABLE_ASSETS` (USDC), so it cannot\n * answer \"do they have enough USDsui to save 10?\". This helper hits\n * `getBalance` for the specific coin type — same mechanism `queryBalance`\n * uses internally — and converts to a human-readable amount using the asset's\n * decimals. Returns 0 (not a throw) when the address holds none of the asset,\n * matching the caller's existing \"insufficient balance\" error path.\n */\n private async _queryAssetBalance(coinType: string, decimals: number): Promise<number> {\n try {\n const bal = await this.client.getBalance({ owner: this._address, coinType });\n return Number(bal.totalBalance) / 10 ** decimals;\n } catch {\n return 0;\n }\n }\n\n private async _fetchCoins(coinType: string): 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 this.client.getCoins({ owner: this._address, 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\n if (all.length > 0) {\n this._lastFundDigest = undefined;\n return all;\n }\n\n if (this._lastFundDigest && coinType === SUPPORTED_ASSETS.USDC.type) {\n const txInfo = await this.client.getTransactionBlock({\n digest: this._lastFundDigest,\n options: { showObjectChanges: true },\n });\n const coinIds = (txInfo.objectChanges ?? [])\n .filter((c): c is typeof c & { objectId: string } =>\n (c.type === 'created' || c.type === 'mutated') &&\n 'objectType' in c &&\n typeof c.objectType === 'string' &&\n c.objectType.includes('0x2::coin::Coin') &&\n c.objectType.includes(coinType),\n )\n .map(c => c.objectId);\n\n if (coinIds.length > 0) {\n const objects = await this.client.multiGetObjects({\n ids: coinIds,\n options: { showContent: true, showOwner: true },\n });\n for (const obj of objects) {\n if (\n obj.data?.content?.dataType === 'moveObject' &&\n obj.data.owner &&\n typeof obj.data.owner === 'object' &&\n 'AddressOwner' in obj.data.owner &&\n obj.data.owner.AddressOwner === this._address\n ) {\n const fields = obj.data.content.fields as Record<string, unknown>;\n all.push({ coinObjectId: obj.data.objectId!, balance: String(fields.balance ?? '0') });\n }\n }\n }\n }\n\n return all;\n }\n\n private _mergeCoinsInTx(tx: Transaction, coins: Array<{ coinObjectId: string; balance: string }>): 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 private _lastFundDigest: string | undefined;\n\n private async _autoFundFromSavings(shortfall: number): Promise<void> {\n const positions = await this.positions();\n const savingsTotal = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n if (savingsTotal < shortfall * 0.95) {\n const bal = await queryBalance(this.client, this._address);\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. Available: $${bal.available.toFixed(2)}, savings: $${savingsTotal.toFixed(2)}, requested shortfall: $${shortfall.toFixed(2)}`,\n );\n }\n\n const result = await this.withdraw({ amount: shortfall });\n if (result.amount < shortfall * 0.5) {\n throw new T2000Error(\n 'WITHDRAW_FAILED',\n `Auto-withdraw from savings returned $${result.amount.toFixed(2)} — expected ~$${shortfall.toFixed(2)}. Try withdrawing manually first.`,\n );\n }\n\n const txInfo = await this.client.getTransactionBlock({\n digest: result.tx,\n options: { showBalanceChanges: true },\n });\n const usdcReceived = (txInfo.balanceChanges ?? []).some(\n c => c.coinType === SUPPORTED_ASSETS.USDC.type &&\n Number(c.amount) > 0 &&\n typeof c.owner === 'object' && 'AddressOwner' in c.owner &&\n c.owner.AddressOwner === this._address,\n );\n if (!usdcReceived) {\n throw new T2000Error('WITHDRAW_FAILED', 'Withdraw TX did not produce USDC');\n }\n this._lastFundDigest = result.tx;\n }\n\n async maxWithdraw(): Promise<MaxWithdrawResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'withdraw');\n return adapter.maxWithdraw(this._address, 'USDC');\n }\n\n // -- Borrowing --\n\n async borrow(params: { amount: number; asset?: SupportedAsset; protocol?: string }): Promise<BorrowResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('borrow', params.asset);\n // [v0.51.0] Default USDC, honor params.asset for the strategic-exception\n // set (USDC, USDsui — see OPERATION_ASSETS.borrow).\n const asset: SupportedAsset = (params.asset as SupportedAsset | undefined) ?? 'USDC';\n const adapter = await this.resolveLending(params.protocol, asset, 'borrow');\n\n const maxResult = await adapter.maxBorrow(this._address, asset);\n if (maxResult.maxAmount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No collateral deposited. Save first with `t2000 save <amount>`.');\n }\n if (params.amount > maxResult.maxAmount) {\n throw new T2000Error('HEALTH_FACTOR_TOO_LOW', `Max safe borrow: $${maxResult.maxAmount.toFixed(2)}. Only savings deposits count as borrowable collateral.`, {\n maxBorrow: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n });\n }\n // [B5 v2 / 2026-04-30] CLI / direct SDK borrows are fee-free. See save() above.\n const borrowAmount = params.amount;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n const { tx } = await adapter.buildBorrowTx(this._address, borrowAmount, asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n this.emitBalanceChange(asset, borrowAmount, 'borrow', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: borrowAmount,\n asset,\n fee: 0,\n healthFactor: hf.healthFactor,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async repay(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<RepayResult> {\n this.enforcer.assertNotLocked();\n const allPositions = await this.registry.allPositions(this._address);\n const borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const b of pos.positions.borrows) {\n if (b.amount > 0.001) borrows.push({ protocolId: pos.protocolId, asset: b.asset, amount: b.amount, apy: b.apy });\n }\n }\n\n if (borrows.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No outstanding borrow to repay');\n }\n\n if (params.amount === 'all') {\n return this._repayAllBorrows(borrows);\n }\n\n // [v0.51.1] Filter by params.asset when supplied. Pre-v0.51.1 we always\n // sorted by APY and picked the highest-APY borrow regardless of asset —\n // which broke USDsui repayment because `target` could be any asset and\n // we'd then fetch USDC coins for it (type mismatch). When the caller\n // names an asset, only that asset's borrows are eligible.\n const eligible = params.asset\n ? borrows.filter((b) => b.asset === params.asset)\n : borrows;\n if (eligible.length === 0) {\n throw new T2000Error('NO_COLLATERAL', `No outstanding ${params.asset} borrow to repay`);\n }\n eligible.sort((a, b) => b.apy - a.apy);\n const target = eligible[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n const repayAmount = Math.min(params.amount, target.amount);\n // [v0.51.1] Resolve the borrowed asset's coin type instead of\n // hardcoding USDC. Repaying a USDsui debt with a USDC coin would fail\n // at NAVI (type mismatch) or worse, succeed against the wrong pool.\n const targetAssetInfo = SUPPORTED_ASSETS[target.asset as SupportedAsset]\n ?? SUPPORTED_ASSETS.USDC;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (adapter.addRepayToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const coins = await this._fetchCoins(targetAssetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${targetAssetInfo.displayName} coins`);\n const merged = this._mergeCoinsInTx(tx, coins);\n const raw = BigInt(Math.floor(repayAmount * 10 ** targetAssetInfo.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, target.asset);\n return tx;\n }\n\n const { tx } = await adapter.buildRepayTx(this._address, repayAmount, target.asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n // [v0.51.1] Emit the actual asset, not always 'USDC'. Subscribers\n // rely on this event to refresh balance UIs.\n this.emitBalanceChange(target.asset, repayAmount, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: repayAmount,\n asset: target.asset,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n private async _repayAllBorrows(borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }>): Promise<RepayResult> {\n borrows.sort((a, b) => b.apy - a.apy);\n\n const entries: Array<{ borrow: typeof borrows[0]; adapter: LendingAdapter }> = [];\n for (const borrow of borrows) {\n const adapter = this.registry.getLending(borrow.protocolId);\n if (adapter) entries.push({ borrow, adapter });\n }\n\n const canPTB = entries.every(e => e.adapter.addRepayToTx);\n let totalRepaid = 0;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n // [v0.51.1] Group borrows by asset; fetch + merge coins per asset.\n // Pre-v0.51.1 we fetched USDC coins once and tried to repay every\n // borrow (including USDsui) from the same merged USDC. That works\n // when every borrow happens to be USDC; it silently breaks the\n // moment USDsui (or any other allowed borrow asset) appears.\n const assetMerged = new Map<string, TransactionObjectArgument>();\n const uniqueAssets = Array.from(new Set(entries.map((e) => e.borrow.asset)));\n for (const asset of uniqueAssets) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n if (!info) throw new T2000Error('ASSET_NOT_SUPPORTED', `Cannot repay unknown asset: ${asset}`);\n const coins = await this._fetchCoins(info.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${info.displayName} coins for repayment`);\n assetMerged.set(asset, this._mergeCoinsInTx(tx, coins));\n }\n\n for (const { borrow, adapter } of entries) {\n const info = SUPPORTED_ASSETS[borrow.asset as SupportedAsset]!;\n const merged = assetMerged.get(borrow.asset)!;\n const raw = BigInt(Math.floor(borrow.amount * 10 ** info.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, borrow.asset);\n totalRepaid += borrow.amount;\n }\n\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const { borrow, adapter } of entries) {\n const { tx } = await adapter.buildRepayTx(this._address, borrow.amount, borrow.asset);\n lastTx = tx;\n totalRepaid += borrow.amount;\n }\n return lastTx!;\n });\n\n const firstAdapter = entries[0]?.adapter;\n const hf = firstAdapter ? await firstAdapter.getHealth(this._address) : { borrowed: 0 };\n // [v0.51.1] Mixed-asset repay-all emits a 'repay' event per dominant\n // asset (largest by amount). Single-asset case still fires correctly.\n const dominantAsset = entries\n .reduce((acc, e) => acc.amount >= e.borrow.amount ? acc : e.borrow, entries[0]?.borrow ?? { asset: 'USDC', amount: 0 })\n .asset;\n this.emitBalanceChange(dominantAsset, totalRepaid, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalRepaid,\n asset: dominantAsset,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async maxBorrow(): Promise<MaxBorrowResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'borrow');\n return adapter.maxBorrow(this._address, 'USDC');\n }\n\n async healthFactor(): Promise<HealthFactorResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const hf = await adapter.getHealth(this._address);\n\n if (hf.healthFactor < 1.2) {\n this.emit('healthCritical', { healthFactor: hf.healthFactor, threshold: 1.5, severity: 'critical' });\n } else if (hf.healthFactor < 2.0) {\n this.emit('healthWarning', { healthFactor: hf.healthFactor, threshold: 2.0, severity: 'warning' });\n }\n\n return hf;\n }\n\n // -- Claim Rewards --\n\n async getPendingRewards(): Promise<PendingReward[]> {\n const adapters = this.registry.listLending().filter((a) => a.getPendingRewards);\n if (adapters.length === 0) return [];\n\n const results = await Promise.allSettled(\n adapters.map((a) => a.getPendingRewards!(this._address)),\n );\n const all: PendingReward[] = [];\n const errors: unknown[] = [];\n for (const r of results) {\n if (r.status === 'fulfilled') all.push(...r.value);\n else errors.push(r.reason);\n }\n // [S18-F20] If every adapter failed and we have nothing to show,\n // propagate the first error so the engine tool can surface\n // \"NAVI degraded\" instead of narrating \"no pending rewards\"\n // (a false negative). Today there is only one claim-capable adapter\n // (NAVI), so this collapses to \"if NAVI threw, throw\"; the loop\n // shape preserves graceful partial degradation when a 2nd adapter\n // (e.g. Suilend) lands.\n if (all.length === 0 && errors.length === adapters.length) {\n const first = errors[0];\n throw first instanceof Error ? first : new Error(String(first));\n }\n return all;\n }\n\n async claimRewards(): Promise<ClaimRewardsResult> {\n this.enforcer.assertNotLocked();\n\n const adapters = this.registry.listLending().filter((a) => a.addClaimRewardsToTx);\n if (adapters.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0 };\n }\n\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const allRewards: PendingReward[] = [];\n const errors: unknown[] = [];\n for (const adapter of adapters) {\n try {\n const claimed = await adapter.addClaimRewardsToTx!(tx, this._address);\n allRewards.push(...claimed);\n } catch (err) {\n errors.push(err);\n }\n }\n\n // [S18-F20] Propagate degradation when every adapter failed AND we\n // have nothing to claim. See `getPendingRewards` for the full\n // rationale — silent skip here was a primary contributor to the\n // engine narrating \"no pending rewards\" during NAVI degradation.\n if (allRewards.length === 0 && errors.length === adapters.length) {\n const first = errors[0];\n throw first instanceof Error ? first : new Error(String(first));\n }\n\n if (allRewards.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0 };\n }\n\n const claimResult = await executeTx(this.client, this._signer, async () => tx);\n await this.client.waitForTransaction({ digest: claimResult.digest });\n\n const totalValueUsd = allRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n\n return {\n success: true,\n tx: claimResult.digest,\n rewards: allRewards,\n totalValueUsd,\n gasCost: claimResult.gasCostSui,\n };\n }\n\n /**\n * Claim pending rewards, swap non-USDC tokens to USDC via Cetus, and deposit into NAVI.\n * Multi-step: claim (transfers to wallet) -> swap each reward token to USDC -> deposit USDC.\n * Minimum threshold: skips if total rewards < $0.10 (gas not worth it).\n */\n async compoundRewards(options: { minValueUsd?: number } = {}): Promise<CompoundRewardsResult> {\n this.enforcer.assertNotLocked();\n const minValue = options.minValueUsd ?? 0.10;\n const USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\n const USDC_DEC = SUPPORTED_ASSETS.USDC.decimals;\n\n const pending = await this.getPendingRewards();\n const nonTrivial = pending.filter((r) => r.amount > 0);\n if (nonTrivial.length === 0) {\n return {\n success: true, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n const totalPendingUsd = pending.reduce((s, r) => s + r.estimatedValueUsd, 0);\n if (totalPendingUsd > 0 && totalPendingUsd < minValue) {\n return {\n success: true, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n // Snapshot USDC balance before compounding to scope deposit correctly\n const preUsdcCoins = await this._fetchCoins(USDC_TYPE);\n const preUsdcRaw = preUsdcCoins.reduce((s, c) => s + BigInt(c.balance), 0n);\n\n // Step 1: Claim — transfers reward tokens to wallet\n const claimResult = await this.claimRewards();\n if (!claimResult.tx) {\n return {\n success: false, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n // Step 2: Swap each non-USDC reward token to USDC via Cetus\n const { findSwapRoute, buildSwapTx } = await import('./protocols/cetus-swap.js');\n const swapTxs: string[] = [];\n let totalGasCost = claimResult.gasCost;\n\n for (const reward of nonTrivial) {\n if (!reward.coinType) continue;\n if (reward.coinType === USDC_TYPE) continue;\n\n try {\n const decimals = getDecimalsForCoinType(reward.coinType) ?? 9;\n const rawAmount = BigInt(Math.floor(reward.amount * 10 ** decimals));\n if (rawAmount <= 0n) continue;\n\n const coins = await this._fetchCoins(reward.coinType);\n if (coins.length === 0) continue;\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: reward.coinType,\n to: USDC_TYPE,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!route || route.insufficientLiquidity) continue;\n\n const swapResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const freshCoins = await this._fetchCoins(reward.coinType);\n if (freshCoins.length === 0) return tx;\n\n const merged = this._mergeCoinsInTx(tx, freshCoins);\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage: 0.01,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n swapTxs.push(swapResult.digest);\n totalGasCost += swapResult.gasCostSui;\n } catch (err) {\n console.warn(`[compound] Failed to swap ${reward.symbol}:`, err instanceof Error ? err.message : err);\n }\n }\n\n // Step 3: Deposit only the NEW USDC gained from compounding (not pre-existing balance)\n const postUsdcCoins = await this._fetchCoins(USDC_TYPE);\n const postUsdcRaw = postUsdcCoins.reduce((s, c) => s + BigInt(c.balance), 0n);\n const gainedRaw = postUsdcRaw > preUsdcRaw ? postUsdcRaw - preUsdcRaw : 0n;\n const depositUsdc = Number(gainedRaw) / 10 ** USDC_DEC;\n\n let depositTx = '';\n if (gainedRaw > 0n) {\n try {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const depositResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n const coins = await this._fetchCoins(USDC_TYPE);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins after swap');\n const merged = this._mergeCoinsInTx(tx, coins);\n const [inputCoin] = tx.splitCoins(merged, [gainedRaw]);\n await adapter.addSaveToTx!(tx, this._address, inputCoin, 'USDC');\n return tx;\n });\n depositTx = depositResult.digest;\n totalGasCost += depositResult.gasCostSui;\n } catch (err) {\n console.warn('[compound] NAVI deposit failed:', err instanceof Error ? err.message : err);\n }\n }\n\n const hasSubstantiveResult = swapTxs.length > 0 || depositTx !== '';\n return {\n success: hasSubstantiveResult,\n claimTx: claimResult.tx,\n swapTxs,\n depositTx,\n rewards: nonTrivial,\n totalCompoundedUsdc: depositUsdc,\n totalGasCost,\n };\n }\n\n // -- Info --\n\n async positions(): Promise<PositionsResult> {\n const allPositions = await this.registry.allPositions(this._address);\n const positions = allPositions.flatMap(p =>\n [\n ...p.positions.supplies\n .filter(s => s.amount > 0.005)\n .map(s => ({\n protocol: p.protocolId,\n asset: s.asset,\n type: 'save' as const,\n amount: s.amount,\n amountUsd: s.amountUsd,\n apy: s.apy,\n })),\n ...p.positions.borrows\n .filter(b => b.amount > 0.005)\n .map(b => ({\n protocol: p.protocolId,\n asset: b.asset,\n type: 'borrow' as const,\n amount: b.amount,\n amountUsd: b.amountUsd,\n apy: b.apy,\n })),\n ],\n );\n return { positions };\n }\n\n async rates(): Promise<RatesResult> {\n const allRatesResult = await this.registry.allRatesAcrossAssets();\n const result: RatesResult = {};\n for (const entry of allRatesResult) {\n if (!result[entry.asset] || entry.rates.saveApy > result[entry.asset].saveApy) {\n result[entry.asset] = { saveApy: entry.rates.saveApy, borrowApy: entry.rates.borrowApy };\n }\n }\n if (!result.USDC) result.USDC = { saveApy: 0, borrowApy: 0 };\n return result;\n }\n\n async allRates(asset = 'USDC') {\n return this.registry.allRates(asset);\n }\n\n async allRatesAcrossAssets() {\n return this.registry.allRatesAcrossAssets();\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this._address);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this._address);\n }\n\n // -- Helpers --\n\n private async resolveLending(protocol: string | undefined, asset: string, capability: 'save' | 'withdraw' | 'borrow' | 'repay'): Promise<LendingAdapter> {\n if (protocol) {\n const adapter = this.registry.getLending(protocol);\n if (!adapter) throw new T2000Error('ASSET_NOT_SUPPORTED', `Lending adapter '${protocol}' not found`);\n return adapter;\n }\n\n if (capability === 'save') {\n const { adapter } = await this.registry.bestSaveRate(asset);\n return adapter;\n }\n\n if (capability === 'borrow' || capability === 'repay') {\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) &&\n a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => a.name).join(', ');\n const altAssets = [...new Set(alternatives.flatMap(a => [...a.supportedAssets]))].join(', ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Available for ${capability}: ${altList} (assets: ${altAssets})`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) && a.capabilities.includes(capability),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => `${a.name} (${[...a.supportedAssets].join(', ')})`).join('; ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Try: ${altList}`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n private emitBalanceChange(asset: string, amount: number, cause: string, tx?: string): void {\n this.emit('balanceChange', { asset, previous: 0, current: 0, cause, tx });\n }\n}\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 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 { getCoinMeta } from '../token-registry.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\n/**\n * [Track B follow-up / 2026-05-08] Stateless wrapper around `getPendingRewards`\n * that creates its own `SuiJsonRpcClient`. Used by the engine's\n * `pending_rewards` tool — engine doesn't import `@mysten/sui` directly\n * (would expand its dep surface), so this helper accepts just `(address,\n * suiRpcUrl?)` and instantiates the client internally.\n *\n * **Why this exists.** Pre-fix the engine tool went through\n * `requireAgent(context).getPendingRewards()`, which threw\n * \"Tool requires a T2000 agent instance — pass `agent` in EngineConfig\"\n * in audric prod (audric uses sponsored-tx flow, never instantiates a\n * T2000 agent). Live mainnet smoke on funkii's wallet 2026-05-08 caught\n * this immediately when the LLM correctly called pending_rewards before\n * harvest_rewards. This helper makes the audric/CLI paths symmetric\n * (both work, neither requires an agent).\n *\n * Defaults `suiRpcUrl` to mainnet fullnode for CLI / standalone callers\n * that don't pass one. Errors propagate with the same `T2000Error`\n * shape as the underlying `getPendingRewards` (PROTOCOL_UNAVAILABLE on\n * NAVI degradation, etc.) so the engine tool's catch path is unchanged.\n */\nexport async function getPendingRewardsByAddress(\n address: string,\n suiRpcUrl?: string,\n): Promise<PendingReward[]> {\n const { SuiJsonRpcClient, getJsonRpcFullnodeUrl } = await import('@mysten/sui/jsonRpc');\n const client = new SuiJsonRpcClient({\n url: suiRpcUrl ?? getJsonRpcFullnodeUrl('mainnet'),\n network: 'mainnet',\n });\n return getPendingRewards(client, address);\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 // [S.118 follow-up — 2026-05-08]\n // Read from the same source as `addClaimRewardsToTx` (raw\n // `userClaimableReward`) and reuse the same aggregator\n // (`aggregateClaimableRewards`). Pre-fix this read iterated\n // `summaryLendingRewards(rewards).rewards.available` — a different NAVI\n // aggregation that produced row-structure AND per-coinType-total drift\n // vs the claim path (smoke on funkii's mainnet wallet showed 2 rows\n // here vs 1 row from `addClaimRewardsToTx`, with totals diverging by\n // ~1.36e-7 for the same vSUI cert across two NAVI pools). Routing both\n // through the same source + same aggregator removes the drift class\n // entirely and makes the contract test a true equality check (not\n // a tolerance-based one).\n const claimable = rewards.filter((r) => Number(r.userClaimableReward) > 0);\n return aggregateClaimableRewards(claimable);\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 // [S18-F20 follow-up] Resolve symbol via canonical registry first; falls\n // back to raw struct name only for unregistered coins. Mirrors the same\n // resolution in `getPendingRewards` so both readers narrate vSUI rewards\n // as \"vSUI\" instead of the raw \"CERT\" struct name.\n const meta = getCoinMeta(coinType);\n const symbol = meta?.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 { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, address);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n const totalYieldEarned = dailyEarning * 30;\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, address);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\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 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","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 // Deposit variants (entry_deposit / deposit + account-cap form for\n // harvest's internal save leg)\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::deposit_with_account_cap': 'save',\n // Withdraw variants\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::withdraw_with_account_cap': 'withdraw',\n 'incentive_v3::withdraw_with_account_cap_v': 'withdraw',\n 'incentive_v3::withdraw': 'withdraw',\n 'incentive_v3::withdraw_v': 'withdraw',\n // Borrow variants\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::borrow': 'borrow',\n 'incentive_v3::borrow_v': 'borrow',\n 'incentive_v3::borrow_with_account_cap': 'borrow',\n 'incentive_v3::borrow_with_account_cap_v': 'borrow',\n // Repay variants\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n 'incentive_v3::repay_with_account_cap': 'repay',\n // Claim-reward variants — required for `claim_rewards` tagging AND for\n // `harvest` compound-op detection in the indexer (paired with a save\n // target, classified as `harvest` instead of `claim`).\n 'incentive_v3::claim_reward': 'claim',\n 'incentive_v3::claim_reward_entry': 'claim',\n 'incentive_v3::claim_reward_with_account_cap': 'claim',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","export interface SafeguardConfig {\n locked: boolean;\n maxPerTx: number;\n maxDailySend: number;\n dailyUsed: number;\n dailyResetDate: string;\n maxLeverage?: number;\n maxPositionSize?: number;\n}\n\nexport interface TxMetadata {\n operation:\n | 'send'\n | 'save'\n | 'withdraw'\n | 'borrow'\n | 'repay'\n | 'pay';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n]);\n\nexport const DEFAULT_SAFEGUARD_CONFIG: SafeguardConfig = {\n locked: false,\n maxPerTx: 0,\n maxDailySend: 0,\n dailyUsed: 0,\n dailyResetDate: '',\n};\n","import { T2000Error } from '../errors.js';\n\nexport type SafeguardRule = 'locked' | 'maxPerTx' | 'maxDailySend';\n\nexport interface SafeguardErrorDetails {\n attempted?: number;\n limit?: number;\n current?: number;\n}\n\nexport class SafeguardError extends T2000Error {\n readonly rule: SafeguardRule;\n readonly details: SafeguardErrorDetails;\n\n constructor(rule: SafeguardRule, details: SafeguardErrorDetails, message?: string) {\n const msg = message ?? buildMessage(rule, details);\n super('SAFEGUARD_BLOCKED' as any, msg, { rule, ...details });\n this.name = 'SafeguardError';\n this.rule = rule;\n this.details = details;\n }\n\n override toJSON() {\n return {\n error: 'SAFEGUARD_BLOCKED' as const,\n message: this.message,\n retryable: this.retryable,\n data: { rule: this.rule, ...this.details },\n };\n }\n}\n\nfunction buildMessage(rule: SafeguardRule, details: SafeguardErrorDetails): string {\n switch (rule) {\n case 'locked':\n return 'Agent is locked. All operations are frozen.';\n case 'maxPerTx':\n return `Amount $${(details.attempted ?? 0).toFixed(2)} exceeds per-transaction limit ($${(details.limit ?? 0).toFixed(2)})`;\n case 'maxDailySend':\n return `Daily send limit reached ($${(details.current ?? 0).toFixed(2)}/$${(details.limit ?? 0).toFixed(2)} used today)`;\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SafeguardConfig, TxMetadata } from './types.js';\nimport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './types.js';\nimport { SafeguardError } from './errors.js';\n\nexport class SafeguardEnforcer {\n private config: SafeguardConfig;\n private readonly configPath: string | null;\n\n constructor(configDir?: string) {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n this.configPath = configDir ? join(configDir, 'config.json') : null;\n }\n\n load(): void {\n if (!this.configPath) return;\n try {\n const raw = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n this.config = {\n ...DEFAULT_SAFEGUARD_CONFIG,\n locked: raw.locked ?? false,\n maxPerTx: raw.maxPerTx ?? 0,\n maxDailySend: raw.maxDailySend ?? 0,\n dailyUsed: raw.dailyUsed ?? 0,\n dailyResetDate: raw.dailyResetDate ?? '',\n };\n } catch {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n }\n }\n\n assertNotLocked(): void {\n this.load();\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n }\n\n check(metadata: TxMetadata): void {\n this.load();\n\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n\n if (!OUTBOUND_OPS.has(metadata.operation)) return;\n\n const amount = metadata.amount ?? 0;\n\n if (this.config.maxPerTx > 0 && amount > this.config.maxPerTx) {\n throw new SafeguardError('maxPerTx', {\n attempted: amount,\n limit: this.config.maxPerTx,\n });\n }\n\n this.resetDailyIfNewDay();\n\n if (this.config.maxDailySend > 0 && this.config.dailyUsed + amount > this.config.maxDailySend) {\n throw new SafeguardError('maxDailySend', {\n attempted: amount,\n limit: this.config.maxDailySend,\n current: this.config.dailyUsed,\n });\n }\n }\n\n recordUsage(amount: number): void {\n this.resetDailyIfNewDay();\n this.config.dailyUsed += amount;\n this.save();\n }\n\n lock(): void {\n this.config.locked = true;\n this.save();\n }\n\n unlock(): void {\n this.config.locked = false;\n this.save();\n }\n\n set(key: string, value: unknown): void {\n if (key === 'locked' && typeof value === 'boolean') {\n this.config.locked = value;\n } else if (key === 'maxPerTx' && typeof value === 'number') {\n this.config.maxPerTx = value;\n } else if (key === 'maxDailySend' && typeof value === 'number') {\n this.config.maxDailySend = value;\n }\n this.save();\n }\n\n getConfig(): SafeguardConfig {\n this.load();\n this.resetDailyIfNewDay();\n return { ...this.config };\n }\n\n isConfigured(): boolean {\n return this.config.maxPerTx > 0 || this.config.maxDailySend > 0;\n }\n\n private resetDailyIfNewDay(): void {\n const today = new Date().toISOString().slice(0, 10);\n if (this.config.dailyResetDate !== today) {\n this.config.dailyUsed = 0;\n this.config.dailyResetDate = today;\n this.save();\n }\n }\n\n private save(): void {\n if (!this.configPath) return;\n try {\n let existing: Record<string, unknown> = {};\n try {\n existing = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n } catch {\n // no existing config\n }\n\n const merged = {\n ...existing,\n locked: this.config.locked,\n maxPerTx: this.config.maxPerTx,\n maxDailySend: this.config.maxDailySend,\n dailyUsed: this.config.dailyUsed,\n dailyResetDate: this.config.dailyResetDate,\n };\n\n const dir = this.configPath.replace(/[/\\\\][^/\\\\]+$/, '');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.configPath, JSON.stringify(merged, null, 2) + '\\n');\n } catch {\n // Best-effort persistence\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { validateAddress } from './utils/sui.js';\nimport { T2000Error } from './errors.js';\n\nexport interface Contact {\n name: string;\n address: string;\n}\n\nexport type ContactMap = Record<string, Contact>;\n\nconst RESERVED_NAMES = new Set(['to', 'all', 'address']);\n\nexport class ContactManager {\n private contacts: ContactMap = {};\n private readonly filePath: string;\n private readonly dir: string;\n\n constructor(configDir?: string) {\n this.dir = configDir ?? join(homedir(), '.t2000');\n this.filePath = join(this.dir, 'contacts.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.contacts = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.contacts = {};\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.contacts, null, 2));\n }\n\n add(name: string, address: string): { action: 'added' | 'updated' } {\n this.validateName(name);\n const normalized = validateAddress(address);\n const key = name.toLowerCase();\n const existed = key in this.contacts;\n this.contacts[key] = { name, address: normalized };\n this.save();\n return { action: existed ? 'updated' : 'added' };\n }\n\n remove(name: string): boolean {\n const key = name.toLowerCase();\n if (!(key in this.contacts)) return false;\n delete this.contacts[key];\n this.save();\n return true;\n }\n\n get(name: string): Contact | undefined {\n this.load();\n return this.contacts[name.toLowerCase()];\n }\n\n list(): Contact[] {\n this.load();\n return Object.values(this.contacts);\n }\n\n resolve(nameOrAddress: string): { address: string; contactName?: string } {\n this.load();\n\n if (nameOrAddress.startsWith('0x') && nameOrAddress.length >= 42) {\n return { address: validateAddress(nameOrAddress) };\n }\n\n const contact = this.contacts[nameOrAddress.toLowerCase()];\n if (contact) {\n return { address: contact.address, contactName: contact.name };\n }\n\n throw new T2000Error(\n 'CONTACT_NOT_FOUND',\n `\"${nameOrAddress}\" is not a valid Sui address or saved contact.\\n` +\n ` Add it: t2000 contacts add ${nameOrAddress} 0x...`,\n );\n }\n\n private validateName(name: string): void {\n if (name.startsWith('0x')) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names cannot start with 0x');\n }\n if (!/^[a-zA-Z0-9_]+$/.test(name)) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names can only contain letters, numbers, and underscores');\n }\n if (name.length > 32) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names must be 32 characters or fewer');\n }\n if (RESERVED_NAMES.has(name.toLowerCase())) {\n throw new T2000Error('INVALID_CONTACT_NAME', `\"${name}\" is a reserved name and cannot be used as a contact`);\n }\n }\n}\n","export { T2000 } from './t2000.js';\nexport type { TransactionSigner } from './signer.js';\nexport { KeypairSigner } from './wallet/keypairSigner.js';\nexport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nexport { ContactManager } from './contacts.js';\nexport { T2000Error, mapWalletError, mapMoveAbortCode } from './errors.js';\nexport type { T2000ErrorCode, T2000ErrorData } from './errors.js';\nexport type {\n T2000Options,\n BalanceResponse,\n GasReserve,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n AssetRates,\n RatesResult,\n PositionEntry,\n PositionsResult,\n EarningsResult,\n FundStatusResult,\n DepositInfo,\n PaymentRequest,\n TransactionRecord,\n PendingReward,\n ClaimRewardsResult,\n CompoundRewardsResult,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n FinancialSummary,\n HFAlertLevel,\n} from './types.js';\nexport {\n MIST_PER_SUI,\n SUI_DECIMALS,\n USDC_DECIMALS,\n BPS_DENOMINATOR,\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n T2000_OVERLAY_FEE_WALLET,\n SUPPORTED_ASSETS,\n CLOCK_ID,\n DEFAULT_NETWORK,\n} from './constants.js';\nexport type { SupportedAsset, StableAsset } from './constants.js';\nexport {\n STABLE_ASSETS,\n ALL_NAVI_ASSETS,\n GAS_RESERVE_MIN,\n CETUS_USDC_SUI_POOL,\n OPERATION_ASSETS,\n isAllowedAsset,\n assertAllowedAsset,\n} from './constants.js';\nexport type { Operation } from './constants.js';\nexport { validateAddress, truncateAddress, normalizeCoinType } from './utils/sui.js';\nexport {\n KNOWN_TARGETS,\n LABEL_PATTERNS,\n classifyAction,\n classifyLabel,\n fallbackLabel,\n refineLendingLabel,\n classifyTransaction,\n extractTransferDetails,\n} from './wallet/classify.js';\nexport type {\n ClassifyBalanceChange,\n ClassifyResult,\n ExtractedTransfer,\n TxDirection,\n} from './wallet/classify.js';\nexport {\n parseSuiRpcTx,\n extractTxSender,\n extractTxCommands,\n queryHistory,\n queryTransaction,\n} from './wallet/history.js';\nexport type { SuiRpcTxBlock } from './wallet/history.js';\nexport {\n mistToSui,\n suiToMist,\n usdcToRaw,\n rawToUsdc,\n stableToRaw,\n rawToStable,\n getDecimals,\n formatUsd,\n formatSui,\n formatAssetAmount,\n normalizeAsset,\n} from './utils/format.js';\nexport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nexport { buildSendTx, addSendToTx } from './wallet/send.js';\nexport {\n fetchAllCoins,\n selectAndSplitCoin,\n selectSuiCoin,\n} from './wallet/coinSelection.js';\nexport type { CoinPage, SelectAndSplitResult } from './wallet/coinSelection.js';\nexport {\n composeTx,\n deriveAllowedAddressesFromPtb,\n WRITE_APPENDER_REGISTRY,\n} from './composeTx.js';\nexport type {\n WriteToolName,\n WriteStep,\n ComposeTxOptions,\n ComposeTxResult,\n ComposeTxFeeHooks,\n ComposeTxFeeHookContext,\n AppenderContext,\n StepPreview,\n SaveDepositInput,\n WithdrawInput,\n BorrowInput,\n RepayDebtInput,\n SendTransferInput,\n SwapExecuteInput,\n ClaimRewardsInput,\n VoloStakeInput,\n VoloUnstakeInput,\n} from './composeTx.js';\nexport { calculateFee, addFeeTransfer } from './protocols/protocolFee.js';\nexport type { ProtocolFeeInfo, FeeOperation } from './protocols/protocolFee.js';\nexport {\n getFinancialSummary,\n HF_WARN_THRESHOLD,\n HF_CRITICAL_THRESHOLD,\n} from './protocols/financialSummary.js';\nexport type { FinancialSummaryOptions } from './protocols/financialSummary.js';\nexport { simulateTransaction, throwIfSimulationFailed } from './utils/simulate.js';\nexport type { SimulationResult } from './utils/simulate.js';\nexport {\n getRates,\n getPendingRewards,\n getPendingRewardsByAddress,\n addClaimRewardsToTx,\n buildClaimRewardsTx,\n aggregateClaimableRewards,\n} from './protocols/navi.js';\n// [Track B / 2026-05-08] Single-PTB compound flow: claim NAVI rewards,\n// swap each non-USDC reward to USDC inline (Cetus chain mode), deposit\n// the merged USDC into the NAVI USDC pool. ONE confirm card, atomic\n// settlement. Powers the engine's `harvest_rewards` tool and the\n// audric \"🌾 HARVEST\" chip.\nexport { buildHarvestRewardsTx } from './protocols/navi-harvest.js';\nexport type {\n HarvestPlan,\n HarvestSwapLeg,\n HarvestSkippedLeg,\n BuildHarvestRewardsTxOptions,\n} from './protocols/navi-harvest.js';\nexport { getSwapQuote } from './swap-quote.js';\nexport {\n findSwapRoute,\n buildSwapTx,\n addSwapToTx,\n OVERLAY_FEE_RATE,\n} from './protocols/cetus-swap.js';\nexport type { SwapRouteResult, OverlayFeeConfig } from './protocols/cetus-swap.js';\nexport {\n COIN_REGISTRY,\n TOKEN_MAP,\n resolveTokenType,\n resolveSymbol,\n getDecimalsForCoinType,\n getCoinMeta,\n isInRegistry,\n isTier1,\n isTier2,\n isSupported,\n getTier,\n SUI_TYPE,\n USDC_TYPE,\n USDT_TYPE,\n USDSUI_TYPE,\n USDE_TYPE,\n ETH_TYPE,\n WBTC_TYPE,\n WAL_TYPE,\n NAVX_TYPE,\n IKA_TYPE,\n LOFI_TYPE,\n MANIFEST_TYPE,\n} from './token-registry.js';\nexport type { CoinMeta } from './token-registry.js';\nexport {\n buildStakeVSuiTx,\n buildUnstakeVSuiTx,\n addStakeVSuiToTx,\n addUnstakeVSuiToTx,\n getVoloStats,\n VSUI_TYPE,\n VOLO_PKG,\n VOLO_POOL,\n VOLO_METADATA,\n} from './protocols/volo.js';\nexport type { VoloStats } from './protocols/volo.js';\nexport {\n AUDRIC_PARENT_NAME,\n AUDRIC_PARENT_NFT_ID,\n buildAddLeafTx,\n buildRevokeLeafTx,\n displayHandle,\n fullHandle,\n validateLabel,\n} from './protocols/suins-leaf.js';\nexport type {\n BuildAddLeafParams,\n BuildRevokeLeafParams,\n LabelValidationResult,\n} from './protocols/suins-leaf.js';\nexport * from './adapters/index.js';\nexport { SafeguardEnforcer, SafeguardError } from './safeguards/index.js';\nexport type { SafeguardConfig, TxMetadata, SafeguardRule, SafeguardErrorDetails } from './safeguards/index.js';\nexport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './safeguards/index.js';\n","/**\n * NAVI rewards harvest — single-PTB compound flow.\n *\n * **Goal.** Bundle the three-step \"claim → swap → save\" reward-cycling\n * routine into ONE atomic Programmable Transaction Block so the user\n * sees ONE confirm card instead of three sequential ones, and so the\n * legs settle together (or revert together — no half-claimed-but-\n * unsaved drift).\n *\n * **Flow.**\n * 1. Read pending rewards via NAVI's `getUserAvailableLendingRewards`\n * (same source as `getPendingRewards` + `addClaimRewardsToTx`, so\n * what the user sees in `pending_rewards` is exactly what gets\n * harvested — no drift).\n * 2. Append `claimLendingRewardsPTB(... { customCoinReceive: { type: 'skip' }})`\n * so the claimed coin handles are returned as `TransactionObjectArgument`\n * handles instead of being transferred to the wallet — they stay\n * consumable inside the same PTB.\n * 3. For each claimed handle:\n * • If the reward IS USDC, hold the handle for the deposit step.\n * • If the reward is in `COIN_REGISTRY` AND tradeable on Cetus\n * (any tier-2 token effectively), append `addSwapToTx` in chain\n * mode using the claimed coin as `inputCoin`. Collect the USDC\n * output handle.\n * • Else (untradeable / non-registry), transfer the claimed coin\n * back to the user's wallet — preserves the reward but skips\n * the auto-deposit (the user keeps it as a wallet asset).\n * 4. Merge all collected USDC handles via `tx.mergeCoins`, then deposit\n * via `addSaveToTx`.\n *\n * **Atomicity.** Single PTB = single transaction = single sponsored-gas\n * envelope. Either ALL legs settle (claim + swap(s) + deposit) or none\n * do. No partial-state recovery code needed.\n *\n * **Sponsored-gas posture.** This builder appends ONLY chained move\n * calls — no `tx.gas` reads, no Pyth fee writes, no oracle Pyth updates.\n * Cetus chain-mode swaps with `slippage` ≤ 5% don't require Pyth either\n * (Cetus aggregator routes around Pyth-dependent providers when callers\n * pass `providers: getProvidersExcluding(...)`). Audric's host wires\n * the provider exclusion automatically for Enoki sponsorship — see\n * `cetus-swap.ts` JSDoc.\n *\n * **Dust filter.** Rewards with `amount * priceCache.get(symbol) <\n * minRewardUsd` are skipped from the swap leg AND from the deposit —\n * not worth the gas to swap dust. They get transferred back to the\n * wallet (preserving on-chain truth: the claim happened, the swap\n * didn't). Default minRewardUsd = $0.01.\n *\n * **Failure modes.**\n * - PROTOCOL_UNAVAILABLE — NAVI rewards lookup or claim PTB build failed.\n * Engine surfaces \"NAVI is degraded right now.\"\n * - SWAP_NO_ROUTE — a reward asset has no Cetus route. Logged + that\n * leg is skipped (rewards transferred to wallet). Other legs proceed.\n * - INVALID_AMOUNT — rewards array empty after dust filter (nothing\n * worth harvesting). Throws so the engine narrates \"nothing to\n * harvest right now\" instead of building a no-op PTB.\n *\n * **Why a separate file (not inside `navi.ts`).** This composition\n * crosses two protocols (NAVI + Cetus) — keeping it out of `navi.ts`\n * preserves the single-protocol-per-file invariant the rest of the SDK\n * follows. Mirrors how `cetus-swap.ts` already lives separately even\n * though it composes through `composeTx.ts`.\n */\n\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { getUserAvailableLendingRewards, claimLendingRewardsPTB } from '@naviprotocol/lending';\nimport { T2000Error } from '../errors.js';\nimport { getCoinMeta, USDC_TYPE } from '../token-registry.js';\nimport { addSaveToTx, aggregateClaimableRewards } from './navi.js';\nimport { addSwapToTx, type OverlayFeeConfig } from './cetus-swap.js';\nimport type { PendingReward } from '../adapters/types.js';\n\n// -- types --------------------------------------------------------------\n\nexport interface HarvestSwapLeg {\n /** Reward symbol pre-swap (e.g. 'vSUI', 'NAVX'). */\n fromSymbol: string;\n /** Reward coinType pre-swap. */\n fromCoinType: string;\n /** Always 'USDC' — this builder only deposits to the USDC pool. */\n toSymbol: 'USDC';\n /** Display-units input amount (the entire claimed reward for that coin). */\n inputAmount: number;\n /** Display-units USDC the swap quote estimated. Actual on-chain may differ within slippage. */\n expectedOutputUsdc: number;\n}\n\nexport interface HarvestSkippedLeg {\n /** Reward symbol skipped (untradeable, dust, or no-route). */\n symbol: string;\n coinType: string;\n /** Display-units claimed amount (still credited to user's wallet — just not auto-deposited). */\n amount: number;\n /** 'untradeable' | 'dust' | 'no-route' */\n reason: 'untradeable' | 'dust' | 'no-route';\n}\n\nexport interface HarvestPlan {\n /** Every reward that WILL be claimed by this PTB. */\n claimed: PendingReward[];\n /** Each non-USDC reward that WILL be swapped to USDC inline. */\n swaps: HarvestSwapLeg[];\n /** Rewards claimed but transferred back to wallet (no auto-deposit). */\n skipped: HarvestSkippedLeg[];\n /** Display-units USDC that will be deposited to the NAVI USDC pool. */\n expectedUsdcDeposited: number;\n}\n\n/**\n * Callback invoked right before the harvest's internal `addSaveToTx`.\n * Mirrors the shape of `composeTx`'s `feeHooks.save_deposit` so audric's\n * existing hook can be threaded straight through without adapters. The\n * SDK never invents a fee — the host decides whether to skim from\n * `coin` and to where. See CLAUDE.md rule #9 (fees are a host concern).\n */\nexport type HarvestSaveFeeHook = (ctx: {\n tx: Transaction;\n coin: TransactionObjectArgument;\n input: { asset: 'USDC'; amount: number };\n sender: string;\n}) => void | Promise<void>;\n\nexport interface BuildHarvestRewardsTxOptions {\n /** Per-swap slippage tolerance (0.001–0.05). Defaults to 0.01 (1%). */\n slippage?: number;\n /**\n * USD floor for \"is this worth swapping?\". Rewards below this threshold\n * get transferred back to the wallet instead of swapped. Default $0.01.\n * Pass 0 to disable the filter (always swap; useful for tests).\n */\n minRewardUsd?: number;\n /**\n * Symbol → USD price map. Sourced from the engine's `ToolContext.priceCache`\n * in production; tests can pass a literal Map. When undefined, the dust\n * filter degrades to \"skip nothing\" (every reward is swapped) so we don't\n * accidentally drop large rewards just because we couldn't price them.\n */\n priceCache?: Map<string, number>;\n /**\n * Cetus provider allow-list. Sponsored callers (Enoki) pass\n * `getProvidersExcluding(['pyth-dependent-list'])` to keep the PTB\n * Pyth-free. Non-sponsored callers omit this.\n */\n providers?: string[];\n /**\n * [v1.24.2 fee wiring] Overlay fee forwarded to EACH internal\n * `addSwapToTx` call. When set, every swap leg charges the rate to\n * the receiver (typically `T2000_OVERLAY_FEE_WALLET` for audric).\n * Omit for fee-free harvests (CLI / direct SDK callers).\n */\n overlayFee?: OverlayFeeConfig;\n /**\n * [v1.24.2 fee wiring] Fired immediately before the internal\n * `addSaveToTx` consumes the merged USDC deposit coin. The hook\n * receives the deposit handle so it can split a fee off via\n * `addFeeTransfer(...)` (host's call). Audric threads its\n * `feeHooks.save_deposit` straight through here so a harvest's\n * deposit leg pays the same `SAVE_FEE_BPS` as a single-op `save`.\n *\n * Order is load-bearing: this hook fires AFTER all USDC handles\n * are merged into one and BEFORE the NAVI deposit consumes it.\n * Fee receiver gets recorded as a top-level transferObjects, so\n * it's automatically picked up by `derivedAllowedAddresses`.\n */\n saveFeeHook?: HarvestSaveFeeHook;\n}\n\n// -- builders -----------------------------------------------------------\n\n/**\n * Append the harvest legs (claim → swap(s) → save) to an EXISTING PTB.\n * Used by `composeTx`'s `harvest_rewards` registry appender so harvest\n * fits the same orchestration pattern as every other write tool.\n *\n * Standalone callers (CLI, smoke tests) should use `buildHarvestRewardsTx`\n * which wraps this with `tx.setSender(address)` and a fresh `Transaction`.\n */\nexport async function addHarvestToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options: BuildHarvestRewardsTxOptions = {},\n): Promise<HarvestPlan> {\n const slippage = options.slippage ?? 0.01;\n const minRewardUsd = options.minRewardUsd ?? 0.01;\n const priceCache = options.priceCache;\n\n // Step 1 — read pending rewards. Same source + same shape as\n // `getPendingRewards` so users see EXACTLY what they're about to harvest.\n let rawRewards;\n try {\n rawRewards = await getUserAvailableLendingRewards(address, {\n env: 'prod',\n client: client as never,\n markets: ['main'],\n });\n } catch (err) {\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-harvest-read' },\n true,\n );\n }\n\n const claimable = (rawRewards ?? []).filter((r) => Number(r.userClaimableReward) > 0);\n if (claimable.length === 0) {\n throw new T2000Error(\n 'INVALID_AMOUNT',\n 'No pending rewards to harvest.',\n { source: 'navi-harvest' },\n );\n }\n\n // Pre-aggregate so the plan + the claim PTB receive the SAME view —\n // mirrors `addClaimRewardsToTx`'s aggregation step. The PTB still gets\n // the raw `claimable` list (NAVI iterates per-pool internally); the\n // plan output uses the aggregated view (one row per coin, like the\n // `pending_rewards` tool surfaces).\n const aggregated = aggregateClaimableRewards(claimable);\n\n let claimed: Array<{ coin: TransactionObjectArgument; coinType: string }>;\n try {\n const claimResult = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n // 'skip' = NAVI doesn't auto-transfer; coin handles stay in the PTB\n // for downstream consumption. Verified against NAVI lending source\n // (index.esm.js@1828–1911) — when type !== 'transfer' && type !==\n // 'depositNAVI', the `else` branch pushes `{ coin, identifier, ... }`\n // to the return without consuming the handle.\n customCoinReceive: { type: 'skip' as const },\n });\n // NAVI's claim emits ONE entry per (asset, reward-type) row, NOT one\n // per claimable input row. Group by coin type to match the swap-plan\n // shape (one swap per coin type, regardless of how many pools it\n // came from).\n const grouped = new Map<string, TransactionObjectArgument[]>();\n for (const c of claimResult) {\n // c.identifier is a NAVI Pool — the suiCoinType field is the reward coin's full type.\n const ct = (c.identifier as { suiCoinType?: string }).suiCoinType ?? '';\n if (!ct) continue;\n const list = grouped.get(ct) ?? [];\n list.push(c.coin);\n grouped.set(ct, list);\n }\n // For each coin type, merge all NAVI-emitted handles into one (so\n // each coin type yields exactly ONE handle for swap/save chaining).\n claimed = [];\n for (const [coinType, handles] of grouped.entries()) {\n if (handles.length === 1) {\n claimed.push({ coin: handles[0], coinType });\n } else {\n // mergeCoins: tx.mergeCoins(destination, [sources...]) — destination\n // is the first; absorbs the rest; returns destination ref.\n const [dest, ...rest] = handles;\n tx.mergeCoins(dest, rest);\n claimed.push({ coin: dest, coinType });\n }\n }\n } catch (err) {\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-harvest-claim-ptb' },\n true,\n );\n }\n\n // Step 3 — classify each claimed coin: USDC (deposit-eligible), tradeable\n // (swap then deposit), or untradeable (transfer to wallet).\n const usdcHandles: TransactionObjectArgument[] = [];\n const swaps: HarvestSwapLeg[] = [];\n const skipped: HarvestSkippedLeg[] = [];\n\n // For computing expected USDC totals — sum claimed USDC + each swap quote.\n let expectedUsdcDeposited = 0;\n\n for (const { coin, coinType } of claimed) {\n const aggRow = aggregated.find((r) => r.coinType === coinType);\n if (!aggRow) {\n // Defensive — shouldn't happen since claimable feeds both paths.\n continue;\n }\n\n if (coinType === USDC_TYPE) {\n usdcHandles.push(coin);\n expectedUsdcDeposited += aggRow.amount;\n continue;\n }\n\n const meta = getCoinMeta(coinType);\n const isTradeable = meta && (meta.tier === 1 || meta.tier === 2);\n if (!isTradeable) {\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'untradeable',\n });\n continue;\n }\n\n // Dust filter — only when we have a price for the symbol.\n if (priceCache && minRewardUsd > 0) {\n const px = priceCache.get(aggRow.symbol.toUpperCase());\n if (px && px > 0 && aggRow.amount * px < minRewardUsd) {\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'dust',\n });\n continue;\n }\n }\n\n // Tradeable + above-dust — append swap leg in chain mode.\n try {\n const swapResult = await addSwapToTx(tx, client, address, {\n from: aggRow.symbol,\n to: 'USDC',\n amount: aggRow.amount,\n slippage,\n inputCoin: coin,\n providers: options.providers,\n overlayFee: options.overlayFee,\n });\n usdcHandles.push(swapResult.coin);\n expectedUsdcDeposited += swapResult.expectedAmountOut;\n swaps.push({\n fromSymbol: aggRow.symbol,\n fromCoinType: coinType,\n toSymbol: 'USDC',\n inputAmount: swapResult.effectiveAmountIn,\n expectedOutputUsdc: swapResult.expectedAmountOut,\n });\n } catch (err) {\n // SWAP_NO_ROUTE / SWAP_FAILED for this leg → transfer to wallet\n // and continue. Other reward legs still settle.\n const code = err instanceof T2000Error ? err.code : 'UNKNOWN';\n if (code !== 'SWAP_NO_ROUTE' && code !== 'SWAP_FAILED') {\n // Non-routing failure (e.g. provider down) — re-throw so the user\n // doesn't silently get a degraded harvest.\n throw err;\n }\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'no-route',\n });\n }\n }\n\n // Step 4 — merge USDC handles + deposit, OR no-op if nothing to deposit.\n if (usdcHandles.length > 0) {\n let depositCoin: TransactionObjectArgument;\n if (usdcHandles.length === 1) {\n depositCoin = usdcHandles[0];\n } else {\n const [primary, ...rest] = usdcHandles;\n tx.mergeCoins(primary, rest);\n depositCoin = primary;\n }\n // [v1.24.2 fee wiring] Skim the host's save fee BEFORE deposit\n // consumes the coin. Same ordering rule as the single-op `save`\n // path: feeHooks.save_deposit fires after the user's USDC is in\n // hand, before the NAVI deposit move call. `expectedUsdcDeposited`\n // is the pre-fee total (claimed USDC + each swap quote); the hook\n // skims a fraction of it and the NAVI deposit consumes the\n // remainder.\n if (options.saveFeeHook) {\n await options.saveFeeHook({\n tx,\n coin: depositCoin,\n input: { asset: 'USDC', amount: expectedUsdcDeposited },\n sender: address,\n });\n }\n try {\n await addSaveToTx(tx, client, address, depositCoin, { asset: 'USDC' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI deposit failed during harvest: ${msg}`,\n { source: 'navi-harvest-deposit' },\n true,\n );\n }\n }\n // If usdcHandles is empty, all rewards were skipped (untradeable / dust /\n // no-route) and transferred to the wallet — no deposit needed. The plan\n // returns expectedUsdcDeposited = 0, which the engine tool surfaces as\n // \"claimed X but nothing to deposit; rewards are in your wallet.\"\n\n return {\n claimed: aggregated,\n swaps,\n skipped,\n expectedUsdcDeposited,\n };\n}\n\n/**\n * Standalone harvest builder — creates a fresh PTB, sets the sender,\n * appends the full harvest flow, and returns both the tx and the plan.\n * Used by CLI / direct SDK callers (smoke tests, scripts). The audric\n * host goes through `composeTx({ steps: [{ toolName: 'harvest_rewards' }] })`\n * which wires the appender + Enoki sponsorship.\n */\nexport async function buildHarvestRewardsTx(\n client: SuiJsonRpcClient,\n address: string,\n options: BuildHarvestRewardsTxOptions = {},\n): Promise<{ tx: Transaction; plan: HarvestPlan }> {\n const tx = new Transaction();\n tx.setSender(address);\n const plan = await addHarvestToTx(tx, client, address, options);\n return { tx, plan };\n}\n\n","/**\n * SPEC 7 v0.4 § Layer 0 — Canonical Write Architecture.\n *\n * `composeTx({ steps })` is the single canonical entry-point for every\n * Audric Enoki-sponsored write. The fragment-appender pattern (Layer 1)\n * is the implementation; this primitive dispatches each step to its\n * registered appender from the typed `WRITE_APPENDER_REGISTRY`.\n *\n * Single-write and multi-write go through the same code path. A 1-step\n * `composeTx([{ toolName: 'send_transfer', input: {...} }])` produces\n * the same shape of result as a 3-step bundle.\n *\n * **Why this exists**\n *\n * Pre-Layer-0, four parallel write stacks lived across the audric host:\n * `transactions/prepare` (fat ~600-line route), `services/prepare`\n * (hand-rolled), `debug-swap` (diagnostic), and PayButton (dapp-kit).\n * Each one re-implemented merge/split/transfer + hand-maintained the\n * `allowedAddresses` array Enoki requires. Two production bugs in the\n * past 60 days came from drift between them — PR-H1 (claim-rewards\n * self-transfer missing from allowedAddresses) and PR-H4 (borrow/\n * withdraw self-transfer same bug).\n *\n * Layer 0 collapses 3 of those stacks into one canonical primitive.\n * PayButton stays out by design (different signer, different trust\n * model — see `audric-canonical-write.mdc` for the rationale and the\n * `// CANONICAL-BYPASS:` escape-hatch contract).\n *\n * **What composeTx owns**\n *\n * - PTB assembly via per-tool wallet-mode appenders (the\n * `WRITE_APPENDER_REGISTRY`).\n * - Pre-built `txKindBytes` (`tx.build({ onlyTransactionKind: true })`)\n * ready for Enoki's `createSponsoredTransaction`.\n * - Auto-derived `derivedAllowedAddresses` from the assembled PTB's\n * top-level `transferObjects` calls — eliminates the PR-H1/H4 bug\n * class permanently. Hand-maintained arrays are now unreachable.\n * - S.38 Pyth flag plumbing — `sponsoredContext: true` automatically\n * applies `skipPythUpdate` (borrow/withdraw) and `skipOracle` (repay)\n * to NAVI appenders so Enoki doesn't reject `tx.gas`-as-argument.\n *\n * **What composeTx does NOT own**\n *\n * - **Fees** — Audric concern, not @t2000/sdk concern (CLAUDE.md\n * rule #9). The SDK is fee-free by design as of @t2000/sdk@1.1.0\n * (B5 v2). Audric host wraps composeTx with fee insertion in P2.2c.\n * - **Sponsorship** — caller's job. composeTx returns `txKindBytes`\n * pre-built for Enoki; the caller calls `createSponsoredTransaction`\n * with their JWT.\n * - **Chain-mode coin handoff between steps** — Layer 2 (engine\n * bundling) ships this. P2.2b is wallet-mode-only: each step fetches\n * coins independently. Layer 2 will extend by introducing\n * `inputCoinFromStep: number` to thread upstream output coins.\n *\n * **Cross-references**\n *\n * - Spec → `spec/SPEC_7_MULTI_WRITE_PTB.md` § \"Layer 0: Canonical\n * Write Architecture\"\n * - Read-side companion → `t2000/.cursor/rules/single-source-of-truth.mdc`\n * + `audric/.cursor/rules/audric-canonical-portfolio.mdc`\n * - Write-side rule → `audric/.cursor/rules/audric-canonical-write.mdc`\n */\n\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n Transaction,\n type TransactionObjectArgument,\n} from '@mysten/sui/transactions';\nimport type { OverlayFeeConfig } from './protocols/cetus-swap.js';\nimport {\n addSaveToTx,\n addWithdrawToTx,\n addBorrowToTx,\n addRepayToTx,\n addClaimRewardsToTx,\n} from './protocols/navi.js';\nimport { addHarvestToTx } from './protocols/navi-harvest.js';\nimport type { PendingReward } from './adapters/types.js';\nimport { addSwapToTx, type SwapRouteResult } from './protocols/cetus-swap.js';\nimport {\n addStakeVSuiToTx,\n addUnstakeVSuiToTx,\n} from './protocols/volo.js';\nimport { addSendToTx } from './wallet/send.js';\nimport { selectAndSplitCoin, selectSuiCoin } from './wallet/coinSelection.js';\nimport { resolveTokenType, getDecimalsForCoinType, SUI_TYPE } from './token-registry.js';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from './constants.js';\nimport { T2000Error } from './errors.js';\nimport { validateAddress } from './utils/sui.js';\n\n/**\n * Canonical write tools. The 10 tools that can be composed into a PTB\n * (Track B 2026-05-08 added `harvest_rewards`).\n *\n * Excluded by design:\n * - `pay_api` — recipient/amount unknown at compose time; the on-chain\n * leg uses `send_transfer` after the gateway 402 challenge resolves.\n * - `save_contact` — no on-chain leg (Prisma-only).\n */\nexport type WriteToolName =\n | 'save_deposit'\n | 'withdraw'\n | 'borrow'\n | 'repay_debt'\n | 'send_transfer'\n | 'swap_execute'\n | 'claim_rewards'\n // [Track B / 2026-05-08] Compound: claim NAVI rewards → swap each non-USDC\n // reward to USDC inline → deposit into NAVI USDC pool. ONE confirm card.\n | 'harvest_rewards'\n | 'volo_stake'\n | 'volo_unstake';\n\n// Per-tool input contracts. Match the engine tool input schemas, not the\n// audric host's loosely-typed `params` blob — the registry is the typed\n// surface that lets the host shed the `any`-typed switch statement.\n\nexport interface SaveDepositInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface WithdrawInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface BorrowInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface RepayDebtInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface SendTransferInput {\n to: string;\n amount: number;\n asset?: SupportedAsset;\n}\n\nexport interface SwapExecuteInput {\n from: string;\n to: string;\n amount: number;\n slippage?: number;\n byAmountIn?: boolean;\n /** Cetus provider allow-list. Sponsored callers MUST pass an exclusion list\n * to remove Pyth-dependent providers — see addSwapToTx JSDoc. composeTx\n * derives this automatically from `sponsoredContext` if omitted. */\n providers?: string[];\n}\n\nexport type ClaimRewardsInput = Record<string, never>;\n\n/**\n * [Track B] `harvest_rewards` accepts only optional tunables — no required\n * inputs, since the user's choice is binary (\"harvest now\" or not). Default\n * slippage 1%, default dust floor $0.01. The audric host's HARVEST chip\n * passes literal `{}` and gets sensible defaults.\n */\nexport interface HarvestRewardsInput {\n /** Per-swap slippage tolerance (0.001–0.05). Default 0.01 (1%). */\n slippage?: number;\n /** USD floor for \"is this worth swapping?\" — dust below transfers to wallet. Default $0.01. */\n minRewardUsd?: number;\n}\n\nexport interface VoloStakeInput {\n amountSui: number;\n}\n\nexport interface VoloUnstakeInput {\n amountVSui: number | 'all';\n}\n\n/**\n * Discriminated union mapping `toolName` → `input`. Used to type\n * `WriteStep` so consumers get autocomplete + compile-time validation\n * that the input matches the tool.\n *\n * **[SPEC 13 Phase 1] `inputCoinFromStep`** — consumer steps may\n * reference an earlier step's output coin handle by index. When set,\n * `composeTx`'s orchestration loop threads the producer's\n * `outputCoin` into this step's appender as the `inputCoin` arg,\n * bypassing the wallet pre-fetch path. The producer's terminal\n * `tx.transferObjects([coin], sender)` is suppressed automatically so\n * the same handle isn't double-consumed.\n *\n * Producer-only tools (`withdraw`, `borrow`, `claim_rewards`) don't\n * accept the field — they have no input coin slot. Consumer +\n * dual-mode tools all accept it.\n */\nexport type WriteStep =\n | { toolName: 'save_deposit'; input: SaveDepositInput; inputCoinFromStep?: number }\n | { toolName: 'withdraw'; input: WithdrawInput }\n | { toolName: 'borrow'; input: BorrowInput }\n | { toolName: 'repay_debt'; input: RepayDebtInput; inputCoinFromStep?: number }\n | { toolName: 'send_transfer'; input: SendTransferInput; inputCoinFromStep?: number }\n | { toolName: 'swap_execute'; input: SwapExecuteInput; inputCoinFromStep?: number }\n | { toolName: 'claim_rewards'; input: ClaimRewardsInput }\n // Self-contained compound — internally claims, swaps, and deposits in\n // one PTB. Doesn't accept `inputCoinFromStep` because it's the only\n // step in the bundle (it's a \"macro\" appender, not a chainable producer\n // or consumer).\n | { toolName: 'harvest_rewards'; input: HarvestRewardsInput }\n | { toolName: 'volo_stake'; input: VoloStakeInput; inputCoinFromStep?: number }\n | { toolName: 'volo_unstake'; input: VoloUnstakeInput; inputCoinFromStep?: number };\n\nexport interface ComposeTxOptions {\n sender: string;\n steps: WriteStep[];\n client: SuiJsonRpcClient;\n /**\n * S.38 Pyth flag (sponsorship-critical). When true:\n * - NAVI borrow/withdraw appenders apply `skipPythUpdate: true`\n * (preserves on-chain price-feed updates, skips the tx.gas-using\n * Pyth fee payment that Enoki rejects).\n * - NAVI repay appender applies `skipOracle: true` (debt reduction\n * has no health-factor risk, full oracle bypass is safe).\n * - Cetus swap appender applies `getProvidersExcluding([HAEDALPMM,\n * METASTABLE, OBRIC, STEAMM_OMM, STEAMM_OMM_V2, SEVENK,\n * HAEDALHMMV2])` — Pyth-dependent providers reference `tx.gas` for\n * oracle fees, also rejected by Enoki.\n * - SUI sends fetch coins via `getCoins` (tx.gas belongs to sponsor,\n * not user) instead of splitting from `tx.gas`.\n *\n * Self-funded callers (CLI, MCP, server tasks) leave this `false` /\n * omit — they pay all oracle/Pyth fees from their own SUI gas.\n */\n sponsoredContext?: boolean;\n /**\n * Per-call overlay fee config for Cetus swaps. Audric host passes\n * `{ rate: 0.001, receiver: T2000_OVERLAY_FEE_WALLET }` to charge the\n * 0.1% swap overlay. CLI / direct SDK callers omit. Forwarded to\n * `addSwapToTx`'s `input.overlayFee`.\n */\n overlayFee?: OverlayFeeConfig;\n /**\n * Optional fee-injection hooks for save_deposit + borrow. Fires inside\n * the appender at the exact moment the user's coin is in hand and BEFORE\n * the protocol step consumes (save) or the canonical transferObjects\n * finalizes (borrow). Audric host uses this to inline `addFeeTransfer`\n * for USDC SAVE_FEE_BPS / BORROW_FEE_BPS without ever leaving the\n * canonical write contract — keeps the SDK fee-free per CLAUDE.md\n * rule #9 while letting hosts charge their own overlay fees.\n *\n * Hooks are fire-and-forget (no return value). They mutate `tx` directly\n * (e.g., `addFeeTransfer(tx, coin, ...)` splits the fee chunk off and\n * appends a top-level `transferObjects` to the host's fee wallet — that\n * recipient automatically appears in `derivedAllowedAddresses`).\n */\n feeHooks?: ComposeTxFeeHooks;\n}\n\n/**\n * Per-tool fee-injection callbacks. Each hook fires at a tool-specific\n * moment in the appender flow (see field JSDoc). Currently scoped to\n * the 2 fee-eligible tools — extend if/when new ones land.\n */\nexport interface ComposeTxFeeHooks {\n /**\n * Fires inside the `save_deposit` appender AFTER the user's USDC/USDsui\n * coin is split into the deposit amount, BEFORE NAVI's `deposit` move\n * call consumes the coin. Order matters: the `coin` reference passed in\n * is the SAME `TransactionObjectArgument` that flows into the deposit,\n * so any `splitCoins(coin, [feeAmount])` inside the hook reduces the\n * deposit by exactly that fee.\n */\n save_deposit?: (ctx: ComposeTxFeeHookContext<SaveDepositInput>) => void | Promise<void>;\n /**\n * Fires inside the `borrow` appender AFTER NAVI returns the borrowed\n * coin, BEFORE the canonical `transferObjects(coin, sender)` finalizes.\n * The `coin` reference is the borrowed-and-not-yet-transferred output;\n * splitting a fee here means the user receives the remainder.\n */\n borrow?: (ctx: ComposeTxFeeHookContext<BorrowInput>) => void | Promise<void>;\n}\n\n/**\n * Context object passed to every fee hook. Carries the `tx` (mutate it),\n * the in-flight `coin` (split fees off it), the resolved tool input\n * (asset/amount for fee-policy decisions), and the sender (rarely needed\n * but kept for symmetry with `AppenderContext`).\n */\nexport interface ComposeTxFeeHookContext<TInput> {\n tx: Transaction;\n coin: TransactionObjectArgument;\n input: TInput;\n sender: string;\n}\n\n/** Per-step preview returned by each registry appender. Tool-specific shape. */\nexport type StepPreview =\n | { toolName: 'save_deposit'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'withdraw'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'borrow'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'repay_debt'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'send_transfer'; effectiveAmount: number; recipient: string; asset: SupportedAsset }\n | { toolName: 'swap_execute'; effectiveAmountIn: number; expectedAmountOut: number; route: SwapRouteResult }\n | { toolName: 'claim_rewards'; rewards: PendingReward[] }\n // Compact: the audric host renders a multi-line \"Claim → Swap → Save\"\n // breakdown card from this preview (claimed[], swaps[], skipped[],\n // expectedUsdcDeposited). One signature, one settlement.\n | {\n toolName: 'harvest_rewards';\n claimed: PendingReward[];\n swaps: Array<{\n fromSymbol: string;\n fromCoinType: string;\n toSymbol: 'USDC';\n inputAmount: number;\n expectedOutputUsdc: number;\n }>;\n skipped: Array<{\n symbol: string;\n coinType: string;\n amount: number;\n reason: 'untradeable' | 'dust' | 'no-route';\n }>;\n expectedUsdcDeposited: number;\n }\n | { toolName: 'volo_stake'; effectiveAmountMist: bigint }\n | { toolName: 'volo_unstake'; effectiveAmountMist: bigint | 'all' };\n\nexport interface ComposeTxResult {\n tx: Transaction;\n /**\n * Pre-built bytes for Enoki's `createSponsoredTransaction`. Built\n * with `onlyTransactionKind: true` so the gas coin can be supplied\n * by the sponsor.\n */\n txKindBytes: Uint8Array;\n /**\n * Auto-derived from the assembled PTB's top-level `transferObjects`\n * commands. Replaces hand-maintained `allowedAddresses` arrays in\n * audric host's `transactions/prepare` + `services/prepare` —\n * eliminates the PR-H1/H4 bug class permanently.\n */\n derivedAllowedAddresses: string[];\n perStepPreviews: StepPreview[];\n}\n\n/**\n * Per-appender context passed into every registry entry. Carries the\n * RPC client, sender, sponsorship flag, optional per-call overlay\n * fee config (Cetus swaps), and SPEC 13 Phase 1 chain-mode fields.\n */\nexport interface AppenderContext {\n client: SuiJsonRpcClient;\n sender: string;\n sponsoredContext: boolean;\n overlayFee?: OverlayFeeConfig;\n feeHooks?: ComposeTxFeeHooks;\n /**\n * [SPEC 13 Phase 1] When set, the consumer appender consumes this\n * coin handle directly instead of pre-fetching from the wallet via\n * `selectAndSplitCoin` / `selectSuiCoin`. Provided by the\n * orchestration loop when the step has `inputCoinFromStep` set; the\n * loop looks up `priorOutputs[step.inputCoinFromStep]` and threads\n * it through here.\n *\n * In chain mode, the consumer consumes the handle IN FULL — the\n * `input.amount` field is treated as informational (used for preview\n * math). This matches Cetus's `routerSwap`, NAVI's `deposit`/`repay`,\n * and the Sui `transferObjects` semantics: each takes a coin object\n * and consumes its entire balance.\n */\n chainedCoin?: TransactionObjectArgument;\n /**\n * [SPEC 13 Phase 1] True when this step's output coin will be\n * consumed by a downstream step (some later step has\n * `inputCoinFromStep === currentStepIndex`). Producer appenders MUST\n * skip their terminal `tx.transferObjects([coin], ctx.sender)` call\n * when this is true — otherwise the same `TransactionObjectArgument`\n * gets used twice (once by the consumer, once by the transfer) and\n * the PTB build fails or the on-chain leg reverts.\n */\n isOutputConsumed?: boolean;\n}\n\n/**\n * [SPEC 13 Phase 1] Appender return shape. Producers populate\n * `outputCoin` so the orchestration loop can thread it into a\n * downstream consumer's `chainedCoin`. Terminal consumers\n * (`save_deposit`, `repay_debt`, `send_transfer`) omit it.\n *\n * `swap_execute`, `volo_stake`, and `volo_unstake` are dual-mode —\n * they accept `chainedCoin` AND populate `outputCoin`.\n */\nexport interface AppenderResult<TPreview extends StepPreview> {\n preview: TPreview;\n outputCoin?: TransactionObjectArgument;\n}\n\ntype AppenderFn<TInput, TPreview extends StepPreview> = (\n tx: Transaction,\n input: TInput,\n ctx: AppenderContext,\n) => Promise<AppenderResult<TPreview>>;\n\n/**\n * Cetus provider exclusion list for sponsored flows. Mirrors the\n * audric host's `SPONSORED_TX_PROVIDERS` constant — these 7 providers\n * reference `tx.gas` for Pyth oracle fee payments, which Enoki rejects.\n *\n * NOTE: keeping this hardcoded means `findSwapRoute` doesn't need a\n * dependency on `@cetusprotocol/aggregator-sdk`'s `getProvidersExcluding`\n * helper — composeTx forwards the literal list to Cetus, Cetus does the\n * inverse lookup. Result is identical.\n */\nconst SPONSORED_PYTH_DEPENDENT_PROVIDERS = [\n 'HAEDALPMM',\n 'METASTABLE',\n 'OBRIC',\n 'STEAMM_OMM',\n 'STEAMM_OMM_V2',\n 'SEVENK',\n 'HAEDALHMMV2',\n] as const;\n\n/**\n * Get all eligible Cetus provider names except the Pyth-dependent ones,\n * for sponsored swap context. Computed from the Cetus SDK's\n * `getAllProviders()` minus the exclusion list.\n */\nasync function getSponsoredSwapProviders(): Promise<string[]> {\n const { getProvidersExcluding } = await import('@cetusprotocol/aggregator-sdk');\n return getProvidersExcluding([...SPONSORED_PYTH_DEPENDENT_PROVIDERS]);\n}\n\n/** Resolve canonical asset symbol or throw `INVALID_ASSET`. */\nfunction resolveSaveableAsset(asset: 'USDC' | 'USDsui' | undefined): 'USDC' | 'USDsui' {\n if (!asset) return 'USDC';\n if (asset !== 'USDC' && asset !== 'USDsui') {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Saveable asset must be USDC or USDsui, got ${asset}`);\n }\n return asset;\n}\n\n/**\n * The typed registry. Each entry is a wallet-mode dispatcher that takes\n * (tx, input, ctx) and returns a per-step preview. Compile-time check\n * that all 10 `WriteToolName` values have an entry — TypeScript will\n * fail the build if a tool is missing.\n */\nexport const WRITE_APPENDER_REGISTRY: {\n save_deposit: AppenderFn<SaveDepositInput, Extract<StepPreview, { toolName: 'save_deposit' }>>;\n withdraw: AppenderFn<WithdrawInput, Extract<StepPreview, { toolName: 'withdraw' }>>;\n borrow: AppenderFn<BorrowInput, Extract<StepPreview, { toolName: 'borrow' }>>;\n repay_debt: AppenderFn<RepayDebtInput, Extract<StepPreview, { toolName: 'repay_debt' }>>;\n send_transfer: AppenderFn<SendTransferInput, Extract<StepPreview, { toolName: 'send_transfer' }>>;\n swap_execute: AppenderFn<SwapExecuteInput, Extract<StepPreview, { toolName: 'swap_execute' }>>;\n claim_rewards: AppenderFn<ClaimRewardsInput, Extract<StepPreview, { toolName: 'claim_rewards' }>>;\n harvest_rewards: AppenderFn<HarvestRewardsInput, Extract<StepPreview, { toolName: 'harvest_rewards' }>>;\n volo_stake: AppenderFn<VoloStakeInput, Extract<StepPreview, { toolName: 'volo_stake' }>>;\n volo_unstake: AppenderFn<VoloUnstakeInput, Extract<StepPreview, { toolName: 'volo_unstake' }>>;\n} = {\n save_deposit: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be greater than zero');\n }\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveAmount: bigint;\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveAmount = rawAmount;\n } else {\n const r = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = r.coin;\n effectiveAmount = r.effectiveAmount;\n }\n\n if (ctx.feeHooks?.save_deposit) {\n await ctx.feeHooks.save_deposit({ tx, coin, input, sender: ctx.sender });\n }\n await addSaveToTx(tx, ctx.client, ctx.sender, coin, { asset });\n return {\n preview: {\n toolName: 'save_deposit',\n effectiveAmount: Number(effectiveAmount) / 10 ** assetInfo.decimals,\n asset,\n },\n };\n },\n\n withdraw: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdraw amount must be greater than zero');\n }\n const { coin, effectiveAmount } = await addWithdrawToTx(\n tx, ctx.client, ctx.sender, input.amount,\n { asset, skipPythUpdate: ctx.sponsoredContext },\n );\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([coin], ctx.sender);\n }\n return {\n preview: { toolName: 'withdraw', effectiveAmount, asset },\n outputCoin: coin,\n };\n },\n\n borrow: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be greater than zero');\n }\n const coin = await addBorrowToTx(\n tx, ctx.client, ctx.sender, input.amount,\n { asset, skipPythUpdate: ctx.sponsoredContext },\n );\n if (ctx.feeHooks?.borrow) {\n await ctx.feeHooks.borrow({ tx, coin, input, sender: ctx.sender });\n }\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([coin], ctx.sender);\n }\n return {\n preview: { toolName: 'borrow', effectiveAmount: input.amount, asset },\n outputCoin: coin,\n };\n },\n\n repay_debt: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be greater than zero');\n }\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveAmount: bigint;\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveAmount = rawAmount;\n } else {\n const r = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = r.coin;\n effectiveAmount = r.effectiveAmount;\n }\n\n await addRepayToTx(tx, ctx.client, ctx.sender, coin, {\n asset,\n skipOracle: ctx.sponsoredContext,\n });\n return {\n preview: {\n toolName: 'repay_debt',\n effectiveAmount: Number(effectiveAmount) / 10 ** assetInfo.decimals,\n asset,\n },\n };\n },\n\n send_transfer: async (tx, input, ctx) => {\n const recipient = validateAddress(input.to);\n const asset: SupportedAsset = input.asset ?? 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (!assetInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Send amount must be greater than zero');\n }\n\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveRaw: bigint;\n\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveRaw = rawAmount;\n } else if (asset === 'SUI') {\n const result = await selectSuiCoin(tx, ctx.client, ctx.sender, rawAmount, ctx.sponsoredContext);\n coin = result.coin;\n effectiveRaw = result.effectiveAmount;\n } else {\n const result = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = result.coin;\n effectiveRaw = result.effectiveAmount;\n }\n\n addSendToTx(tx, coin, recipient);\n return {\n preview: {\n toolName: 'send_transfer',\n effectiveAmount: Number(effectiveRaw) / 10 ** assetInfo.decimals,\n recipient,\n asset,\n },\n };\n },\n\n swap_execute: async (tx, input, ctx) => {\n const fromType = resolveTokenType(input.from);\n const toType = resolveTokenType(input.to);\n if (!fromType || !toType) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `Unknown token in swap: from=${input.from}, to=${input.to}`,\n );\n }\n\n const providers = input.providers\n ?? (ctx.sponsoredContext ? await getSponsoredSwapProviders() : undefined);\n\n const result = await addSwapToTx(tx, ctx.client, ctx.sender, {\n from: input.from,\n to: input.to,\n amount: input.amount,\n slippage: input.slippage,\n byAmountIn: input.byAmountIn,\n overlayFee: ctx.overlayFee,\n providers,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: {\n toolName: 'swap_execute',\n effectiveAmountIn: result.effectiveAmountIn,\n expectedAmountOut: result.expectedAmountOut,\n route: result.route,\n },\n outputCoin: result.coin,\n };\n },\n\n claim_rewards: async (tx, _input, ctx) => {\n const rewards = await addClaimRewardsToTx(tx, ctx.client, ctx.sender);\n return { preview: { toolName: 'claim_rewards', rewards } };\n },\n\n // [Track B / 2026-05-08] Macro appender — assembles claim → swap(s) →\n // save inline. The audric host wires `getSponsoredSwapProviders()` into\n // `options.providers` automatically when `ctx.sponsoredContext === true`\n // (parity with `swap_execute` below). Slippage + dust-floor pulled from\n // the input; price cache is forwarded from the host so the dust filter\n // can compare claimed amounts to USD.\n harvest_rewards: async (tx, input, ctx) => {\n const providers = ctx.sponsoredContext ? await getSponsoredSwapProviders() : undefined;\n // [v1.24.2 fee wiring] Forward host fee config into the harvest macro\n // so each internal swap leg charges the overlay AND the deposit leg\n // skims the save fee. Without this, harvest_rewards bypassed both\n // mechanisms (live-prod regression observed 2026-05-08 — see S.120).\n // The save_deposit hook is reused as-is; the harvest macro calls it\n // with `input.asset === 'USDC'` and the merged USDC deposit coin,\n // matching what the audric host's hook already expects.\n const plan = await addHarvestToTx(tx, ctx.client, ctx.sender, {\n slippage: input.slippage,\n minRewardUsd: input.minRewardUsd,\n providers,\n overlayFee: ctx.overlayFee,\n saveFeeHook: ctx.feeHooks?.save_deposit,\n });\n return {\n preview: {\n toolName: 'harvest_rewards',\n claimed: plan.claimed,\n swaps: plan.swaps,\n skipped: plan.skipped,\n expectedUsdcDeposited: plan.expectedUsdcDeposited,\n },\n };\n },\n\n volo_stake: async (tx, input, ctx) => {\n if (input.amountSui <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Stake amount must be greater than zero');\n }\n const amountMist = BigInt(Math.floor(input.amountSui * 1e9));\n const result = await addStakeVSuiToTx(tx, ctx.client, ctx.sender, {\n amountMist,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: { toolName: 'volo_stake', effectiveAmountMist: result.effectiveAmountMist },\n outputCoin: result.coin,\n };\n },\n\n volo_unstake: async (tx, input, ctx) => {\n const amountMist =\n input.amountVSui === 'all' ? 'all' : BigInt(Math.floor(input.amountVSui * 1e9));\n if (amountMist !== 'all' && amountMist <= 0n) {\n throw new T2000Error('INVALID_AMOUNT', 'Unstake amount must be greater than zero');\n }\n const result = await addUnstakeVSuiToTx(tx, ctx.client, ctx.sender, {\n amountMist,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: { toolName: 'volo_unstake', effectiveAmountMist: result.effectiveAmountMist },\n outputCoin: result.coin,\n };\n },\n};\n\n// Reference unused import to suppress noUnusedLocals; SUI_TYPE is used\n// by selectSuiCoin internally and re-export from index.ts.\nvoid SUI_TYPE;\nvoid getDecimalsForCoinType;\n\n/**\n * Walks the assembled PTB's command list and extracts every recipient\n * address from top-level `TransferObjects` commands. Top-level only —\n * recipients inside nested Move calls are NOT inspected (Enoki only\n * cross-checks top-level commands).\n *\n * Replaces hand-maintained `allowedAddresses` arrays. Two production\n * bugs in 60 days came from drift between the array and the actual\n * PTB recipients (PR-H1 + PR-H4). Computing this from the PTB makes\n * drift impossible by construction.\n */\nexport function deriveAllowedAddressesFromPtb(tx: Transaction): string[] {\n const addresses = new Set<string>();\n const data = tx.getData();\n\n for (const cmd of data.commands) {\n // The Sui transaction-builder stores each top-level command as a\n // tagged object: { TransferObjects: { objects, address } }.\n // Inspect the `TransferObjects.address` field — it's a typed input\n // reference that resolves to a literal `Pure` input holding the\n // recipient bytes.\n const transferCmd = (cmd as { TransferObjects?: unknown }).TransferObjects;\n if (!transferCmd) continue;\n\n const addressArg = (transferCmd as { address?: unknown }).address;\n if (!addressArg) continue;\n\n const addressInputIndex = (addressArg as { Input?: number }).Input;\n if (addressInputIndex === undefined) continue;\n\n const input = data.inputs[addressInputIndex];\n if (!input) continue;\n\n const pureBytes = (input as { Pure?: { bytes?: string } }).Pure?.bytes;\n if (!pureBytes) continue;\n\n // Pure bytes are base64-encoded BCS for Sui addresses (32 bytes →\n // 44-char base64). Decode + format as 0x-prefixed hex.\n try {\n const bytes = base64ToBytes(pureBytes);\n if (bytes.length !== 32) continue; // not an address\n const hex = '0x' + Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n addresses.add(hex);\n } catch {\n // not a parseable address — skip\n }\n }\n\n return Array.from(addresses);\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof Buffer !== 'undefined') {\n return Uint8Array.from(Buffer.from(b64, 'base64'));\n }\n // Browser fallback (in case this ever runs in a worker)\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/**\n * Compose a PTB from a list of canonical write steps. Each step\n * dispatches to its registered fragment-appender; the assembled PTB is\n * returned alongside pre-built `txKindBytes` ready for Enoki sponsorship\n * + auto-derived `derivedAllowedAddresses`.\n *\n * Single-step: `composeTx({ steps: [{ toolName: 'send_transfer', input: {...} }], ... })`\n * Multi-step (Layer 2): `composeTx({ steps: [{...}, {...}, {...}], ... })`\n *\n * Throws:\n * - `T2000Error('NO_APPENDER')` — unknown `toolName`\n * - Any error thrown by the per-step appender (insufficient balance,\n * asset not supported, route not found, etc.) — propagates as-is.\n */\nexport async function composeTx(opts: ComposeTxOptions): Promise<ComposeTxResult> {\n const tx = new Transaction();\n tx.setSender(opts.sender);\n\n const baseCtx = {\n client: opts.client,\n sender: opts.sender,\n sponsoredContext: opts.sponsoredContext ?? false,\n overlayFee: opts.overlayFee,\n feeHooks: opts.feeHooks,\n };\n\n // [SPEC 13 Phase 1] First pass: validate every `inputCoinFromStep`\n // reference and build the `consumedSteps` set. Forward-only\n // references; producer-only tools can't be consumers.\n const consumedSteps = new Set<number>();\n for (let i = 0; i < opts.steps.length; i++) {\n const step = opts.steps[i];\n const stepWithChain = step as { inputCoinFromStep?: number };\n const idx = stepWithChain.inputCoinFromStep;\n if (idx === undefined) continue;\n\n if (!Number.isInteger(idx) || idx < 0 || idx >= i) {\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) has inputCoinFromStep=${idx}, ` +\n `which must be a non-negative integer < ${i} (forward-only references).`,\n );\n }\n\n const producer = opts.steps[idx];\n if (\n producer.toolName === 'save_deposit' ||\n producer.toolName === 'repay_debt' ||\n producer.toolName === 'send_transfer' ||\n producer.toolName === 'claim_rewards'\n ) {\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) references step ${idx} (${producer.toolName}) as ` +\n `producer, but '${producer.toolName}' is a terminal consumer that does not ` +\n `produce a chainable coin handle. Allowed producers: withdraw, borrow, ` +\n `swap_execute, volo_stake, volo_unstake.`,\n );\n }\n\n consumedSteps.add(idx);\n }\n\n // [SPEC 13 Phase 1] Second pass: dispatch each step in order,\n // capturing producers' output handles in `priorOutputs` and threading\n // them into consumers' `chainedCoin`.\n const priorOutputs: (TransactionObjectArgument | null)[] = [];\n const previews: StepPreview[] = [];\n for (let i = 0; i < opts.steps.length; i++) {\n const step = opts.steps[i];\n const appender = (WRITE_APPENDER_REGISTRY as Record<string, AppenderFn<unknown, StepPreview>>)[step.toolName];\n if (!appender) {\n throw new T2000Error(\n 'UNKNOWN',\n `No fragment appender registered for tool '${step.toolName}'. ` +\n `Allowed: ${(Object.keys(WRITE_APPENDER_REGISTRY) as WriteToolName[]).join(', ')}`,\n );\n }\n\n const stepWithChain = step as { inputCoinFromStep?: number };\n let chainedCoin: TransactionObjectArgument | undefined;\n if (stepWithChain.inputCoinFromStep !== undefined) {\n const upstream = priorOutputs[stepWithChain.inputCoinFromStep];\n if (!upstream) {\n // Producer didn't return an outputCoin (shouldn't happen given the\n // first-pass guard, but defends against future appender bugs).\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) expected a coin handle from step ` +\n `${stepWithChain.inputCoinFromStep}, but the producer did not return one.`,\n );\n }\n chainedCoin = upstream;\n }\n\n const stepCtx: AppenderContext = {\n ...baseCtx,\n chainedCoin,\n isOutputConsumed: consumedSteps.has(i),\n };\n\n const result = await appender(tx, step.input, stepCtx);\n priorOutputs.push(result.outputCoin ?? null);\n previews.push(result.preview);\n }\n\n const txKindBytes = await tx.build({ client: opts.client, onlyTransactionKind: true });\n const derivedAllowedAddresses = deriveAllowedAddressesFromPtb(tx);\n\n return {\n tx,\n txKindBytes,\n derivedAllowedAddresses,\n perStepPreviews: previews,\n };\n}\n","/**\n * Protocol fee primitives — wallet-direct transfer model.\n *\n * Fees are collected by splitting from the payment coin and transferring directly\n * to the treasury wallet inside the same PTB. Atomic with the operation (PTB\n * semantics); the wallet IS the ledger; the server-side indexer reads\n * `balanceChanges` and writes a `ProtocolFeeLedger` row tagged with the operation\n * classified from the tx's moveCall targets.\n *\n * The SDK / CLI never call this helper — they're fee-free by design (t2000 = infra\n * brand, no opinion on fees). Audric's `prepare/route.ts` is the canonical caller.\n */\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n USDC_DECIMALS,\n} from '../constants.js';\nimport { stableToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'borrow' | 'swap';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n // Swap uses Cetus's overlay-fee mechanism (taken from output by the aggregator\n // and transferred to `overlayFee.receiver`). We list the rate here for display\n // / quote calculations only — `addFeeTransfer` is NOT called for swaps.\n swap: 10n, // 0.1%\n};\n\n/**\n * Compute the fee amount for a given operation against a USD-denominated input.\n * Used pre-tx for receipt display + quote math. Does not modify any tx.\n */\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = stableToRaw(feeAmount, USDC_DECIMALS);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Split a fee from `paymentCoin` and transfer it to `receiver` inside the given PTB.\n *\n * **Order is load-bearing.** Call this BEFORE the protocol operation that consumes\n * `paymentCoin` (e.g. NAVI deposit). `splitCoins` mutates the source coin in place,\n * leaving the remainder for the protocol step. If you split AFTER the deposit,\n * the deposit will have consumed the coin and the split will fail.\n *\n * Atomicity: `splitCoins` + `transferObjects` are PTB ops; if anything later in\n * the PTB reverts, the fee transfer reverts too.\n *\n * @param tx Active PTB\n * @param paymentCoin Coin to split the fee from (mutated in place)\n * @param feeBps Fee rate in basis points (e.g. `SAVE_FEE_BPS = 10n` = 0.1%)\n * @param receiver Treasury wallet address (typically `T2000_OVERLAY_FEE_WALLET`)\n * @param amount Display-units input amount (matches what was passed to the\n * protocol operation; used to compute the raw fee amount)\n * @param decimals Coin decimals for raw conversion. Defaults to USDC_DECIMALS\n * (6). Pass the actual coin decimals when skimming a fee\n * from a non-USDC coin (e.g. USDsui = 6, GOLD = 6, ETH = 8,\n * SUI = 9). Backward-compatible: existing USDC callers can\n * omit. Wrong decimals → wrong raw amount → either fee\n * too small (silent loss) or too large (PTB revert from\n * insufficient coin balance).\n */\nexport function addFeeTransfer(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n feeBps: bigint,\n receiver: string,\n amount: number,\n decimals: number = USDC_DECIMALS,\n): void {\n if (feeBps <= 0n) return;\n if (amount <= 0) return;\n\n const feeAmount = amount * Number(feeBps) / Number(BPS_DENOMINATOR);\n const rawFee = stableToRaw(feeAmount, decimals);\n if (rawFee <= 0n) return;\n\n const [feeCoin] = tx.splitCoins(paymentCoin, [tx.pure.u64(rawFee)]);\n tx.transferObjects([feeCoin], tx.pure.address(receiver));\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { FinancialSummary, HFAlertLevel, HealthFactorResult } from '../types.js';\nimport { getHealthFactor, getRates } from './navi.js';\n\nconst HF_WARN_THRESHOLD = 1.8;\nconst HF_CRITICAL_THRESHOLD = 1.3;\n\nconst HF_FALLBACK: HealthFactorResult = {\n healthFactor: Infinity,\n supplied: 0,\n borrowed: 0,\n maxBorrow: 0,\n liquidationThreshold: 0.75,\n};\n\nfunction classifyHF(hf: number, hasBorrow: boolean): HFAlertLevel {\n if (!hasBorrow || !Number.isFinite(hf)) return 'none';\n if (hf <= HF_CRITICAL_THRESHOLD) return 'critical';\n if (hf <= HF_WARN_THRESHOLD) return 'warn';\n return 'none';\n}\n\nasync function fetchSuiPriceUsd(client: SuiJsonRpcClient): Promise<number> {\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const sqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n if (sqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtFloat = Number(sqrtPrice) / Number(Q64);\n const price = 1000 / (sqrtFloat * sqrtFloat);\n if (price > 0.01 && price < 1000) return price;\n }\n }\n } catch { /* fallback */ }\n return 1.0;\n}\n\n// Reserved for future per-call options. Keeping the shape stable avoids a\n// breaking-change for callers that pass `{}` defensively. Using a type alias\n// (not `interface {}`) so eslint's no-empty-object-type rule is happy.\nexport type FinancialSummaryOptions = Record<string, never>;\n\n/**\n * Fetch a complete financial snapshot for one wallet in parallel.\n * Designed for the indexer HF hook + chain-memory cron.\n *\n * Every sub-call has a fallback so a single RPC failure doesn't\n * crash the entire batch. Callers can check individual zero values\n * to detect degraded data.\n */\nexport async function getFinancialSummary(\n client: SuiJsonRpcClient,\n walletAddress: string,\n _options: FinancialSummaryOptions = {},\n): Promise<FinancialSummary> {\n const [usdcBal, suiBal, hf, rates, suiPrice] = await Promise.all([\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.USDC.type })\n .catch(() => ({ totalBalance: '0' })),\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.SUI.type })\n .catch(() => ({ totalBalance: '0' })),\n getHealthFactor(client, walletAddress)\n .catch(() => HF_FALLBACK),\n getRates(client),\n fetchSuiPriceUsd(client),\n ]);\n\n const usdcAvailable = Number(usdcBal.totalBalance) / 10 ** SUPPORTED_ASSETS.USDC.decimals;\n const gasReserveSui = Number(suiBal.totalBalance) / Number(MIST_PER_SUI);\n const saveApy = rates.USDC?.saveApy ?? 0;\n const borrowApy = rates.USDC?.borrowApy ?? 0;\n const dailyYield = hf.supplied * (saveApy / 365);\n\n return {\n walletAddress,\n usdcAvailable,\n savingsBalance: hf.supplied,\n debtBalance: hf.borrowed,\n idleUsdc: Math.max(0, usdcAvailable),\n healthFactor: hf.healthFactor,\n hfAlertLevel: classifyHF(hf.healthFactor, hf.borrowed > 0),\n saveApy,\n borrowApy,\n dailyYield,\n gasReserveSui,\n gasReserveUsd: gasReserveSui * suiPrice,\n fetchedAt: Date.now(),\n };\n}\n\nexport { HF_WARN_THRESHOLD, HF_CRITICAL_THRESHOLD };\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\nimport { mapMoveAbortCode } from '../errors.js';\n\nexport interface SimulationResult {\n success: boolean;\n gasEstimateSui: number;\n error?: {\n moveAbortCode?: number;\n moveModule?: string;\n reason: string;\n rawError: string;\n };\n}\n\nexport async function simulateTransaction(\n client: SuiJsonRpcClient,\n tx: Transaction,\n sender: string,\n): Promise<SimulationResult> {\n tx.setSender(sender);\n\n try {\n const txBytes = await tx.build({ client });\n const dryRun = await client.dryRunTransactionBlock({\n transactionBlock: Buffer.from(txBytes).toString('base64'),\n });\n\n const status = dryRun.effects?.status;\n const gasUsed = dryRun.effects?.gasUsed;\n\n const gasEstimateSui = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) / 1e9\n : 0;\n\n if (status?.status === 'failure') {\n const rawError = status.error ?? 'Unknown simulation error';\n const parsed = parseMoveAbort(rawError);\n\n return {\n success: false,\n gasEstimateSui,\n error: {\n moveAbortCode: parsed.abortCode,\n moveModule: parsed.module,\n reason: parsed.reason,\n rawError,\n },\n };\n }\n\n return { success: true, gasEstimateSui };\n } catch (err) {\n const rawError = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n gasEstimateSui: 0,\n error: {\n reason: 'Simulation failed: ' + rawError,\n rawError,\n },\n };\n }\n}\n\nexport function throwIfSimulationFailed(sim: SimulationResult): void {\n if (sim.success) return;\n\n throw new T2000Error(\n 'SIMULATION_FAILED',\n sim.error?.reason ?? 'Transaction simulation failed',\n {\n moveAbortCode: sim.error?.moveAbortCode,\n moveModule: sim.error?.moveModule,\n reason: sim.error?.reason,\n rawError: sim.error?.rawError,\n },\n );\n}\n\nfunction parseMoveAbort(errorStr: string): {\n abortCode?: number;\n module?: string;\n reason: string;\n} {\n // Pattern: MoveAbort(MoveLocation { module: ModuleId { ... name: \"module\" }, ... }, code)\n const abortMatch = errorStr.match(/MoveAbort\\([^,]*,\\s*(\\d+)\\)/);\n const moduleMatch = errorStr.match(/name:\\s*Identifier\\(\"([^\"]+)\"\\)/);\n\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n const module = moduleMatch?.[1];\n const reason = mapMoveAbortCode(code);\n return { abortCode: code, module, reason };\n }\n\n // Pattern: MovePrimitiveRuntimeError\n if (errorStr.includes('MovePrimitiveRuntimeError')) {\n const module = moduleMatch?.[1];\n return {\n module,\n reason: `Move runtime error in ${module ?? 'unknown'} module`,\n };\n }\n\n return { reason: errorStr };\n}\n","/**\n * Standalone swap quote — no T2000 agent instance required.\n * Only needs a wallet address for Cetus Aggregator routing.\n */\nimport { T2000Error } from './errors.js';\nimport { getDecimalsForCoinType } from './token-registry.js';\nimport type { SwapQuoteResult } from './types.js';\n\nexport async function getSwapQuote(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n}): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n // [S.123 v1.24.7] Use T2000Error('ASSET_NOT_SUPPORTED') consistently with the\n // other 4 throw sites in t2000.ts / cetus-swap.ts. Allows tools to branch\n // on `err.code === 'ASSET_NOT_SUPPORTED'` and return a structured recovery\n // hint to the LLM instead of re-throwing a generic error string.\n if (!fromType) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `Unknown token: ${params.from}. Provide the symbol (USDC, SUI, ...) or full coin type.`,\n );\n }\n if (!toType) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `Unknown token: ${params.to}. Provide the symbol (USDC, SUI, ...) or full coin type.`,\n );\n }\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: params.walletAddress,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_FAILED', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) {\n throw new T2000Error('SWAP_FAILED', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n }\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p: { provider?: string }) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n}\n","/**\n * SuiNS leaf-subname builders for the `audric.sui` parent NFT.\n *\n * Used by SPEC 10 v0.2.1 Phase A.1 — Audric Passport Identity. Lets the audric host\n * mint and revoke `username.audric.sui` leaves under the parent NFT held by the\n * dedicated custody address (`0xaca29165…23d11`).\n *\n * **Why a dedicated SDK module (not inline in the audric route):**\n * - Consumers (audric/web's `/api/identity/{reserve,change,release}` routes) can import\n * the canonical builder shape without re-discovering the `SuinsTransaction` API.\n * - Single source of truth for the parent NFT ID + parent name.\n * - Single source of truth for label validation (length / charset / hyphen rules).\n *\n * **Signer model — read this before wiring into a route:**\n * These builders are signed by the **service account** (the parent NFT custody address),\n * NOT by the user's zkLogin key. Per `audric/.cursor/rules/audric-canonical-write.mdc`,\n * the SPEC 10 leaf-mint API routes are explicitly documented as a CANONICAL-BYPASS of\n * the `composeTx` write contract — they are server-to-server, the user's key is never\n * in the loop, and Enoki sponsors the gas. PTB atomicity requires single-signer, so\n * leaf mints cannot be bundled with chat-agent writes via composeTx.\n *\n * **Reference:** `spec/runbooks/RUNBOOK_audric_sui_parent.md` §1 (parent NFT ID) +\n * §3 (validated SDK reference shape) + §4 (mainnet smoke test 2026-05-01).\n */\n\nimport { Transaction } from '@mysten/sui/transactions';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { SuinsTransaction, type SuinsClient } from '@mysten/suins';\n\n/**\n * Parent name registered on SuiNS mainnet. Audric's identity namespace anchor.\n *\n * Every leaf created via `buildAddLeafTx` becomes `<label>.audric.sui` and resolves\n * via the standard SuiNS resolver (`suix_resolveNameServiceAddress`).\n */\nexport const AUDRIC_PARENT_NAME = 'audric.sui';\n\n/**\n * On-chain object ID of the `audric.sui` parent NFT (a `SuinsRegistration`).\n *\n * Owned by the dedicated custody address `0xaca29165188f10136073788f648e1186dd25100100146186ebecedaf94b23d11`\n * (per `RUNBOOK_audric_sui_parent.md` §1). Every leaf mint / revoke MUST be signed\n * by the address that owns this NFT. Mainnet only.\n */\nexport const AUDRIC_PARENT_NFT_ID =\n '0x070456e283ec988b6302bdd6cc5172bbdcb709998cf116586fb98d19b0870198';\n\nexport interface BuildAddLeafParams {\n /** Bare label, e.g. `'alice'` — NOT the full `'alice.audric.sui'` path. */\n label: string;\n /** Sui address the leaf will resolve to (typically the user's zkLogin wallet). */\n targetAddress: string;\n}\n\nexport interface BuildRevokeLeafParams {\n /** Bare label of the leaf to revoke. */\n label: string;\n}\n\nexport type LabelValidationResult = { valid: true } | { valid: false; reason: string };\n\n/**\n * SuiNS labels accept lowercase ASCII letters, digits, and hyphens. Hyphens cannot\n * lead or trail. The 3–63 char window matches SuiNS protocol rules and the SuiNS\n * dashboard's own `Register` form.\n *\n * The regex permits a single character only when it is alphanumeric (rejected by\n * the length check below for being < 3, but the pattern itself stays internally\n * consistent with DNS conventions).\n *\n * SUINS-LABEL-RULE — paired with `audric/apps/web/lib/identity/validate-label.ts`.\n * The audric host duplicates these rules inline to avoid pulling the SDK's\n * transitive deps (e.g. `@pythnetwork/pyth-sui-js` → `node:buffer`) into the\n * client bundle when the picker uses validation. If SuiNS ever changes its\n * label rules, BOTH this file and the audric copy need updating.\n */\nconst LABEL_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\n\n/**\n * Validate a leaf label against SuiNS protocol rules. Pure function; no I/O.\n *\n * Pre-call this before `buildAddLeafTx` / `buildRevokeLeafTx` if you want a\n * structured error (the builder functions throw on invalid labels). The audric\n * `/api/identity/check` endpoint uses this to drive the picker's real-time\n * availability indicator.\n *\n * Reserved-name policy (specific Audric handles like `support`, `admin`,\n * `official`) is NOT enforced here — that's a UI / route-level concern owned\n * by the audric host, not a protocol-level rule. See SPEC 10 D3.\n */\nexport function validateLabel(label: unknown): LabelValidationResult {\n if (typeof label !== 'string') {\n return { valid: false, reason: 'label must be a string' };\n }\n if (label.length < 3) {\n return { valid: false, reason: 'label must be at least 3 characters' };\n }\n if (label.length > 63) {\n return { valid: false, reason: 'label must be at most 63 characters' };\n }\n if (!LABEL_PATTERN.test(label)) {\n return {\n valid: false,\n reason:\n 'label may only contain lowercase letters, digits, and hyphens, and may not start or end with a hyphen',\n };\n }\n if (label.includes('--')) {\n return { valid: false, reason: 'label may not contain consecutive hyphens' };\n }\n return { valid: true };\n}\n\n/**\n * Build an unsigned PTB that creates a `<label>.audric.sui` leaf subname pointing\n * to `targetAddress`.\n *\n * The returned `Transaction` has neither sender nor gas configured — the caller\n * (audric's `/api/identity/reserve` route) sets the sender to the parent NFT\n * custody address and submits via Enoki sponsorship. See `audric-transaction-flow.mdc`\n * for the sponsored-tx wrapper pattern; note SPEC 10 leaf-mint is a documented\n * CANONICAL-BYPASS of `composeTx` because the signer is the service account, not\n * the user's zkLogin key.\n *\n * Throws synchronously if `label` violates protocol rules or `targetAddress` is\n * not a valid Sui address — fail-closed before bytes are built.\n */\nexport function buildAddLeafTx(\n suinsClient: SuinsClient,\n { label, targetAddress }: BuildAddLeafParams,\n): Transaction {\n const labelCheck = validateLabel(label);\n if (!labelCheck.valid) {\n throw new Error(`buildAddLeafTx: invalid label \"${label}\" — ${labelCheck.reason}`);\n }\n if (typeof targetAddress !== 'string' || !isValidSuiAddress(normalizeSuiAddress(targetAddress))) {\n throw new Error(`buildAddLeafTx: invalid targetAddress \"${targetAddress}\"`);\n }\n\n const tx = new Transaction();\n const suinsTx = new SuinsTransaction(suinsClient, tx);\n suinsTx.createLeafSubName({\n parentNft: AUDRIC_PARENT_NFT_ID,\n name: `${label}.${AUDRIC_PARENT_NAME}`,\n targetAddress: normalizeSuiAddress(targetAddress),\n });\n return tx;\n}\n\n/**\n * Build an unsigned PTB that revokes a `<label>.audric.sui` leaf subname.\n *\n * Used by:\n * 1. The change-username flow (`/api/identity/change`): revoke old leaf inside\n * the same PTB as the new leaf creation, atomically.\n * 2. The release-username flow (`/api/admin/identity/release`): admin recovery\n * of squatted / impersonating handles.\n * 3. Account-deletion flow (future): revoke leaf when user deletes their account.\n *\n * The mainnet smoke test (2026-05-01) confirmed revocation gas cost is roughly\n * negative net (storage rebate exceeds computation) — see RUNBOOK §4.\n */\nexport function buildRevokeLeafTx(\n suinsClient: SuinsClient,\n { label }: BuildRevokeLeafParams,\n): Transaction {\n const labelCheck = validateLabel(label);\n if (!labelCheck.valid) {\n throw new Error(`buildRevokeLeafTx: invalid label \"${label}\" — ${labelCheck.reason}`);\n }\n\n const tx = new Transaction();\n const suinsTx = new SuinsTransaction(suinsClient, tx);\n suinsTx.removeLeafSubName({\n parentNft: AUDRIC_PARENT_NFT_ID,\n name: `${label}.${AUDRIC_PARENT_NAME}`,\n });\n return tx;\n}\n\n/**\n * Convenience: turn a bare label into the full `<label>.audric.sui` path.\n *\n * **Use this for ON-CHAIN operations** — SuiNS leaf NFT `name` field, the\n * `createLeafSubName` / `removeLeafSubName` move calls, and any RPC call\n * that returns/expects the canonical name string. The `<label>.audric.sui`\n * form is what the SuiNS protocol writes into the NFT `name` field.\n *\n * **Do NOT use this for UI rendering** — that's `displayHandle()`'s job\n * (S.118 reversal of SPEC 10 D10, see audric-build-tracker). Pre-S.118\n * we surfaced the full `.sui` form everywhere; we now use the SuiNS V2\n * `@` form (`alice@audric`) for display because it's shorter, fits the\n * agent harness mono aesthetic, and matches SuiNS's own V2 standard.\n *\n * Both forms resolve to the same address via SuiNS RPC (verified\n * mainnet 2026-05-08 PF1) — `displayHandle()` is purely a render-layer\n * choice, not a backend storage change.\n */\nexport function fullHandle(label: string): string {\n return `${label}.${AUDRIC_PARENT_NAME}`;\n}\n\n/**\n * SuiNS V2 short-form display alias. `displayHandle('alice')` →\n * `'alice@audric'`. Use for chat narration, permission cards, receipts,\n * profile pages, share-to-X copy, OG metadata, and lookup_user output.\n *\n * **Why a separate function from `fullHandle`:**\n * - `fullHandle('alice')` → `'alice.audric.sui'` is the **on-chain**\n * NFT name field; SuiNS's `createLeafSubName` writes exactly this\n * string and `suix_resolveNameServiceAddress` accepts it.\n * - `displayHandle('alice')` → `'alice@audric'` is the **UI** form\n * that users see and share. SuiNS RPC also accepts this form\n * (verified mainnet 2026-05-08 PF1 — both forms return the same\n * address), so we have one storage form (`<label>.audric.sui`) and\n * two interchangeable input forms (the user can paste either).\n *\n * Reverses SPEC 10 D10 (\"full handle ALWAYS\"). See audric-build-tracker\n * S.118 for the rationale; see also `audric/apps/web/lib/identity/`\n * for canonicalization in the input parser (which is a no-op since\n * SuiNS RPC accepts both — kept available for future-proofing).\n */\nexport function displayHandle(label: string): string {\n // Strip trailing `.sui` from the parent for the display form.\n // Today AUDRIC_PARENT_NAME is `'audric.sui'` → `'audric'`. If the\n // parent ever changes (e.g. `audric.app.sui` becomes the parent),\n // this still produces a sensible display form by removing only the\n // top-level TLD.\n const parentDisplay = AUDRIC_PARENT_NAME.replace(/\\.sui$/, '');\n return `${label}@${parentDisplay}`;\n}\n"]}
|