@t2000/sdk 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/registry.ts","../../src/constants.ts","../../src/errors.ts","../../src/utils/format.ts","../../src/protocols/protocolFee.ts","../../src/protocols/navi.ts","../../src/adapters/navi.ts","../../src/protocols/cetus.ts","../../src/adapters/cetus.ts","../../src/adapters/suilend.ts"],"names":["bcs","Transaction","AggregatorClient","Env","USDC_TYPE","MIN_HEALTH_FACTOR","CLOCK","normalizeStructTag"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n LendingAdapter,\n SwapAdapter,\n LendingRates,\n SwapQuote,\n AdapterPositions,\n} from './types.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n private swap: Map<string, SwapAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n registerSwap(adapter: SwapAdapter): void {\n this.swap.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 Error(`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 Error(`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 bestSwapQuote(from: string, to: string, amount: number): Promise<{ adapter: SwapAdapter; quote: SwapQuote }> {\n const candidates: Array<{ adapter: SwapAdapter; quote: SwapQuote }> = [];\n\n for (const adapter of this.swap.values()) {\n const pairs = adapter.getSupportedPairs();\n if (!pairs.some(p => p.from === from && p.to === to)) continue;\n try {\n const quote = await adapter.getQuote(from, to, amount);\n candidates.push({ adapter, quote });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new Error(`No swap adapter supports ${from} → ${to}`);\n }\n\n candidates.sort((a, b) => b.quote.expectedOutput - a.quote.expectedOutput);\n return candidates[0];\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 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 {\n // skip\n }\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n getSwap(id: string): SwapAdapter | undefined {\n return this.swap.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n\n listSwap(): SwapAdapter[] {\n return [...this.swap.values()];\n }\n}\n","export 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)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const SWAP_FEE_BPS = 0n; // Free — Cetus already charges pool fees\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 },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_UPGRADE_CAP_ID = '0xef28746d40f43ca6be1352102cef0152133bf5594e69caab28f40b1de74490c1';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\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\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\nexport const CETUS_GLOBAL_CONFIG = '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f';\nexport const CETUS_PACKAGE = '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb';\n\nexport const SENTINEL = {\n PACKAGE: '0x88b83f36dafcd5f6dcdcf1d2cb5889b03f61264ab3cee9cae35db7aa940a21b7',\n AGENT_REGISTRY: '0xc47564f5f14c12b31e0dfa1a3dc99a6380a1edf8929c28cb0eaa3359c8db36ac',\n ENCLAVE: '0xfb1261aeb9583514cb1341a548a5ec12d1231bd96af22215f1792617a93e1213',\n PROTOCOL_CONFIG: '0x2fa4fa4a1dd0498612304635ff9334e1b922e78af325000e9d9c0e88adea459f',\n TEE_API: 'https://app.suisentinel.xyz/api/consume-prompt',\n SENTINELS_API: 'https://api.suisentinel.xyz/agents/mainnet',\n RANDOM: '0x8',\n MIN_FEE_MIST: 100_000_000n, // 0.1 SUI\n MAX_PROMPT_TOKENS: 600,\n} as const;\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'SLIPPAGE_EXCEEDED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'FACILITATOR_TIMEOUT'\n | 'SENTINEL_API_ERROR'\n | 'SENTINEL_NOT_FOUND'\n | 'SENTINEL_TX_FAILED'\n | 'SENTINEL_TEE_ERROR'\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 };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS } 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 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","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n SWAP_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'swap' | 'borrow';\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 swap: SWAP_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n swap: 1,\n borrow: 2,\n};\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 = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { bcs } from '@mysten/sui/bcs';\nimport { SUPPORTED_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { usdcToRaw } from '../utils/format.js';\nimport { addCollectFeeToTx } from './protocolFee.js';\nimport type {\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n GasMethod,\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst RATE_DECIMALS = 27;\nconst LTV_DECIMALS = 27;\nconst MIN_HEALTH_FACTOR = 1.5;\nconst WITHDRAW_DUST_BUFFER = 0.001;\nconst CLOCK = '0x06';\nconst SUI_SYSTEM_STATE = '0x05';\nconst NAVI_BALANCE_DECIMALS = 9;\nconst CONFIG_API = 'https://open-api.naviprotocol.io/api/navi/config?env=prod';\nconst POOLS_API = 'https://open-api.naviprotocol.io/api/navi/pools?env=prod';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface NaviConfig {\n package: string;\n storage: string;\n incentiveV2: string;\n incentiveV3: string;\n uiGetter: string;\n oracle: { packageId: string; priceOracle: string };\n}\n\ninterface NaviPool {\n id: number;\n coinType: string;\n suiCoinType: string;\n currentSupplyRate: string;\n currentBorrowRate: string;\n currentSupplyIndex: string;\n currentBorrowIndex: string;\n ltv: string;\n liquidationFactor: { bonus: string; ratio: string; threshold: string };\n contract: { reserveId: string; pool: string };\n token: { symbol: string; decimals: number; price: number };\n}\n\ninterface UserState {\n assetId: number;\n supplyBalance: bigint;\n borrowBalance: bigint;\n}\n\nfunction toBigInt(v: unknown): bigint {\n if (typeof v === 'bigint') return v;\n return BigInt(String(v));\n}\n\n// ---------------------------------------------------------------------------\n// BCS\n// ---------------------------------------------------------------------------\n\nconst UserStateInfo = bcs.struct('UserStateInfo', {\n asset_id: bcs.u8(),\n borrow_balance: bcs.u256(),\n supply_balance: bcs.u256(),\n});\n\nfunction decodeDevInspect<T>(\n result: { results?: Array<{ returnValues?: Array<[number[], string]> }> | null; error?: string | null },\n schema: { parse: (data: Uint8Array) => T },\n): T | undefined {\n const rv = result.results?.[0]?.returnValues?.[0];\n if (result.error || !rv) return undefined;\n const bytes = Uint8Array.from(rv[0]);\n return schema.parse(bytes);\n}\n\n// ---------------------------------------------------------------------------\n// Config + Pool cache\n// ---------------------------------------------------------------------------\n\nlet configCache: { data: NaviConfig; ts: number } | null = null;\nlet poolsCache: { data: NaviPool[]; ts: number } | null = null;\nconst CACHE_TTL = 5 * 60_000;\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI API error: ${res.status}`);\n const json = (await res.json()) as { data?: T; code?: number };\n return (json.data ?? json) as T;\n}\n\nasync function getConfig(fresh = false): Promise<NaviConfig> {\n if (configCache && !fresh && Date.now() - configCache.ts < CACHE_TTL) return configCache.data;\n const data = await fetchJson<NaviConfig>(CONFIG_API);\n configCache = { data, ts: Date.now() };\n return data;\n}\n\nasync function getPools(fresh = false): Promise<NaviPool[]> {\n if (poolsCache && !fresh && Date.now() - poolsCache.ts < CACHE_TTL) return poolsCache.data;\n const data = await fetchJson<NaviPool[]>(POOLS_API);\n poolsCache = { data, ts: Date.now() };\n return data;\n}\n\nasync function getUsdcPool(): Promise<NaviPool> {\n const pools = await getPools();\n const usdc = pools.find(\n (p) => p.token?.symbol === 'USDC' || p.coinType?.toLowerCase().includes('usdc'),\n );\n if (!usdc) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'USDC pool not found on NAVI');\n return usdc;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractGasCost(effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null): number {\n if (!effects?.gasUsed) return 0;\n return Math.abs(\n (Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)) / 1e9,\n );\n}\n\nfunction rateToApy(rawRate: string): number {\n if (!rawRate || rawRate === '0') return 0;\n return Number(BigInt(rawRate)) / 10 ** RATE_DECIMALS * 100;\n}\n\nfunction parseLtv(rawLtv: string): number {\n if (!rawLtv || rawLtv === '0') return 0.75;\n return Number(BigInt(rawLtv)) / 10 ** LTV_DECIMALS;\n}\n\nfunction parseLiqThreshold(val: string | number): number {\n if (typeof val === 'number') return val;\n const n = Number(val);\n if (n > 1) return Number(BigInt(val)) / 10 ** LTV_DECIMALS;\n return n;\n}\n\nfunction normalizeHealthFactor(raw: number): number {\n const v = raw / 10 ** RATE_DECIMALS;\n return v > 1e5 ? Infinity : v;\n}\n\nfunction compoundBalance(rawBalance: bigint, currentIndex: string): number {\n if (!rawBalance || !currentIndex || currentIndex === '0') return 0;\n const scale = BigInt('1' + '0'.repeat(RATE_DECIMALS));\n const half = scale / 2n;\n const result = (rawBalance * scale + half) / BigInt(currentIndex);\n return Number(result) / 10 ** NAVI_BALANCE_DECIMALS;\n}\n\n// ---------------------------------------------------------------------------\n// On-chain reads\n// ---------------------------------------------------------------------------\n\nasync function getUserState(client: SuiJsonRpcClient, address: string): Promise<UserState[]> {\n const config = await getConfig();\n const tx = new Transaction();\n tx.moveCall({\n target: `${config.uiGetter}::getter_unchecked::get_user_state`,\n arguments: [tx.object(config.storage), tx.pure.address(address)],\n });\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address,\n });\n\n const decoded = decodeDevInspect(result, bcs.vector(UserStateInfo));\n if (!decoded) return [];\n\n return (decoded as Array<{ asset_id: number; supply_balance: unknown; borrow_balance: unknown }>)\n .map((s) => ({\n assetId: s.asset_id,\n supplyBalance: toBigInt(s.supply_balance),\n borrowBalance: toBigInt(s.borrow_balance),\n }))\n .filter((s) => s.supplyBalance !== 0n || s.borrowBalance !== 0n);\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\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\n return all;\n}\n\nfunction mergeCoinsPtb(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n amount: number,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\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 const [split] = tx.splitCoins(primary, [amount]);\n return split;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean } = {},\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n const [config, pool] = await Promise.all([getConfig(), getUsdcPool()]);\n\n const coins = await fetchCoins(client, address, USDC_TYPE);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoinsPtb(tx, coins, rawAmount);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coinObj, 'save');\n }\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coinObj,\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n return tx;\n}\n\nexport async function save(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<SaveResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildSaveTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const rates = await getRates(client);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n apy: rates.USDC.saveApy,\n fee: 0,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n savingsBalance: amount,\n };\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const [config, pool, pools, states] = await Promise.all([\n getConfig(),\n getUsdcPool(),\n getPools(),\n getUserState(client, address),\n ]);\n\n const usdcState = states.find((s) => s.assetId === pool.id);\n const deposited = usdcState ? compoundBalance(usdcState.supplyBalance, pool.currentSupplyIndex) : 0;\n\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - WITHDRAW_DUST_BUFFER));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', 'Nothing to withdraw');\n\n const rawAmount = Number(usdcToRaw(effectiveAmount));\n const tx = new Transaction();\n tx.setSender(address);\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_withdraw_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object(SUI_SYSTEM_STATE),\n ],\n });\n\n return { tx, effectiveAmount };\n}\n\nexport async function withdraw(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<WithdrawResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const { tx, effectiveAmount } = await buildWithdrawTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n success: true,\n tx: result.digest,\n amount: effectiveAmount,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean } = {},\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n const [config, pool] = await Promise.all([getConfig(), getUsdcPool()]);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_borrow_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object(SUI_SYSTEM_STATE),\n ],\n });\n\n return tx;\n}\n\nexport async function borrow(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<BorrowResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildBorrowTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const hfResult = await getHealthFactor(client, address);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n fee: 0,\n healthFactor: hfResult.healthFactor,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n const [config, pool] = await Promise.all([getConfig(), getUsdcPool()]);\n\n const coins = await fetchCoins(client, address, USDC_TYPE);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins to repay with');\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoinsPtb(tx, coins, rawAmount);\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coinObj,\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n return tx;\n}\n\nexport async function repay(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<RepayResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildRepayTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const states = await getUserState(client, address);\n const pool = await getUsdcPool();\n const usdcState = states.find((s) => s.assetId === pool.id);\n const remainingDebt = usdcState ? compoundBalance(usdcState.borrowBalance, pool.currentBorrowIndex) : 0;\n\n return {\n success: true,\n tx: result.digest,\n amount,\n remainingDebt,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<HealthFactorResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\n\n const [config, pool, states] = await Promise.all([\n getConfig(),\n getUsdcPool(),\n getUserState(client, address),\n ]);\n\n const usdcState = states.find((s) => s.assetId === pool.id);\n const supplied = usdcState ? compoundBalance(usdcState.supplyBalance, pool.currentSupplyIndex) : 0;\n const borrowed = usdcState ? compoundBalance(usdcState.borrowBalance, pool.currentBorrowIndex) : 0;\n\n const ltv = parseLtv(pool.ltv);\n const liqThreshold = parseLiqThreshold(pool.liquidationFactor.threshold);\n const maxBorrowVal = Math.max(0, supplied * ltv - borrowed);\n\n let healthFactor: number;\n if (borrowed <= 0) {\n healthFactor = Infinity;\n } else {\n try {\n const tx = new Transaction();\n tx.moveCall({\n target: `${config.uiGetter}::calculator_unchecked::dynamic_health_factor`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.storage),\n tx.object(config.oracle.priceOracle),\n tx.pure.u8(pool.id),\n tx.pure.address(address),\n tx.pure.u8(pool.id),\n tx.pure.u64(0),\n tx.pure.u64(0),\n tx.pure.bool(false),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address,\n });\n\n const decoded = decodeDevInspect(result, bcs.u256());\n if (decoded !== undefined) {\n healthFactor = normalizeHealthFactor(Number(decoded));\n } else {\n healthFactor = borrowed > 0 ? (supplied * liqThreshold) / borrowed : Infinity;\n }\n } catch {\n healthFactor = borrowed > 0 ? (supplied * liqThreshold) / borrowed : Infinity;\n }\n }\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow: maxBorrowVal,\n liquidationThreshold: liqThreshold,\n };\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pool = await getUsdcPool();\n\n let saveApy = rateToApy(pool.currentSupplyRate);\n let borrowApy = rateToApy(pool.currentBorrowRate);\n\n if (saveApy <= 0 || saveApy > 100) saveApy = 4.0;\n if (borrowApy <= 0 || borrowApy > 100) borrowApy = 6.0;\n\n return { USDC: { saveApy, borrowApy } };\n } catch {\n return { USDC: { saveApy: 4.0, borrowApy: 6.0 } };\n }\n}\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<PositionsResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\n\n const [states, pools] = await Promise.all([getUserState(client, address), getPools()]);\n const positions: PositionEntry[] = [];\n\n for (const state of states) {\n const pool = pools.find((p) => p.id === state.assetId);\n if (!pool) continue;\n\n const symbol = pool.token?.symbol ?? 'UNKNOWN';\n const supplyBal = compoundBalance(state.supplyBalance, pool.currentSupplyIndex);\n const borrowBal = compoundBalance(state.borrowBalance, pool.currentBorrowIndex);\n\n if (supplyBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'save',\n amount: supplyBal,\n apy: rateToApy(pool.currentSupplyRate),\n });\n }\n\n if (borrowBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'borrow',\n amount: borrowBal,\n apy: rateToApy(pool.currentBorrowRate),\n });\n }\n }\n\n return { positions };\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\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 / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n} from './types.js';\nimport * as naviProtocol from '../protocols/navi.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[] = ['USDC'];\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 key = asset.toUpperCase() as keyof typeof rates;\n const r = rates[key];\n if (!r) throw new Error(`NAVI does not support ${asset}`);\n return { asset, 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, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, 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 options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, options);\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n _asset: string,\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount);\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n _asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, options);\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n _asset: string,\n ): Promise<AdapterTxResult> {\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount);\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk';\nimport { SUPPORTED_ASSETS, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { GasMethod } from '../types.js';\n\nconst DEFAULT_SLIPPAGE_BPS = 300; // 3%\n\nexport interface SwapParams {\n client: SuiJsonRpcClient;\n keypair: Ed25519Keypair;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}\n\nexport interface SwapTxResult {\n digest: string;\n fromAmount: number;\n fromAsset: string;\n toAmount: number;\n toAsset: string;\n priceImpact: number;\n gasCost: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nexport interface SwapBuildResult {\n tx: Transaction;\n estimatedOut: number;\n toDecimals: number;\n}\n\nfunction createAggregatorClient(client: SuiJsonRpcClient, signer?: string): AggregatorClient {\n // Cetus SDK bundles @mysten/sui v1 internally — the runtime API is\n // identical to SuiJsonRpcClient, so the cast is safe.\n return new AggregatorClient({\n client: client as never,\n signer,\n env: Env.Mainnet,\n });\n}\n\nexport async function buildSwapTx(params: {\n client: SuiJsonRpcClient;\n address: string;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const aggClient = createAggregatorClient(client, address);\n\n const result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `No swap route found for ${fromAsset} → ${toAsset}`,\n );\n }\n\n const tx = new Transaction();\n const slippage = maxSlippageBps / 10000;\n\n await aggClient.fastRouterSwap({\n router: result,\n txb: tx as never,\n slippage,\n });\n\n const estimatedOut = Number(result.amountOut.toString());\n\n return {\n tx,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\nexport async function executeSwap(params: SwapParams): Promise<SwapTxResult> {\n const { client, keypair, fromAsset, toAsset, amount, maxSlippageBps } = params;\n const address = keypair.getPublicKey().toSuiAddress();\n const toInfo = SUPPORTED_ASSETS[toAsset];\n\n const { tx, estimatedOut, toDecimals } = await buildSwapTx({\n client,\n address,\n fromAsset,\n toAsset,\n amount,\n maxSlippageBps,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let actualReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = estimatedOut / 10 ** toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n return {\n digest: result.digest,\n fromAmount: amount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n gasCost: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nexport async function getPoolPrice(client: SuiJsonRpcClient): Promise<number> {\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 suiPriceUsd = 1e3 / rawPrice;\n if (suiPriceUsd > 0.01 && suiPriceUsd < 1000) return suiPriceUsd;\n }\n }\n } catch {\n // Fallback\n }\n\n return 3.5;\n}\n\nexport async function getSwapQuote(\n client: SuiJsonRpcClient,\n fromAsset: 'USDC' | 'SUI',\n toAsset: 'USDC' | 'SUI',\n amount: number,\n): Promise<{ expectedOutput: number; priceImpact: number; poolPrice: number }> {\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const poolPrice = await getPoolPrice(client);\n\n try {\n const aggClient = createAggregatorClient(client);\n\n const result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!result || result.insufficientLiquidity) {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n\n const expectedOutput = Number(result.amountOut.toString()) / 10 ** toInfo.decimals;\n const priceImpact = result.deviationRatio ?? 0;\n\n return { expectedOutput, priceImpact, poolPrice };\n } catch {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n}\n\nfunction fallbackQuote(\n fromAsset: string,\n amount: number,\n poolPrice: number,\n): { expectedOutput: number; priceImpact: number; poolPrice: number } {\n const expectedOutput = fromAsset === 'USDC'\n ? amount / poolPrice\n : amount * poolPrice;\n return { expectedOutput, priceImpact: 0, poolPrice };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type {\n SwapAdapter,\n SwapQuote,\n AdapterTxResult,\n AdapterCapability,\n} from './types.js';\nimport * as cetusProtocol from '../protocols/cetus.js';\n\nexport class CetusAdapter implements SwapAdapter {\n readonly id = 'cetus';\n readonly name = 'Cetus';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['swap'];\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 getQuote(from: string, to: string, amount: number): Promise<SwapQuote> {\n return cetusProtocol.getSwapQuote(\n this.client,\n from.toUpperCase() as 'USDC' | 'SUI',\n to.toUpperCase() as 'USDC' | 'SUI',\n amount,\n );\n }\n\n async buildSwapTx(\n address: string,\n from: string,\n to: string,\n amount: number,\n maxSlippageBps?: number,\n ): Promise<AdapterTxResult & { estimatedOut: number; toDecimals: number }> {\n const result = await cetusProtocol.buildSwapTx({\n client: this.client,\n address,\n fromAsset: from.toUpperCase() as 'USDC' | 'SUI',\n toAsset: to.toUpperCase() as 'USDC' | 'SUI',\n amount,\n maxSlippageBps,\n });\n return {\n tx: result.tx,\n estimatedOut: result.estimatedOut,\n toDecimals: result.toDecimals,\n };\n }\n\n getSupportedPairs(): Array<{ from: string; to: string }> {\n return [\n { from: 'USDC', to: 'SUI' },\n { from: 'SUI', to: 'USDC' },\n ];\n }\n\n async getPoolPrice(): Promise<number> {\n return cetusProtocol.getPoolPrice(this.client);\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n} from './types.js';\nimport { SUPPORTED_ASSETS } from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\nimport { T2000Error } from '../errors.js';\nimport { addCollectFeeToTx } from '../protocols/protocolFee.js';\nimport type { TransactionObjectArgument } from '@mysten/sui/transactions';\n\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst WAD = 1e18;\nconst MIN_HEALTH_FACTOR = 1.5;\nconst CLOCK = '0x6';\n\nconst LENDING_MARKET_ID = '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1';\nconst LENDING_MARKET_TYPE = '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL';\nconst SUILEND_PACKAGE = '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf';\nconst UPGRADE_CAP_ID = '0x3d4ef1859c3ee9fc72858f588b56a09da5466e64f8cc4e90a7b3b909fba8a7ae';\nconst FALLBACK_PUBLISHED_AT = '0xd2a67633ccb8de063163e25bcfca242929caf5cf1a26c2929dab519ee0b8f331';\n\ninterface Reserve {\n coinType: string;\n mintDecimals: number;\n availableAmount: number;\n borrowedAmountWad: number;\n ctokenSupply: number;\n unclaimedSpreadFeesWad: number;\n cumulativeBorrowRateWad: number;\n openLtvPct: number;\n closeLtvPct: number;\n spreadFeeBps: number;\n interestRateUtils: number[];\n interestRateAprs: number[];\n arrayIndex: number;\n}\n\ninterface ObligationCap {\n id: string;\n obligationId: string;\n}\n\ninterface Obligation {\n deposits: Array<{ coinType: string; ctokenAmount: number; reserveIdx: number }>;\n borrows: Array<{ coinType: string; borrowedWad: number; cumBorrowRateWad: number; reserveIdx: number }>;\n}\n\n// ---------------------------------------------------------------------------\n// Rate math (unchanged from SDK-based version)\n// ---------------------------------------------------------------------------\n\nfunction interpolateRate(\n utilBreakpoints: number[],\n aprBreakpoints: number[],\n utilizationPct: number,\n): number {\n if (utilBreakpoints.length === 0) return 0;\n if (utilizationPct <= utilBreakpoints[0]) return aprBreakpoints[0];\n if (utilizationPct >= utilBreakpoints[utilBreakpoints.length - 1]) {\n return aprBreakpoints[aprBreakpoints.length - 1];\n }\n\n for (let i = 1; i < utilBreakpoints.length; i++) {\n if (utilizationPct <= utilBreakpoints[i]) {\n const t =\n (utilizationPct - utilBreakpoints[i - 1]) /\n (utilBreakpoints[i] - utilBreakpoints[i - 1]);\n return aprBreakpoints[i - 1] + t * (aprBreakpoints[i] - aprBreakpoints[i - 1]);\n }\n }\n return aprBreakpoints[aprBreakpoints.length - 1];\n}\n\nfunction computeRates(reserve: Reserve): { borrowAprPct: number; depositAprPct: number } {\n const available = reserve.availableAmount / 10 ** reserve.mintDecimals;\n const borrowed = reserve.borrowedAmountWad / WAD / 10 ** reserve.mintDecimals;\n const totalDeposited = available + borrowed;\n const utilizationPct = totalDeposited > 0 ? (borrowed / totalDeposited) * 100 : 0;\n\n if (reserve.interestRateUtils.length === 0) return { borrowAprPct: 0, depositAprPct: 0 };\n\n const aprs = reserve.interestRateAprs.map((a) => a / 100);\n const borrowAprPct = interpolateRate(reserve.interestRateUtils, aprs, utilizationPct);\n const depositAprPct =\n (utilizationPct / 100) *\n (borrowAprPct / 100) *\n (1 - reserve.spreadFeeBps / 10000) *\n 100;\n\n return { borrowAprPct, depositAprPct };\n}\n\nfunction cTokenRatio(reserve: Reserve): number {\n if (reserve.ctokenSupply === 0) return 1;\n const totalSupply =\n reserve.availableAmount +\n reserve.borrowedAmountWad / WAD -\n reserve.unclaimedSpreadFeesWad / WAD;\n return totalSupply / reserve.ctokenSupply;\n}\n\n// ---------------------------------------------------------------------------\n// JSON-RPC response helpers\n// ---------------------------------------------------------------------------\n\ntype Fields = Record<string, unknown>;\n\nfunction f(obj: unknown): Fields {\n if (obj && typeof obj === 'object' && 'fields' in obj) return (obj as { fields: Fields }).fields;\n return obj as Fields;\n}\n\nfunction str(v: unknown): string { return String(v ?? '0'); }\nfunction num(v: unknown): number { return Number(str(v)); }\n\nfunction parseReserve(raw: unknown, index: number): Reserve {\n const r = f(raw);\n const coinTypeField = f(r.coin_type);\n const config = f(f(r.config)?.element);\n\n return {\n coinType: str(coinTypeField?.name),\n mintDecimals: num(r.mint_decimals),\n availableAmount: num(r.available_amount),\n borrowedAmountWad: num(f(r.borrowed_amount)?.value),\n ctokenSupply: num(r.ctoken_supply),\n unclaimedSpreadFeesWad: num(f(r.unclaimed_spread_fees)?.value),\n cumulativeBorrowRateWad: num(f(r.cumulative_borrow_rate)?.value),\n openLtvPct: num(config?.open_ltv_pct),\n closeLtvPct: num(config?.close_ltv_pct),\n spreadFeeBps: num(config?.spread_fee_bps),\n interestRateUtils: Array.isArray(config?.interest_rate_utils) ? (config.interest_rate_utils as unknown[]).map(num) : [],\n interestRateAprs: Array.isArray(config?.interest_rate_aprs) ? (config.interest_rate_aprs as unknown[]).map(num) : [],\n arrayIndex: index,\n };\n}\n\nfunction parseObligation(raw: Fields): Obligation {\n const deposits = Array.isArray(raw.deposits)\n ? (raw.deposits as unknown[]).map((d) => {\n const df = f(d);\n return {\n coinType: str(f(df.coin_type)?.name),\n ctokenAmount: num(df.deposited_ctoken_amount),\n reserveIdx: num(df.reserve_array_index),\n };\n })\n : [];\n\n const borrows = Array.isArray(raw.borrows)\n ? (raw.borrows as unknown[]).map((b) => {\n const bf = f(b);\n return {\n coinType: str(f(bf.coin_type)?.name),\n borrowedWad: num(f(bf.borrowed_amount)?.value),\n cumBorrowRateWad: num(f(bf.cumulative_borrow_rate)?.value),\n reserveIdx: num(bf.reserve_array_index),\n };\n })\n : [];\n\n return { deposits, borrows };\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Suilend adapter — contract-first, no SDK dependency.\n * Interacts directly with Suilend Move contracts via RPC + PTB moveCall.\n */\nexport class SuilendAdapter implements LendingAdapter {\n readonly id = 'suilend';\n readonly name = 'Suilend';\n readonly version = '2.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw'];\n readonly supportedAssets: readonly string[] = ['USDC'];\n readonly supportsSameAssetBorrow = false;\n\n private client!: SuiJsonRpcClient;\n private publishedAt: string | null = null;\n private reserveCache: Reserve[] | null = null;\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 // -- On-chain reads -------------------------------------------------------\n\n private async resolvePackage(): Promise<string> {\n if (this.publishedAt) return this.publishedAt;\n try {\n const cap = await this.client.getObject({ id: UPGRADE_CAP_ID, options: { showContent: true } });\n if (cap.data?.content?.dataType === 'moveObject') {\n const fields = cap.data.content.fields as Fields;\n this.publishedAt = str(fields.package);\n return this.publishedAt;\n }\n } catch { /* use fallback */ }\n this.publishedAt = FALLBACK_PUBLISHED_AT;\n return this.publishedAt;\n }\n\n private async loadReserves(fresh = false): Promise<Reserve[]> {\n if (this.reserveCache && !fresh) return this.reserveCache;\n\n const market = await this.client.getObject({\n id: LENDING_MARKET_ID,\n options: { showContent: true },\n });\n\n if (market.data?.content?.dataType !== 'moveObject') {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to read Suilend lending market');\n }\n\n const fields = market.data.content.fields as Fields;\n const reservesRaw = fields.reserves as unknown[];\n\n if (!Array.isArray(reservesRaw)) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to parse Suilend reserves');\n }\n\n this.reserveCache = reservesRaw.map((r, i) => parseReserve(r, i));\n return this.reserveCache;\n }\n\n private findReserve(reserves: Reserve[], asset: string): Reserve | undefined {\n const upper = asset.toUpperCase();\n let coinType: string;\n if (upper === 'USDC') coinType = USDC_TYPE;\n else if (upper === 'SUI') coinType = '0x2::sui::SUI';\n else if (asset.includes('::')) coinType = asset;\n else return undefined;\n\n try {\n const normalized = normalizeStructTag(coinType);\n return reserves.find((r) => {\n try { return normalizeStructTag(r.coinType) === normalized; } catch { return false; }\n });\n } catch { return undefined; }\n }\n\n private async fetchObligationCaps(address: string): Promise<ObligationCap[]> {\n const capType = `${SUILEND_PACKAGE}::lending_market::ObligationOwnerCap<${LENDING_MARKET_TYPE}>`;\n const caps: ObligationCap[] = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n\n while (hasNext) {\n const page = await this.client.getOwnedObjects({\n owner: address,\n filter: { StructType: capType },\n options: { showContent: true },\n cursor: cursor ?? undefined,\n });\n\n for (const item of page.data) {\n if (item.data?.content?.dataType !== 'moveObject') continue;\n const fields = item.data.content.fields as Fields;\n caps.push({\n id: item.data.objectId,\n obligationId: str(fields.obligation_id),\n });\n }\n\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n return caps;\n }\n\n private async fetchObligation(obligationId: string): Promise<Obligation> {\n const obj = await this.client.getObject({ id: obligationId, options: { showContent: true } });\n if (obj.data?.content?.dataType !== 'moveObject') {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to read Suilend obligation');\n }\n return parseObligation(obj.data.content.fields as Fields);\n }\n\n private resolveSymbol(coinType: string): string {\n try {\n const normalized = normalizeStructTag(coinType);\n if (normalized === normalizeStructTag(USDC_TYPE)) return 'USDC';\n if (normalized === normalizeStructTag('0x2::sui::SUI')) return 'SUI';\n } catch { /* fall through */ }\n const parts = coinType.split('::');\n return parts[parts.length - 1] || 'UNKNOWN';\n }\n\n // -- Adapter interface ----------------------------------------------------\n\n async getRates(asset: string): Promise<LendingRates> {\n const reserves = await this.loadReserves();\n const reserve = this.findReserve(reserves, asset);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `Suilend does not support ${asset}`);\n\n const { borrowAprPct, depositAprPct } = computeRates(reserve);\n return { asset, saveApy: depositAprPct, borrowApy: borrowAprPct };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const supplies: Array<{ asset: string; amount: number; apy: number }> = [];\n const borrows: Array<{ asset: string; amount: number; apy: number }> = [];\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) return { supplies, borrows };\n\n const [reserves, obligation] = await Promise.all([\n this.loadReserves(),\n this.fetchObligation(caps[0].obligationId),\n ]);\n\n for (const dep of obligation.deposits) {\n const reserve = reserves[dep.reserveIdx];\n if (!reserve) continue;\n const ratio = cTokenRatio(reserve);\n const amount = (dep.ctokenAmount * ratio) / 10 ** reserve.mintDecimals;\n const { depositAprPct } = computeRates(reserve);\n supplies.push({ asset: this.resolveSymbol(dep.coinType), amount, apy: depositAprPct });\n }\n\n for (const bor of obligation.borrows) {\n const reserve = reserves[bor.reserveIdx];\n if (!reserve) continue;\n const rawAmount = bor.borrowedWad / WAD / 10 ** reserve.mintDecimals;\n const reserveRate = reserve.cumulativeBorrowRateWad / WAD;\n const posRate = bor.cumBorrowRateWad / WAD;\n const compounded = posRate > 0 ? rawAmount * (reserveRate / posRate) : rawAmount;\n const { borrowAprPct } = computeRates(reserve);\n borrows.push({ asset: this.resolveSymbol(bor.coinType), amount: compounded, apy: borrowAprPct });\n }\n\n return { supplies, borrows };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) {\n return { healthFactor: Infinity, supplied: 0, borrowed: 0, maxBorrow: 0, liquidationThreshold: 0 };\n }\n\n const positions = await this.getPositions(address);\n const supplied = positions.supplies.reduce((s, p) => s + p.amount, 0);\n const borrowed = positions.borrows.reduce((s, p) => s + p.amount, 0);\n\n const reserves = await this.loadReserves();\n const reserve = this.findReserve(reserves, 'USDC');\n const closeLtv = reserve?.closeLtvPct ?? 75;\n const openLtv = reserve?.openLtvPct ?? 70;\n const liqThreshold = closeLtv / 100;\n\n const healthFactor = borrowed > 0 ? (supplied * liqThreshold) / borrowed : Infinity;\n const maxBorrow = Math.max(0, supplied * (openLtv / 100) - borrowed);\n\n return { healthFactor, supplied, borrowed, maxBorrow, liquidationThreshold: liqThreshold };\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n _asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves()]);\n const usdcReserve = this.findReserve(reserves, 'USDC');\n if (!usdcReserve) throw new T2000Error('ASSET_NOT_SUPPORTED', 'USDC reserve not found on Suilend');\n\n const caps = await this.fetchObligationCaps(address);\n const tx = new Transaction();\n tx.setSender(address);\n\n let capRef: TransactionObjectArgument | string;\n if (caps.length === 0) {\n const [newCap] = tx.moveCall({\n target: `${pkg}::lending_market::create_obligation`,\n typeArguments: [LENDING_MARKET_TYPE],\n arguments: [tx.object(LENDING_MARKET_ID)],\n });\n capRef = newCap;\n } else {\n capRef = caps[0].id;\n }\n\n const allCoins = await this.fetchAllCoins(address, USDC_TYPE);\n if (allCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n\n const primaryCoinId = allCoins[0].coinObjectId;\n if (allCoins.length > 1) {\n tx.mergeCoins(tx.object(primaryCoinId), allCoins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n const rawAmount = usdcToRaw(amount).toString();\n const [depositCoin] = tx.splitCoins(tx.object(primaryCoinId), [rawAmount]);\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, depositCoin as TransactionObjectArgument, 'save');\n }\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::deposit_liquidity_and_mint_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n tx.object(CLOCK),\n depositCoin,\n ],\n });\n\n tx.moveCall({\n target: `${pkg}::lending_market::deposit_ctokens_into_obligation`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n typeof capRef === 'string' ? tx.object(capRef) : capRef,\n tx.object(CLOCK),\n ctokens,\n ],\n });\n\n if (typeof capRef !== 'string') {\n tx.transferObjects([capRef], address);\n }\n\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n _asset: string,\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves(true)]);\n const usdcReserve = this.findReserve(reserves, 'USDC');\n if (!usdcReserve) throw new T2000Error('ASSET_NOT_SUPPORTED', 'USDC reserve not found on Suilend');\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found');\n\n const positions = await this.getPositions(address);\n const deposited = positions.supplies.find((s) => s.asset === 'USDC')?.amount ?? 0;\n const effectiveAmount = Math.min(amount, deposited);\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', 'Nothing to withdraw from Suilend');\n\n const ratio = cTokenRatio(usdcReserve);\n const ctokenAmount = Math.ceil(effectiveAmount * 10 ** usdcReserve.mintDecimals / ratio);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::withdraw_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n tx.pure.u64(ctokenAmount),\n ],\n });\n\n const exemptionType = `${SUILEND_PACKAGE}::lending_market::RateLimiterExemption<${LENDING_MARKET_TYPE}, ${USDC_TYPE}>`;\n const [none] = tx.moveCall({\n target: '0x1::option::none',\n typeArguments: [exemptionType],\n });\n\n const [coin] = tx.moveCall({\n target: `${pkg}::lending_market::redeem_ctokens_and_withdraw_liquidity`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n tx.object(CLOCK),\n ctokens,\n none,\n ],\n });\n\n tx.transferObjects([coin], address);\n\n return { tx, effectiveAmount };\n }\n\n async buildBorrowTx(\n _address: string,\n _amount: number,\n _asset: string,\n _options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'Suilend borrow requires different collateral/borrow assets. Deferred to Phase 10.');\n }\n\n async buildRepayTx(\n _address: string,\n _amount: number,\n _asset: string,\n ): Promise<AdapterTxResult> {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'Suilend repay deferred to Phase 10.');\n }\n\n async maxWithdraw(\n address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n const health = await this.getHealth(address);\n\n let maxAmount: number;\n if (health.borrowed === 0) {\n maxAmount = health.supplied;\n } else {\n maxAmount = Math.max(0, health.supplied - (health.borrowed * MIN_HEALTH_FACTOR) / health.liquidationThreshold);\n }\n\n const remainingSupply = health.supplied - maxAmount;\n const hfAfter = health.borrowed > 0\n ? (remainingSupply * health.liquidationThreshold) / health.borrowed\n : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: health.healthFactor };\n }\n\n async maxBorrow(\n _address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'Suilend maxBorrow deferred to Phase 10.');\n }\n\n private async fetchAllCoins(\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 = null;\n let hasNext = true;\n\n while (hasNext) {\n const page = await this.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\n return all;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/registry.ts","../../src/constants.ts","../../src/errors.ts","../../src/utils/format.ts","../../src/protocols/protocolFee.ts","../../src/protocols/navi.ts","../../src/adapters/navi.ts","../../src/protocols/cetus.ts","../../src/adapters/cetus.ts","../../src/adapters/suilend.ts"],"names":["bcs","Transaction","AggregatorClient","Env","USDC_TYPE","MIN_HEALTH_FACTOR","CLOCK","normalizeStructTag"],"mappings":";;;;;;;;AAQO,IAAM,mBAAN,MAAuB;AAAA,EACpB,OAAA,uBAA2C,GAAA,EAAI;AAAA,EAC/C,IAAA,uBAAqC,GAAA,EAAI;AAAA,EAEjD,gBAAgB,OAAA,EAA+B;AAC7C,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,aAAa,OAAA,EAA4B;AACvC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,KAAA,EAAyE;AAC1F,IAAA,MAAM,aAAqE,EAAC;AAE5E,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,MAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AACzC,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,OAAA,GAAU,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AACzD,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,cAAA,CAAe,KAAA,EAAe,IAAA,EAAuG;AACzI,IAAA,MAAM,aAAqE,EAAC;AAE5E,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,MAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC9C,MAAA,IAAI,IAAA,EAAM,sBAAA,IAA0B,CAAC,OAAA,CAAQ,uBAAA,EAAyB;AACtE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AACzC,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,SAAA,GAAY,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AAC7D,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,aAAA,CAAc,IAAA,EAAc,EAAA,EAAY,MAAA,EAAqE;AACjH,IAAA,MAAM,aAAgE,EAAC;AAEvE,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO,EAAG;AACxC,MAAA,MAAM,KAAA,GAAQ,QAAQ,iBAAA,EAAkB;AACxC,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAA,IAAQ,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,IAAI,MAAM,CAAA;AACrD,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAI,CAAA,QAAA,EAAM,EAAE,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,CAAM,cAAA,GAAiB,CAAA,CAAE,KAAA,CAAM,cAAc,CAAA;AACzE,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,KAAA,EAA8F;AAC3G,IAAA,MAAM,UAAgF,EAAC;AACvF,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAC1C,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,CAAQ,MAAM,UAAA,EAAY,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,CAAA;AAAA,MACxE,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,OAAA,EAAwG;AACzH,IAAA,MAAM,UAAwF,EAAC;AAC/F,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AACpD,QAAA,IAAI,UAAU,QAAA,CAAS,MAAA,GAAS,KAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AACjE,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,CAAQ,MAAM,UAAA,EAAY,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,CAAA;AAAA,QAC5E;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,WAAW,EAAA,EAAwC;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEA,QAAQ,EAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,EACzB;AAAA,EAEA,WAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,QAAA,GAA0B;AACxB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/B;AACF;;;ACjIO,IAAM,aAAA,GAAgB,CAAA;AAatB,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,cAAA,GAAiB,EAAA;AAIvB,IAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,gFAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAIO,IAAM,gBAAA,GAAmB,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,oEAAA;AACzD,IAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,oEAAA;AAGvD,IAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,oEAAA;AAOtC,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB;AAElD,IAAM,mBAAA,GAAsB,oEAAA;;;ACP5B,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EAC3B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EAET,WAAA,CAAY,IAAA,EAAsB,OAAA,EAAiB,IAAA,EAAuB,YAAY,KAAA,EAAO;AAC3F,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,MAAA,GAAS;AACP,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,GAAI,IAAA,CAAK,IAAA,IAAQ,EAAE,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MACnC,WAAW,IAAA,CAAK;AAAA,KAClB;AAAA,EACF;AACF,CAAA;;;ACrDO,SAAS,UAAU,MAAA,EAAwB;AAChD,EAAA,OAAO,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,EAAA,IAAM,aAAa,CAAC,CAAA;AACxD;;;ACYA,IAAM,SAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,QAAA,GAAyC;AAAA,EAC7C,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAoBO,SAAS,iBAAA,CACd,EAAA,EACA,WAAA,EACA,SAAA,EACM;AACN,EAAA,MAAM,GAAA,GAAM,UAAU,SAAS,CAAA;AAC/B,EAAA,IAAI,OAAO,EAAA,EAAI;AAEf,EAAA,EAAA,CAAG,QAAA,CAAS;AAAA,IACV,MAAA,EAAQ,GAAG,gBAAgB,CAAA,uBAAA,CAAA;AAAA,IAC3B,aAAA,EAAe,CAAC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1C,SAAA,EAAW;AAAA,MACT,EAAA,CAAG,OAAO,iBAAiB,CAAA;AAAA,MAC3B,EAAA,CAAG,OAAO,eAAe,CAAA;AAAA,MACzB,WAAA;AAAA,MACA,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,SAAS,CAAC;AAAA;AAChC,GACD,CAAA;AACH;;;AClDA,IAAM,SAAA,GAAY,iBAAiB,IAAA,CAAK,IAAA;AACxC,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,oBAAA,GAAuB,IAAA;AAC7B,IAAM,KAAA,GAAQ,MAAA;AACd,IAAM,gBAAA,GAAmB,MAAA;AACzB,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,UAAA,GAAa,2DAAA;AACnB,IAAM,SAAA,GAAY,0DAAA;AAElB,IAAM,WAAA,GAAc,8CAAA;AACpB,IAAI,YAAA,GAAkD,IAAA;AAmCtD,SAAS,SAAS,CAAA,EAAoB;AACpC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AACzB;AAMA,IAAM,aAAA,GAAgBA,OAAA,CAAI,MAAA,CAAO,eAAA,EAAiB;AAAA,EAChD,QAAA,EAAUA,QAAI,EAAA,EAAG;AAAA,EACjB,cAAA,EAAgBA,QAAI,IAAA,EAAK;AAAA,EACzB,cAAA,EAAgBA,QAAI,IAAA;AACtB,CAAC,CAAA;AAED,SAAS,gBAAA,CACP,QACA,MAAA,EACe;AACf,EAAA,MAAM,KAAK,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,EAAG,eAAe,CAAC,CAAA;AAChD,EAAA,IAAI,MAAA,CAAO,KAAA,IAAS,CAAC,EAAA,EAAI,OAAO,MAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AACnC,EAAA,OAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAC3B;AAMA,IAAI,WAAA,GAAuD,IAAA;AAC3D,IAAI,UAAA,GAAsD,IAAA;AAC1D,IAAM,YAAY,CAAA,GAAI,GAAA;AAEtB,eAAe,UAAa,GAAA,EAAyB;AACnD,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,WAAW,sBAAA,EAAwB,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACzF,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,EAAA,OAAQ,KAAK,IAAA,IAAQ,IAAA;AACvB;AAEA,eAAe,kBAAA,GAAsC;AACnD,EAAA,IAAI,YAAA,IAAgB,KAAK,GAAA,EAAI,GAAI,aAAa,EAAA,GAAK,SAAA,SAAkB,YAAA,CAAa,EAAA;AAClF,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,WAAW,CAAA;AACnC,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,WAAW,sBAAA,EAAwB,CAAA,wBAAA,EAA2B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACjG,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,QAAiB,IAAI,UAAA,CAAW,wBAAwB,wCAAwC,CAAA;AAC1G,EAAA,YAAA,GAAe,EAAE,EAAA,EAAI,IAAA,CAAK,WAAW,EAAA,EAAI,IAAA,CAAK,KAAI,EAAE;AACpD,EAAA,OAAO,IAAA,CAAK,SAAA;AACd;AAEA,eAAe,SAAA,CAAU,QAAQ,KAAA,EAA4B;AAC3D,EAAA,IAAI,WAAA,IAAe,CAAC,KAAA,IAAS,IAAA,CAAK,GAAA,KAAQ,WAAA,CAAY,EAAA,GAAK,SAAA,EAAW,OAAO,WAAA,CAAY,IAAA;AACzF,EAAA,MAAM,CAAC,IAAA,EAAM,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC1C,UAAsB,UAAU,CAAA;AAAA,IAChC,kBAAA;AAAmB,GACpB,CAAA;AACD,EAAA,IAAA,CAAK,OAAA,GAAU,SAAA;AACf,EAAA,WAAA,GAAc,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,CAAK,KAAI,EAAE;AACrC,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,QAAA,CAAS,QAAQ,KAAA,EAA4B;AAC1D,EAAA,IAAI,UAAA,IAAc,CAAC,KAAA,IAAS,IAAA,CAAK,GAAA,KAAQ,UAAA,CAAW,EAAA,GAAK,SAAA,EAAW,OAAO,UAAA,CAAW,IAAA;AACtF,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAsB,SAAS,CAAA;AAClD,EAAA,UAAA,GAAa,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,CAAK,KAAI,EAAE;AACpC,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,WAAA,GAAiC;AAC9C,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAC7B,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAAA,IACjB,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,MAAA,KAAW,MAAA,IAAU,CAAA,CAAE,QAAA,EAAU,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM;AAAA,GAChF;AACA,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,UAAA,CAAW,wBAAwB,6BAA6B,CAAA;AACrF,EAAA,OAAO,IAAA;AACT;AAeA,SAAS,UAAU,OAAA,EAAyB;AAC1C,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,GAAA,EAAK,OAAO,CAAA;AACxC,EAAA,OAAO,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA,GAAI,MAAM,aAAA,GAAgB,GAAA;AACzD;AAEA,SAAS,SAAS,MAAA,EAAwB;AACxC,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,GAAA,EAAK,OAAO,IAAA;AACtC,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,IAAI,EAAA,IAAM,YAAA;AACxC;AAEA,SAAS,kBAAkB,GAAA,EAA8B;AACvD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,EAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,EAAA,IAAI,CAAA,GAAI,GAAG,OAAO,MAAA,CAAO,OAAO,GAAG,CAAC,IAAI,EAAA,IAAM,YAAA;AAC9C,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,sBAAsB,GAAA,EAAqB;AAClD,EAAA,MAAM,CAAA,GAAI,MAAM,EAAA,IAAM,aAAA;AACtB,EAAA,OAAO,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AAC9B;AAEA,SAAS,eAAA,CAAgB,YAAoB,YAAA,EAA8B;AACzE,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,YAAA,IAAgB,YAAA,KAAiB,KAAK,OAAO,CAAA;AACjE,EAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,aAAa,CAAC,CAAA;AACpD,EAAA,MAAM,OAAO,KAAA,GAAQ,EAAA;AACrB,EAAA,MAAM,MAAA,GAAA,CAAU,UAAA,GAAa,KAAA,GAAQ,IAAA,IAAQ,OAAO,YAAY,CAAA;AAChE,EAAA,OAAO,MAAA,CAAO,MAAM,CAAA,GAAI,EAAA,IAAM,qBAAA;AAChC;AAMA,eAAe,YAAA,CAAa,QAA0B,OAAA,EAAuC;AAC3F,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,EAAA,MAAM,EAAA,GAAK,IAAIC,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,QAAA,CAAS;AAAA,IACV,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,kCAAA,CAAA;AAAA,IAC1B,SAAA,EAAW,CAAC,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC;AAAA,GAChE,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,0BAAA,CAA2B;AAAA,IACrD,gBAAA,EAAkB,EAAA;AAAA,IAClB,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,UAAU,gBAAA,CAAiB,MAAA,EAAQD,OAAA,CAAI,MAAA,CAAO,aAAa,CAAC,CAAA;AAClE,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AAEtB,EAAA,OAAQ,OAAA,CACL,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,SAAS,CAAA,CAAE,QAAA;AAAA,IACX,aAAA,EAAe,QAAA,CAAS,CAAA,CAAE,cAAc,CAAA;AAAA,IACxC,aAAA,EAAe,QAAA,CAAS,CAAA,CAAE,cAAc;AAAA,GAC1C,CAAE,CAAA,CACD,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,aAAA,KAAkB,EAAA,IAAM,CAAA,CAAE,aAAA,KAAkB,EAAE,CAAA;AACnE;AAEA,eAAe,UAAA,CACb,MAAA,EACA,KAAA,EACA,QAAA,EAC2D;AAC3D,EAAA,MAAM,MAAwD,EAAC;AAC/D,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,QAAA,CAAS,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,MAAA,IAAU,MAAA,EAAW,CAAA;AACnF,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,MAAO,EAAE,YAAA,EAAc,EAAE,YAAA,EAAc,OAAA,EAAS,CAAA,CAAE,OAAA,GAAU,CAAC,CAAA;AACxF,IAAA,MAAA,GAAS,IAAA,CAAK,UAAA;AACd,IAAA,OAAA,GAAU,IAAA,CAAK,WAAA;AAAA,EACjB;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CACP,IACA,KAAA,EAC2B;AAC3B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,QAAS,IAAI,UAAA,CAAW,wBAAwB,mBAAmB,CAAA;AAExF,EAAA,MAAM,UAAU,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,CAAC,EAAE,YAAY,CAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,EAAA,CAAG,UAAA,CAAW,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAA,CAAG,MAAA,CAAO,CAAA,CAAE,YAAY,CAAC,CAAC,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO,OAAA;AACT;AAMA,eAAsB,YACpB,MAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,GAAoC,EAAC,EACf;AACtB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,MAAM,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,IAAI,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,EAAU,EAAG,WAAA,EAAa,CAAC,CAAA;AAErE,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,MAAA,EAAQ,SAAS,SAAS,CAAA;AACzD,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,QAAS,IAAI,UAAA,CAAW,wBAAwB,qBAAqB,CAAA;AAE1F,EAAA,MAAM,EAAA,GAAK,IAAIC,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,EAAA,EAAI,KAAK,CAAA;AAEpC,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,iBAAA,CAAkB,EAAA,EAAI,SAAS,MAAM,CAAA;AAAA,EACvC;AAEA,EAAA,EAAA,CAAG,QAAA,CAAS;AAAA,IACV,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,6BAAA,CAAA;AAAA,IACzB,SAAA,EAAW;AAAA,MACT,EAAA,CAAG,OAAO,KAAK,CAAA;AAAA,MACf,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,MACxB,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,MAC5B,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,MAClB,OAAA;AAAA,MACA,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,MACrB,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MAC5B,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW;AAAA,KAC9B;AAAA,IACA,aAAA,EAAe,CAAC,IAAA,CAAK,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,OAAO,EAAA;AACT;AA+BA,eAAsB,eAAA,CACpB,MAAA,EACA,OAAA,EACA,MAAA,EACuD;AACvD,EAAA,MAAM,CAAC,QAAQ,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACtD,SAAA,EAAU;AAAA,IACV,WAAA,EAAY;AAAA,IACZ,QAAA,EAAS;AAAA,IACT,YAAA,CAAa,QAAQ,OAAO;AAAA,GAC7B,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,KAAK,EAAE,CAAA;AAC1D,EAAA,MAAM,YAAY,SAAA,GAAY,eAAA,CAAgB,UAAU,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA,GAAI,CAAA;AAElG,EAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,oBAAoB,CAAC,CAAA;AACtF,EAAA,IAAI,mBAAmB,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,iBAAiB,qBAAqB,CAAA;AAErF,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,eAAe,CAAC,CAAA;AACnD,EAAA,MAAM,EAAA,GAAK,IAAIA,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,IAC5B,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,2BAAA,CAAA;AAAA,IACzB,SAAA,EAAW;AAAA,MACT,EAAA,CAAG,OAAO,KAAK,CAAA;AAAA,MACf,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MACnC,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,MACxB,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,MAC5B,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,MAClB,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,MACrB,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MAC5B,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MAC5B,EAAA,CAAG,OAAO,gBAAgB;AAAA,KAC5B;AAAA,IACA,aAAA,EAAe,CAAC,IAAA,CAAK,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,MAAM,CAAC,IAAI,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,IACzB,MAAA,EAAQ,yBAAA;AAAA,IACR,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,IACnB,aAAA,EAAe,CAAC,IAAA,CAAK,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,EAAA,CAAG,eAAA,CAAgB,CAAC,IAAI,CAAA,EAAG,OAAO,CAAA;AAElC,EAAA,OAAO,EAAE,IAAI,eAAA,EAAgB;AAC/B;AA0BA,eAAsB,cACpB,MAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,GAAoC,EAAC,EACf;AACtB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,MAAM,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,IAAI,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,EAAU,EAAG,WAAA,EAAa,CAAC,CAAA;AAErE,EAAA,MAAM,EAAA,GAAK,IAAIA,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,IAC5B,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,yBAAA,CAAA;AAAA,IACzB,SAAA,EAAW;AAAA,MACT,EAAA,CAAG,OAAO,KAAK,CAAA;AAAA,MACf,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MACnC,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,MACxB,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,MAC5B,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,MAClB,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,MACrB,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MAC5B,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MAC5B,EAAA,CAAG,OAAO,gBAAgB;AAAA,KAC5B;AAAA,IACA,aAAA,EAAe,CAAC,IAAA,CAAK,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,IACjC,MAAA,EAAQ,yBAAA;AAAA,IACR,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,IACnB,aAAA,EAAe,CAAC,IAAA,CAAK,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,EAAA,CAAG,eAAA,CAAgB,CAAC,YAAY,CAAA,EAAG,OAAO,CAAA;AAE1C,EAAA,OAAO,EAAA;AACT;AA8BA,eAAsB,YAAA,CACpB,MAAA,EACA,OAAA,EACA,MAAA,EACsB;AACtB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,MAAM,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,IAAI,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,EAAU,EAAG,WAAA,EAAa,CAAC,CAAA;AAErE,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,MAAA,EAAQ,SAAS,SAAS,CAAA;AACzD,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,QAAS,IAAI,UAAA,CAAW,wBAAwB,6BAA6B,CAAA;AAElG,EAAA,MAAM,EAAA,GAAK,IAAIA,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,EAAA,EAAI,KAAK,CAAA;AAEpC,EAAA,EAAA,CAAG,QAAA,CAAS;AAAA,IACV,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,2BAAA,CAAA;AAAA,IACzB,SAAA,EAAW;AAAA,MACT,EAAA,CAAG,OAAO,KAAK,CAAA;AAAA,MACf,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MACnC,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,MACxB,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,MAC5B,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,MAClB,OAAA;AAAA,MACA,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,MACrB,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,MAC5B,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,WAAW;AAAA,KAC9B;AAAA,IACA,aAAA,EAAe,CAAC,IAAA,CAAK,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,OAAO,EAAA;AACT;AAgCA,eAAsB,eAAA,CACpB,QACA,gBAAA,EAC6B;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAO,gBAAA,KAAqB,QAAA,GACxC,mBACA,gBAAA,CAAiB,YAAA,GAAe,YAAA,EAAa;AAEjD,EAAA,MAAM,CAAC,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC/C,SAAA,EAAU;AAAA,IACV,WAAA,EAAY;AAAA,IACZ,YAAA,CAAa,QAAQ,OAAO;AAAA,GAC7B,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,KAAK,EAAE,CAAA;AAC1D,EAAA,MAAM,WAAW,SAAA,GAAY,eAAA,CAAgB,UAAU,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA,GAAI,CAAA;AACjG,EAAA,MAAM,WAAW,SAAA,GAAY,eAAA,CAAgB,UAAU,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA,GAAI,CAAA;AAEjG,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACvE,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,MAAM,QAAQ,CAAA;AAE1D,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,YAAA,GAAe,QAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,IAAIA,wBAAA,EAAY;AAC3B,MAAA,EAAA,CAAG,QAAA,CAAS;AAAA,QACV,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,6CAAA,CAAA;AAAA,QAC1B,SAAA,EAAW;AAAA,UACT,EAAA,CAAG,OAAO,KAAK,CAAA;AAAA,UACf,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,UACxB,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,UACnC,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,UAClB,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAAA,UACvB,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,UAClB,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,UACb,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,UACb,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,KAAK;AAAA,SACpB;AAAA,QACA,aAAA,EAAe,CAAC,IAAA,CAAK,WAAW;AAAA,OACjC,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,0BAAA,CAA2B;AAAA,QACrD,gBAAA,EAAkB,EAAA;AAAA,QAClB,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,MAAA,EAAQD,OAAA,CAAI,MAAM,CAAA;AACnD,MAAA,IAAI,YAAY,KAAA,CAAA,EAAW;AACzB,QAAA,YAAA,GAAe,qBAAA,CAAsB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,QAAA,GAAW,CAAA,GAAK,QAAA,GAAW,YAAA,GAAgB,QAAA,GAAW,QAAA;AAAA,MACvE;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,YAAA,GAAe,QAAA,GAAW,CAAA,GAAK,QAAA,GAAW,YAAA,GAAgB,QAAA,GAAW,QAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,YAAA;AAAA,IACX,oBAAA,EAAsB;AAAA,GACxB;AACF;AAEA,eAAsB,SAAS,MAAA,EAAgD;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,EAAY;AAE/B,IAAA,IAAI,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,iBAAiB,CAAA;AAC9C,IAAA,IAAI,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,iBAAiB,CAAA;AAEhD,IAAA,IAAI,OAAA,IAAW,CAAA,IAAK,OAAA,GAAU,GAAA,EAAK,OAAA,GAAU,CAAA;AAC7C,IAAA,IAAI,SAAA,IAAa,CAAA,IAAK,SAAA,GAAY,GAAA,EAAK,SAAA,GAAY,CAAA;AAEnD,IAAA,OAAO,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,WAAU,EAAE;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,EAAE,SAAS,CAAA,EAAK,SAAA,EAAW,GAAI,EAAE;AAAA,EAClD;AACF;AAEA,eAAsB,YAAA,CACpB,QACA,gBAAA,EAC0B;AAC1B,EAAA,MAAM,OAAA,GAAU,OAAO,gBAAA,KAAqB,QAAA,GACxC,mBACA,gBAAA,CAAiB,YAAA,GAAe,YAAA,EAAa;AAEjD,EAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA,EAAG,QAAA,EAAU,CAAC,CAAA;AACrF,EAAA,MAAM,YAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,OAAO,CAAA;AACrD,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO,MAAA,IAAU,SAAA;AACrC,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,aAAA,EAAe,KAAK,kBAAkB,CAAA;AAC9E,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,aAAA,EAAe,KAAK,kBAAkB,CAAA;AAE9E,IAAA,IAAI,YAAY,IAAA,EAAQ;AACtB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,QAAA,EAAU,MAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,SAAA;AAAA,QACR,GAAA,EAAK,SAAA,CAAU,IAAA,CAAK,iBAAiB;AAAA,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,YAAY,IAAA,EAAQ;AACtB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,QAAA,EAAU,MAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,SAAA;AAAA,QACR,GAAA,EAAK,SAAA,CAAU,IAAA,CAAK,iBAAiB;AAAA,OACtC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAA,EAAU;AACrB;AAEA,eAAsB,iBAAA,CACpB,QACA,gBAAA,EAC4B;AAC5B,EAAA,MAAM,EAAA,GAAK,MAAM,eAAA,CAAgB,MAAA,EAAQ,gBAAgB,CAAA;AACzD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,oBAAA,GAAuB,CAAA,GAAI,GAAG,oBAAA,GAAuB,IAAA;AAEpE,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,EAAA,CAAG,aAAa,CAAA,EAAG;AACrB,IAAA,SAAA,GAAY,EAAA,CAAG,QAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,CAAG,WAAY,EAAA,CAAG,QAAA,GAAW,oBAAoB,GAAI,CAAA;AAAA,EAC/E;AAEA,EAAA,MAAM,eAAA,GAAkB,GAAG,QAAA,GAAW,SAAA;AACtC,EAAA,MAAM,UAAU,EAAA,CAAG,QAAA,GAAW,CAAA,GAAI,eAAA,GAAkB,GAAG,QAAA,GAAW,QAAA;AAElE,EAAA,OAAO,EAAE,SAAA,EAAW,iBAAA,EAAmB,OAAA,EAAS,SAAA,EAAW,GAAG,YAAA,EAAa;AAC7E;AAEA,eAAsB,eAAA,CACpB,QACA,gBAAA,EAC0B;AAC1B,EAAA,MAAM,EAAA,GAAK,MAAM,eAAA,CAAgB,MAAA,EAAQ,gBAAgB,CAAA;AACzD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,oBAAA,GAAuB,CAAA,GAAI,GAAG,oBAAA,GAAuB,IAAA;AAEpE,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,QAAA,GAAW,GAAA,GAAM,iBAAA,GAAoB,EAAA,CAAG,QAAQ,CAAA;AAEjF,EAAA,OAAO,EAAE,SAAA,EAAW,iBAAA,EAAmB,iBAAA,EAAmB,SAAA,EAAW,GAAG,YAAA,EAAa;AACvF;;;ACnqBO,IAAM,cAAN,MAA4C;AAAA,EACxC,EAAA,GAAK,MAAA;AAAA,EACL,IAAA,GAAO,eAAA;AAAA,EACP,OAAA,GAAU,OAAA;AAAA,EACV,YAAA,GAA6C,CAAC,MAAA,EAAQ,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,EACnF,eAAA,GAAqC,CAAC,MAAM,CAAA;AAAA,EAC5C,uBAAA,GAA0B,IAAA;AAAA,EAE3B,MAAA;AAAA,EAER,MAAM,KAAK,MAAA,EAAyC;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,SAAS,KAAA,EAAsC;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAmB,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACrD,IAAA,MAAM,GAAA,GAAM,MAAM,WAAA,EAAY;AAC9B,IAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AACxD,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,EAAE,OAAA,EAAS,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,EAC7D;AAAA,EAEA,MAAM,aAAa,OAAA,EAA4C;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAmB,YAAA,CAAa,IAAA,CAAK,QAAQ,OAAO,CAAA;AACnE,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,OAAO,SAAA,CACd,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,CAC7B,GAAA,CAAI,QAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI,CAAE,CAAA;AAAA,MAC9D,OAAA,EAAS,OAAO,SAAA,CACb,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAC/B,GAAA,CAAI,QAAM,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI,CAAE;AAAA,KAChE;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAA,EAAsC;AACpD,IAAA,OAAoB,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,WAAA,CACJ,OAAA,EACA,MAAA,EACA,QACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,KAAK,MAAmB,WAAA,CAAY,KAAK,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAO,CAAA;AAC/E,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AAAA,EAEA,MAAM,eAAA,CACJ,OAAA,EACA,MAAA,EACA,MAAA,EACwD;AACxD,IAAA,MAAM,SAAS,MAAmB,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,SAAS,MAAM,CAAA;AAC9E,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,eAAA,EAAiB,OAAO,eAAA,EAAgB;AAAA,EAClE;AAAA,EAEA,MAAM,aAAA,CACJ,OAAA,EACA,MAAA,EACA,QACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,KAAK,MAAmB,aAAA,CAAc,KAAK,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAO,CAAA;AACjF,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AAAA,EAEA,MAAM,YAAA,CACJ,OAAA,EACA,MAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,MAAM,KAAK,MAAmB,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,SAAS,MAAM,CAAA;AACvE,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AAAA,EAEA,MAAM,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB;AACjD,IAAA,OAAoB,iBAAA,CAAkB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,EAAiB,MAAA,EAAgB;AAC/C,IAAA,OAAoB,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AACF;AC1FA,IAAM,oBAAA,GAAuB,GAAA;AAsC7B,SAAS,sBAAA,CAAuB,QAA0B,MAAA,EAAmC;AAG3F,EAAA,OAAO,IAAIE,8BAAA,CAAiB;AAAA,IAC1B,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAKC,iBAAA,CAAI;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,YAAY,MAAA,EAOL;AAC3B,EAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,SAAA,EAAW,SAAS,MAAA,EAAQ,cAAA,GAAiB,sBAAqB,GAAI,MAAA;AAE/F,EAAA,MAAM,QAAA,GAAW,iBAAiB,SAAS,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,KAAA,CAAM,SAAS,EAAA,IAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAErE,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AAExD,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,WAAA,CAAY;AAAA,IACzC,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,QAAQ,MAAA,CAAO,IAAA;AAAA,IACf,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,qBAAA,EAAuB;AAC3C,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,qBAAA;AAAA,MACA,CAAA,wBAAA,EAA2B,SAAS,CAAA,QAAA,EAAM,OAAO,CAAA;AAAA,KACnD;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAK,IAAIF,wBAAAA,EAAY;AAC3B,EAAA,MAAM,WAAW,cAAA,GAAiB,GAAA;AAElC,EAAA,MAAM,UAAU,cAAA,CAAe;AAAA,IAC7B,MAAA,EAAQ,MAAA;AAAA,IACR,GAAA,EAAK,EAAA;AAAA,IACL;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AA0DA,eAAsB,aAAa,MAAA,EAA2C;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,SAAA,CAAU;AAAA,MAClC,EAAA,EAAI,mBAAA;AAAA,MACJ,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA;AAAK,KAC9B,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,QAAA,KAAa,YAAA,EAAc;AACjD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA;AACjC,MAAA,MAAM,mBAAmB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,kBAAA,IAAsB,GAAG,CAAC,CAAA;AAExE,MAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,QAAA,MAAM,MAAM,EAAA,IAAM,GAAA;AAClB,QAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,gBAAgB,CAAA,GAAI,OAAO,GAAG,CAAA;AAC5D,QAAA,MAAM,WAAW,cAAA,GAAiB,cAAA;AAClC,QAAA,MAAM,cAAc,GAAA,GAAM,QAAA;AAC1B,QAAA,IAAI,WAAA,GAAc,IAAA,IAAQ,WAAA,GAAc,GAAA,EAAM,OAAO,WAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,YAAA,CACpB,MAAA,EACA,SAAA,EACA,OAAA,EACA,MAAA,EAC6E;AAC7E,EAAA,MAAM,QAAA,GAAW,iBAAiB,SAAS,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,KAAA,CAAM,SAAS,EAAA,IAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAErE,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,MAAM,CAAA;AAE3C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,uBAAuB,MAAM,CAAA;AAE/C,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,WAAA,CAAY;AAAA,MACzC,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,QAAQ,MAAA,CAAO,IAAA;AAAA,MACf,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,qBAAA,EAAuB;AAC3C,MAAA,OAAO,aAAA,CAAc,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,GAAI,MAAM,MAAA,CAAO,QAAA;AAC1E,IAAA,MAAM,WAAA,GAAc,OAAO,cAAA,IAAkB,CAAA;AAE7C,IAAA,OAAO,EAAE,cAAA,EAAgB,WAAA,EAAa,SAAA,EAAU;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,aAAA,CAAc,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAA;AAAA,EACnD;AACF;AAEA,SAAS,aAAA,CACP,SAAA,EACA,MAAA,EACA,SAAA,EACoE;AACpE,EAAA,MAAM,cAAA,GAAiB,SAAA,KAAc,MAAA,GACjC,MAAA,GAAS,YACT,MAAA,GAAS,SAAA;AACb,EAAA,OAAO,EAAE,cAAA,EAAgB,WAAA,EAAa,CAAA,EAAG,SAAA,EAAU;AACrD;;;AC7NO,IAAM,eAAN,MAA0C;AAAA,EACtC,EAAA,GAAK,OAAA;AAAA,EACL,IAAA,GAAO,OAAA;AAAA,EACP,OAAA,GAAU,OAAA;AAAA,EACV,YAAA,GAA6C,CAAC,MAAM,CAAA;AAAA,EAErD,MAAA;AAAA,EAER,MAAM,KAAK,MAAA,EAAyC;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,EAAA,EAAY,MAAA,EAAoC;AAC3E,IAAA,OAAqB,YAAA;AAAA,MACnB,IAAA,CAAK,MAAA;AAAA,MACL,KAAK,WAAA,EAAY;AAAA,MACjB,GAAG,WAAA,EAAY;AAAA,MACf;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,OAAA,EACA,IAAA,EACA,EAAA,EACA,QACA,cAAA,EACyE;AACzE,IAAA,MAAM,MAAA,GAAS,MAAoB,WAAA,CAAY;AAAA,MAC7C,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,WAAA,EAAY;AAAA,MAC5B,OAAA,EAAS,GAAG,WAAA,EAAY;AAAA,MACxB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AAAA,EAEA,iBAAA,GAAyD;AACvD,IAAA,OAAO;AAAA,MACL,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAM;AAAA,MAC1B,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,MAAA;AAAO,KAC5B;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,GAAgC;AACpC,IAAA,OAAqB,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EAC/C;AACF;ACjDA,IAAMG,UAAAA,GAAY,iBAAiB,IAAA,CAAK,IAAA;AACxC,IAAM,GAAA,GAAM,IAAA;AACZ,IAAMC,kBAAAA,GAAoB,GAAA;AAC1B,IAAMC,MAAAA,GAAQ,KAAA;AAEd,IAAM,iBAAA,GAAoB,oEAAA;AAC1B,IAAM,mBAAA,GAAsB,wFAAA;AAC5B,IAAM,eAAA,GAAkB,oEAAA;AACxB,IAAM,cAAA,GAAiB,oEAAA;AACvB,IAAM,qBAAA,GAAwB,oEAAA;AAgC9B,SAAS,eAAA,CACP,eAAA,EACA,cAAA,EACA,cAAA,EACQ;AACR,EAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AACzC,EAAA,IAAI,kBAAkB,eAAA,CAAgB,CAAC,CAAA,EAAG,OAAO,eAAe,CAAC,CAAA;AACjE,EAAA,IAAI,cAAA,IAAkB,eAAA,CAAgB,eAAA,CAAgB,MAAA,GAAS,CAAC,CAAA,EAAG;AACjE,IAAA,OAAO,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AAAA,EACjD;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC/C,IAAA,IAAI,cAAA,IAAkB,eAAA,CAAgB,CAAC,CAAA,EAAG;AACxC,MAAA,MAAM,CAAA,GAAA,CACH,cAAA,GAAiB,eAAA,CAAgB,CAAA,GAAI,CAAC,CAAA,KACtC,eAAA,CAAgB,CAAC,CAAA,GAAI,eAAA,CAAgB,CAAA,GAAI,CAAC,CAAA,CAAA;AAC7C,MAAA,OAAO,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,IAAK,eAAe,CAAC,CAAA,GAAI,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,IAC9E;AAAA,EACF;AACA,EAAA,OAAO,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AACjD;AAEA,SAAS,aAAa,OAAA,EAAmE;AACvF,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,eAAA,GAAkB,EAAA,IAAM,OAAA,CAAQ,YAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,iBAAA,GAAoB,GAAA,GAAM,MAAM,OAAA,CAAQ,YAAA;AACjE,EAAA,MAAM,iBAAiB,SAAA,GAAY,QAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,cAAA,GAAiB,CAAA,GAAK,QAAA,GAAW,iBAAkB,GAAA,GAAM,CAAA;AAEhF,EAAA,IAAI,OAAA,CAAQ,kBAAkB,MAAA,KAAW,CAAA,SAAU,EAAE,YAAA,EAAc,CAAA,EAAG,aAAA,EAAe,CAAA,EAAE;AAEvF,EAAA,MAAM,OAAO,OAAA,CAAQ,gBAAA,CAAiB,IAAI,CAAC,CAAA,KAAM,IAAI,GAAG,CAAA;AACxD,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,OAAA,CAAQ,iBAAA,EAAmB,MAAM,cAAc,CAAA;AACpF,EAAA,MAAM,aAAA,GACH,iBAAiB,GAAA,IACjB,YAAA,GAAe,QACf,CAAA,GAAI,OAAA,CAAQ,eAAe,GAAA,CAAA,GAC5B,GAAA;AAEF,EAAA,OAAO,EAAE,cAAc,aAAA,EAAc;AACvC;AAEA,SAAS,YAAY,OAAA,EAA0B;AAC7C,EAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,CAAA,EAAG,OAAO,CAAA;AACvC,EAAA,MAAM,cACJ,OAAA,CAAQ,eAAA,GACR,QAAQ,iBAAA,GAAoB,GAAA,GAC5B,QAAQ,sBAAA,GAAyB,GAAA;AACnC,EAAA,OAAO,cAAc,OAAA,CAAQ,YAAA;AAC/B;AAQA,SAAS,EAAE,GAAA,EAAsB;AAC/B,EAAA,IAAI,OAAO,OAAO,GAAA,KAAQ,YAAY,QAAA,IAAY,GAAA,SAAa,GAAA,CAA2B,MAAA;AAC1F,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,IAAI,CAAA,EAAoB;AAAE,EAAA,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAG;AAC5D,SAAS,IAAI,CAAA,EAAoB;AAAE,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AAAG;AAE1D,SAAS,YAAA,CAAa,KAAc,KAAA,EAAwB;AAC1D,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,CAAA;AACf,EAAA,MAAM,aAAA,GAAgB,CAAA,CAAE,CAAA,CAAE,SAAS,CAAA;AACnC,EAAA,MAAM,SAAS,CAAA,CAAE,CAAA,CAAE,CAAA,CAAE,MAAM,GAAG,OAAO,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,GAAA,CAAI,aAAA,EAAe,IAAI,CAAA;AAAA,IACjC,YAAA,EAAc,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAAA,IACjC,eAAA,EAAiB,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAA;AAAA,IACvC,mBAAmB,GAAA,CAAI,CAAA,CAAE,CAAA,CAAE,eAAe,GAAG,KAAK,CAAA;AAAA,IAClD,YAAA,EAAc,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAAA,IACjC,wBAAwB,GAAA,CAAI,CAAA,CAAE,CAAA,CAAE,qBAAqB,GAAG,KAAK,CAAA;AAAA,IAC7D,yBAAyB,GAAA,CAAI,CAAA,CAAE,CAAA,CAAE,sBAAsB,GAAG,KAAK,CAAA;AAAA,IAC/D,UAAA,EAAY,GAAA,CAAI,MAAA,EAAQ,YAAY,CAAA;AAAA,IACpC,WAAA,EAAa,GAAA,CAAI,MAAA,EAAQ,aAAa,CAAA;AAAA,IACtC,YAAA,EAAc,GAAA,CAAI,MAAA,EAAQ,cAAc,CAAA;AAAA,IACxC,iBAAA,EAAmB,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,mBAAmB,CAAA,GAAK,MAAA,CAAO,mBAAA,CAAkC,GAAA,CAAI,GAAG,CAAA,GAAI,EAAC;AAAA,IACtH,gBAAA,EAAkB,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,kBAAkB,CAAA,GAAK,MAAA,CAAO,kBAAA,CAAiC,GAAA,CAAI,GAAG,CAAA,GAAI,EAAC;AAAA,IACnH,UAAA,EAAY;AAAA,GACd;AACF;AAEA,SAAS,gBAAgB,GAAA,EAAyB;AAChD,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,IACtC,GAAA,CAAI,QAAA,CAAuB,GAAA,CAAI,CAAC,CAAA,KAAM;AACrC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,OAAO;AAAA,MACL,UAAU,GAAA,CAAI,CAAA,CAAE,EAAA,CAAG,SAAS,GAAG,IAAI,CAAA;AAAA,MACnC,YAAA,EAAc,GAAA,CAAI,EAAA,CAAG,uBAAuB,CAAA;AAAA,MAC5C,UAAA,EAAY,GAAA,CAAI,EAAA,CAAG,mBAAmB;AAAA,KACxC;AAAA,EACF,CAAC,IACD,EAAC;AAEL,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,IACpC,GAAA,CAAI,OAAA,CAAsB,GAAA,CAAI,CAAC,CAAA,KAAM;AACpC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,OAAO;AAAA,MACL,UAAU,GAAA,CAAI,CAAA,CAAE,EAAA,CAAG,SAAS,GAAG,IAAI,CAAA;AAAA,MACnC,aAAa,GAAA,CAAI,CAAA,CAAE,EAAA,CAAG,eAAe,GAAG,KAAK,CAAA;AAAA,MAC7C,kBAAkB,GAAA,CAAI,CAAA,CAAE,EAAA,CAAG,sBAAsB,GAAG,KAAK,CAAA;AAAA,MACzD,UAAA,EAAY,GAAA,CAAI,EAAA,CAAG,mBAAmB;AAAA,KACxC;AAAA,EACF,CAAC,IACD,EAAC;AAEL,EAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAC7B;AAUO,IAAM,iBAAN,MAA+C;AAAA,EAC3C,EAAA,GAAK,SAAA;AAAA,EACL,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,OAAA;AAAA,EACV,YAAA,GAA6C,CAAC,MAAA,EAAQ,UAAU,CAAA;AAAA,EAChE,eAAA,GAAqC,CAAC,MAAM,CAAA;AAAA,EAC5C,uBAAA,GAA0B,KAAA;AAAA,EAE3B,MAAA;AAAA,EACA,WAAA,GAA6B,IAAA;AAAA,EAC7B,YAAA,GAAiC,IAAA;AAAA,EAEzC,MAAM,KAAK,MAAA,EAAyC;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAIA,MAAc,cAAA,GAAkC;AAC9C,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,EAAE,EAAA,EAAI,cAAA,EAAgB,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA,IAAQ,CAAA;AAC9F,MAAA,IAAI,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,QAAA,KAAa,YAAA,EAAc;AAChD,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,MAAA;AAChC,QAAA,IAAA,CAAK,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA;AACrC,QAAA,OAAO,IAAA,CAAK,WAAA;AAAA,MACd;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAqB;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAc,qBAAA;AACnB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAc,YAAA,CAAa,KAAA,GAAQ,KAAA,EAA2B;AAC5D,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,KAAA,SAAc,IAAA,CAAK,YAAA;AAE7C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU;AAAA,MACzC,EAAA,EAAI,iBAAA;AAAA,MACJ,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA;AAAK,KAC9B,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS,QAAA,KAAa,YAAA,EAAc;AACnD,MAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,uCAAuC,CAAA;AAAA,IACtF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAA;AACnC,IAAA,MAAM,cAAc,MAAA,CAAO,QAAA;AAE3B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,kCAAkC,CAAA;AAAA,IACjF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,YAAY,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,CAAA;AAChE,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEQ,WAAA,CAAY,UAAqB,KAAA,EAAoC;AAC3E,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,KAAA,KAAU,QAAQ,QAAA,GAAWF,UAAAA;AAAA,SAAA,IACxB,KAAA,KAAU,OAAO,QAAA,GAAW,eAAA;AAAA,SAAA,IAC5B,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG,QAAA,GAAW,KAAA;AAAA,SACrC,OAAO,MAAA;AAEZ,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAaG,yBAAmB,QAAQ,CAAA;AAC9C,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AAC1B,QAAA,IAAI;AAAE,UAAA,OAAOA,wBAAA,CAAmB,CAAA,CAAE,QAAQ,CAAA,KAAM,UAAA;AAAA,QAAY,CAAA,CAAA,MAAQ;AAAE,UAAA,OAAO,KAAA;AAAA,QAAO;AAAA,MACtF,CAAC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,MAAA;AAAA,IAAW;AAAA,EAC9B;AAAA,EAEA,MAAc,oBAAoB,OAAA,EAA2C;AAC3E,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,eAAe,CAAA,qCAAA,EAAwC,mBAAmB,CAAA,CAAA,CAAA;AAC7F,IAAA,MAAM,OAAwB,EAAC;AAC/B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB;AAAA,QAC7C,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,EAAE,UAAA,EAAY,OAAA,EAAQ;AAAA,QAC9B,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA,EAAK;AAAA,QAC7B,QAAQ,MAAA,IAAU;AAAA,OACnB,CAAA;AAED,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,IAAA,EAAM;AAC5B,QAAA,IAAI,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,QAAA,KAAa,YAAA,EAAc;AACnD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA;AACjC,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,EAAA,EAAI,KAAK,IAAA,CAAK,QAAA;AAAA,UACd,YAAA,EAAc,GAAA,CAAI,MAAA,CAAO,aAAa;AAAA,SACvC,CAAA;AAAA,MACH;AAEA,MAAA,MAAA,GAAS,IAAA,CAAK,UAAA;AACd,MAAA,OAAA,GAAU,IAAA,CAAK,WAAA;AAAA,IACjB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,YAAA,EAA2C;AACvE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,EAAE,EAAA,EAAI,YAAA,EAAc,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA,IAAQ,CAAA;AAC5F,IAAA,IAAI,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,QAAA,KAAa,YAAA,EAAc;AAChD,MAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,mCAAmC,CAAA;AAAA,IAClF;AACA,IAAA,OAAO,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,MAAgB,CAAA;AAAA,EAC1D;AAAA,EAEQ,cAAc,QAAA,EAA0B;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAaA,yBAAmB,QAAQ,CAAA;AAC9C,MAAA,IAAI,UAAA,KAAeA,wBAAA,CAAmBH,UAAS,CAAA,EAAG,OAAO,MAAA;AACzD,MAAA,IAAI,UAAA,KAAeG,wBAAA,CAAmB,eAAe,CAAA,EAAG,OAAO,KAAA;AAAA,IACjE,CAAA,CAAA,MAAQ;AAAA,IAAqB;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,SAAA;AAAA,EACpC;AAAA;AAAA,EAIA,MAAM,SAAS,KAAA,EAAsC;AACnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,EAAa;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,SAAS,MAAM,IAAI,WAAW,qBAAA,EAAuB,CAAA,yBAAA,EAA4B,KAAK,CAAA,CAAE,CAAA;AAE7F,IAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAc,GAAI,aAAa,OAAO,CAAA;AAC5D,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,WAAW,YAAA,EAAa;AAAA,EAClE;AAAA,EAEA,MAAM,aAAa,OAAA,EAA4C;AAC7D,IAAA,MAAM,WAAkE,EAAC;AACzE,IAAA,MAAM,UAAiE,EAAC;AAExE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,UAAU,OAAA,EAAQ;AAElD,IAAA,MAAM,CAAC,QAAA,EAAU,UAAU,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC/C,KAAK,YAAA,EAAa;AAAA,MAClB,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,EAAE,YAAY;AAAA,KAC1C,CAAA;AAED,IAAA,KAAA,MAAW,GAAA,IAAO,WAAW,QAAA,EAAU;AACrC,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACvC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,KAAA,GAAQ,YAAY,OAAO,CAAA;AACjC,MAAA,MAAM,MAAA,GAAU,GAAA,CAAI,YAAA,GAAe,KAAA,GAAS,MAAM,OAAA,CAAQ,YAAA;AAC1D,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,YAAA,CAAa,OAAO,CAAA;AAC9C,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAA,EAAQ,GAAA,EAAK,aAAA,EAAe,CAAA;AAAA,IACvF;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,WAAW,OAAA,EAAS;AACpC,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACvC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,WAAA,GAAc,GAAA,GAAM,MAAM,OAAA,CAAQ,YAAA;AACxD,MAAA,MAAM,WAAA,GAAc,QAAQ,uBAAA,GAA0B,GAAA;AACtD,MAAA,MAAM,OAAA,GAAU,IAAI,gBAAA,GAAmB,GAAA;AACvC,MAAA,MAAM,UAAA,GAAa,OAAA,GAAU,CAAA,GAAI,SAAA,IAAa,cAAc,OAAA,CAAA,GAAW,SAAA;AACvE,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,YAAA,CAAa,OAAO,CAAA;AAC7C,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,YAAA,EAAc,CAAA;AAAA,IACjG;AAEA,IAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAAA,EAC7B;AAAA,EAEA,MAAM,UAAU,OAAA,EAAsC;AACpD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,EAAE,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,CAAA,EAAG,UAAU,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,oBAAA,EAAsB,CAAA,EAAE;AAAA,IACnG;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AACpE,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAEnE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,EAAa;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,SAAS,WAAA,IAAe,EAAA;AACzC,IAAA,MAAM,OAAA,GAAU,SAAS,UAAA,IAAc,EAAA;AACvC,IAAA,MAAM,eAAe,QAAA,GAAW,GAAA;AAEhC,IAAA,MAAM,YAAA,GAAe,QAAA,GAAW,CAAA,GAAK,QAAA,GAAW,eAAgB,QAAA,GAAW,QAAA;AAC3E,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,IAAY,OAAA,GAAU,OAAO,QAAQ,CAAA;AAEnE,IAAA,OAAO,EAAE,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,sBAAsB,YAAA,EAAa;AAAA,EAC3F;AAAA,EAEA,MAAM,WAAA,CACJ,OAAA,EACA,MAAA,EACA,QACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,CAAC,GAAA,EAAK,QAAQ,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,CAAK,cAAA,EAAe,EAAG,IAAA,CAAK,YAAA,EAAc,CAAC,CAAA;AACtF,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,UAAA,CAAW,uBAAuB,mCAAmC,CAAA;AAEjG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACnD,IAAA,MAAM,EAAA,GAAK,IAAIN,wBAAAA,EAAY;AAC3B,IAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,QAC3B,MAAA,EAAQ,GAAG,GAAG,CAAA,mCAAA,CAAA;AAAA,QACd,aAAA,EAAe,CAAC,mBAAmB,CAAA;AAAA,QACnC,SAAA,EAAW,CAAC,EAAA,CAAG,MAAA,CAAO,iBAAiB,CAAC;AAAA,OACzC,CAAA;AACD,MAAA,MAAA,GAAS,MAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,CAAE,EAAA;AAAA,IACnB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,SAASG,UAAS,CAAA;AAC5D,IAAA,IAAI,SAAS,MAAA,KAAW,CAAA,QAAS,IAAI,UAAA,CAAW,wBAAwB,qBAAqB,CAAA;AAE7F,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,CAAC,CAAA,CAAE,YAAA;AAClC,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,EAAA,CAAG,WAAW,EAAA,CAAG,MAAA,CAAO,aAAa,CAAA,EAAG,SAAS,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAA,CAAG,OAAO,CAAA,CAAE,YAAY,CAAC,CAAC,CAAA;AAAA,IACjG;AAEA,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAM,CAAA,CAAE,QAAA,EAAS;AAC7C,IAAA,MAAM,CAAC,WAAW,CAAA,GAAI,EAAA,CAAG,UAAA,CAAW,EAAA,CAAG,MAAA,CAAO,aAAa,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEzE,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,iBAAA,CAAkB,EAAA,EAAI,aAA0C,MAAM,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,CAAC,OAAO,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,MAC5B,MAAA,EAAQ,GAAG,GAAG,CAAA,oDAAA,CAAA;AAAA,MACd,aAAA,EAAe,CAAC,mBAAA,EAAqBA,UAAS,CAAA;AAAA,MAC9C,SAAA,EAAW;AAAA,QACT,EAAA,CAAG,OAAO,iBAAiB,CAAA;AAAA,QAC3B,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,UAAU,CAAA;AAAA,QAClC,EAAA,CAAG,OAAOE,MAAK,CAAA;AAAA,QACf;AAAA;AACF,KACD,CAAA;AAED,IAAA,EAAA,CAAG,QAAA,CAAS;AAAA,MACV,MAAA,EAAQ,GAAG,GAAG,CAAA,iDAAA,CAAA;AAAA,MACd,aAAA,EAAe,CAAC,mBAAA,EAAqBF,UAAS,CAAA;AAAA,MAC9C,SAAA,EAAW;AAAA,QACT,EAAA,CAAG,OAAO,iBAAiB,CAAA;AAAA,QAC3B,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,UAAU,CAAA;AAAA,QAClC,OAAO,MAAA,KAAW,QAAA,GAAW,EAAA,CAAG,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AAAA,QACjD,EAAA,CAAG,OAAOE,MAAK,CAAA;AAAA,QACf;AAAA;AACF,KACD,CAAA;AAED,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,EAAA,CAAG,eAAA,CAAgB,CAAC,MAAM,CAAA,EAAG,OAAO,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AAAA,EAEA,MAAM,eAAA,CACJ,OAAA,EACA,MAAA,EACA,MAAA,EACwD;AACxD,IAAA,MAAM,CAAC,GAAA,EAAK,QAAQ,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,CAAK,gBAAe,EAAG,IAAA,CAAK,YAAA,CAAa,IAAI,CAAC,CAAC,CAAA;AAC1F,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,UAAA,CAAW,uBAAuB,mCAAmC,CAAA;AAEjG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACnD,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,QAAS,IAAI,UAAA,CAAW,iBAAiB,2BAA2B,CAAA;AAExF,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA,EAAG,MAAA,IAAU,CAAA;AAChF,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,SAAS,CAAA;AAClD,IAAA,IAAI,mBAAmB,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,iBAAiB,kCAAkC,CAAA;AAElG,IAAA,MAAM,KAAA,GAAQ,YAAY,WAAW,CAAA;AACrC,IAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,kBAAkB,EAAA,IAAM,WAAA,CAAY,eAAe,KAAK,CAAA;AAEvF,IAAA,MAAM,EAAA,GAAK,IAAIL,wBAAAA,EAAY;AAC3B,IAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,IAAA,MAAM,CAAC,OAAO,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,MAC5B,MAAA,EAAQ,GAAG,GAAG,CAAA,kCAAA,CAAA;AAAA,MACd,aAAA,EAAe,CAAC,mBAAA,EAAqBG,UAAS,CAAA;AAAA,MAC9C,SAAA,EAAW;AAAA,QACT,EAAA,CAAG,OAAO,iBAAiB,CAAA;AAAA,QAC3B,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,UAAU,CAAA;AAAA,QAClC,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,EAAE,CAAA;AAAA,QACpB,EAAA,CAAG,OAAOE,MAAK,CAAA;AAAA,QACf,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,YAAY;AAAA;AAC1B,KACD,CAAA;AAED,IAAA,MAAM,gBAAgB,CAAA,EAAG,eAAe,CAAA,uCAAA,EAA0C,mBAAmB,KAAKF,UAAS,CAAA,CAAA,CAAA;AACnH,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,MACzB,MAAA,EAAQ,mBAAA;AAAA,MACR,aAAA,EAAe,CAAC,aAAa;AAAA,KAC9B,CAAA;AAED,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,MACzB,MAAA,EAAQ,GAAG,GAAG,CAAA,uDAAA,CAAA;AAAA,MACd,aAAA,EAAe,CAAC,mBAAA,EAAqBA,UAAS,CAAA;AAAA,MAC9C,SAAA,EAAW;AAAA,QACT,EAAA,CAAG,OAAO,iBAAiB,CAAA;AAAA,QAC3B,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,UAAU,CAAA;AAAA,QAClC,EAAA,CAAG,OAAOE,MAAK,CAAA;AAAA,QACf,OAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAED,IAAA,EAAA,CAAG,eAAA,CAAgB,CAAC,IAAI,CAAA,EAAG,OAAO,CAAA;AAElC,IAAA,OAAO,EAAE,IAAI,eAAA,EAAgB;AAAA,EAC/B;AAAA,EAEA,MAAM,aAAA,CACJ,QAAA,EACA,OAAA,EACA,QACA,QAAA,EAC0B;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,qBAAA,EAAuB,mFAAmF,CAAA;AAAA,EACjI;AAAA,EAEA,MAAM,YAAA,CACJ,QAAA,EACA,OAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,qBAAA,EAAuB,qCAAqC,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,WAAA,CACJ,OAAA,EACA,MAAA,EAC8E;AAC9E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAE3C,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAA,SAAA,GAAY,MAAA,CAAO,QAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,WAAY,MAAA,CAAO,QAAA,GAAWD,kBAAAA,GAAqB,MAAA,CAAO,oBAAoB,CAAA;AAAA,IAC/G;AAEA,IAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,GAAW,SAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,OAAO,QAAA,GAAW,CAAA,GAC7B,kBAAkB,MAAA,CAAO,oBAAA,GAAwB,OAAO,QAAA,GACzD,QAAA;AAEJ,IAAA,OAAO,EAAE,SAAA,EAAW,iBAAA,EAAmB,OAAA,EAAS,SAAA,EAAW,OAAO,YAAA,EAAa;AAAA,EACjF;AAAA,EAEA,MAAM,SAAA,CACJ,QAAA,EACA,MAAA,EAC8E;AAC9E,IAAA,MAAM,IAAI,UAAA,CAAW,qBAAA,EAAuB,yCAAyC,CAAA;AAAA,EACvF;AAAA,EAEA,MAAc,aAAA,CACZ,KAAA,EACA,QAAA,EAC2D;AAC3D,IAAA,MAAM,MAAwD,EAAC;AAC/D,IAAA,IAAI,MAAA,GAAoC,IAAA;AACxC,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,MAAA,IAAU,MAAA,EAAW,CAAA;AACxF,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,MAAO,EAAE,YAAA,EAAc,EAAE,YAAA,EAAc,OAAA,EAAS,CAAA,CAAE,OAAA,GAAU,CAAC,CAAA;AACxF,MAAA,MAAA,GAAS,IAAA,CAAK,UAAA;AACd,MAAA,OAAA,GAAU,IAAA,CAAK,WAAA;AAAA,IACjB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AACF","file":"index.cjs","sourcesContent":["import type {\n LendingAdapter,\n SwapAdapter,\n LendingRates,\n SwapQuote,\n AdapterPositions,\n} from './types.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n private swap: Map<string, SwapAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n registerSwap(adapter: SwapAdapter): void {\n this.swap.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 Error(`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 Error(`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 bestSwapQuote(from: string, to: string, amount: number): Promise<{ adapter: SwapAdapter; quote: SwapQuote }> {\n const candidates: Array<{ adapter: SwapAdapter; quote: SwapQuote }> = [];\n\n for (const adapter of this.swap.values()) {\n const pairs = adapter.getSupportedPairs();\n if (!pairs.some(p => p.from === from && p.to === to)) continue;\n try {\n const quote = await adapter.getQuote(from, to, amount);\n candidates.push({ adapter, quote });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new Error(`No swap adapter supports ${from} → ${to}`);\n }\n\n candidates.sort((a, b) => b.quote.expectedOutput - a.quote.expectedOutput);\n return candidates[0];\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 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 {\n // skip\n }\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n getSwap(id: string): SwapAdapter | undefined {\n return this.swap.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n\n listSwap(): SwapAdapter[] {\n return [...this.swap.values()];\n }\n}\n","export 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)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const SWAP_FEE_BPS = 0n; // Free — Cetus already charges pool fees\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 },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_UPGRADE_CAP_ID = '0xef28746d40f43ca6be1352102cef0152133bf5594e69caab28f40b1de74490c1';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\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\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\nexport const CETUS_GLOBAL_CONFIG = '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f';\nexport const CETUS_PACKAGE = '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb';\n\nexport const SENTINEL = {\n PACKAGE: '0x88b83f36dafcd5f6dcdcf1d2cb5889b03f61264ab3cee9cae35db7aa940a21b7',\n AGENT_REGISTRY: '0xc47564f5f14c12b31e0dfa1a3dc99a6380a1edf8929c28cb0eaa3359c8db36ac',\n ENCLAVE: '0xfb1261aeb9583514cb1341a548a5ec12d1231bd96af22215f1792617a93e1213',\n PROTOCOL_CONFIG: '0x2fa4fa4a1dd0498612304635ff9334e1b922e78af325000e9d9c0e88adea459f',\n TEE_API: 'https://app.suisentinel.xyz/api/consume-prompt',\n SENTINELS_API: 'https://api.suisentinel.xyz/agents/mainnet',\n RANDOM: '0x8',\n MIN_FEE_MIST: 100_000_000n, // 0.1 SUI\n MAX_PROMPT_TOKENS: 600,\n} as const;\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'SLIPPAGE_EXCEEDED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'FACILITATOR_TIMEOUT'\n | 'SENTINEL_API_ERROR'\n | 'SENTINEL_NOT_FOUND'\n | 'SENTINEL_TX_FAILED'\n | 'SENTINEL_TEE_ERROR'\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 };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS } 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 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","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n SWAP_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'swap' | 'borrow';\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 swap: SWAP_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n swap: 1,\n borrow: 2,\n};\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 = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { bcs } from '@mysten/sui/bcs';\nimport { SUPPORTED_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { usdcToRaw } from '../utils/format.js';\nimport { addCollectFeeToTx } from './protocolFee.js';\nimport type {\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n GasMethod,\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst RATE_DECIMALS = 27;\nconst LTV_DECIMALS = 27;\nconst MIN_HEALTH_FACTOR = 1.5;\nconst WITHDRAW_DUST_BUFFER = 0.001;\nconst CLOCK = '0x06';\nconst SUI_SYSTEM_STATE = '0x05';\nconst NAVI_BALANCE_DECIMALS = 9;\nconst CONFIG_API = 'https://open-api.naviprotocol.io/api/navi/config?env=prod';\nconst POOLS_API = 'https://open-api.naviprotocol.io/api/navi/pools?env=prod';\n\nconst PACKAGE_API = 'https://open-api.naviprotocol.io/api/package';\nlet packageCache: { id: string; ts: number } | null = null;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface NaviConfig {\n package: string;\n storage: string;\n incentiveV2: string;\n incentiveV3: string;\n uiGetter: string;\n oracle: { packageId: string; priceOracle: string };\n}\n\ninterface NaviPool {\n id: number;\n coinType: string;\n suiCoinType: string;\n currentSupplyRate: string;\n currentBorrowRate: string;\n currentSupplyIndex: string;\n currentBorrowIndex: string;\n ltv: string;\n liquidationFactor: { bonus: string; ratio: string; threshold: string };\n contract: { reserveId: string; pool: string };\n token: { symbol: string; decimals: number; price: number };\n}\n\ninterface UserState {\n assetId: number;\n supplyBalance: bigint;\n borrowBalance: bigint;\n}\n\nfunction toBigInt(v: unknown): bigint {\n if (typeof v === 'bigint') return v;\n return BigInt(String(v));\n}\n\n// ---------------------------------------------------------------------------\n// BCS\n// ---------------------------------------------------------------------------\n\nconst UserStateInfo = bcs.struct('UserStateInfo', {\n asset_id: bcs.u8(),\n borrow_balance: bcs.u256(),\n supply_balance: bcs.u256(),\n});\n\nfunction decodeDevInspect<T>(\n result: { results?: Array<{ returnValues?: Array<[number[], string]> }> | null; error?: string | null },\n schema: { parse: (data: Uint8Array) => T },\n): T | undefined {\n const rv = result.results?.[0]?.returnValues?.[0];\n if (result.error || !rv) return undefined;\n const bytes = Uint8Array.from(rv[0]);\n return schema.parse(bytes);\n}\n\n// ---------------------------------------------------------------------------\n// Config + Pool cache\n// ---------------------------------------------------------------------------\n\nlet configCache: { data: NaviConfig; ts: number } | null = null;\nlet poolsCache: { data: NaviPool[]; ts: number } | null = null;\nconst CACHE_TTL = 5 * 60_000;\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI API error: ${res.status}`);\n const json = (await res.json()) as { data?: T; code?: number };\n return (json.data ?? json) as T;\n}\n\nasync function getLatestPackageId(): Promise<string> {\n if (packageCache && Date.now() - packageCache.ts < CACHE_TTL) return packageCache.id;\n const res = await fetch(PACKAGE_API);\n if (!res.ok) throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI package API error: ${res.status}`);\n const json = (await res.json()) as { packageId?: string };\n if (!json.packageId) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'NAVI package API returned no packageId');\n packageCache = { id: json.packageId, ts: Date.now() };\n return json.packageId;\n}\n\nasync function getConfig(fresh = false): Promise<NaviConfig> {\n if (configCache && !fresh && Date.now() - configCache.ts < CACHE_TTL) return configCache.data;\n const [data, latestPkg] = await Promise.all([\n fetchJson<NaviConfig>(CONFIG_API),\n getLatestPackageId(),\n ]);\n data.package = latestPkg;\n configCache = { data, ts: Date.now() };\n return data;\n}\n\nasync function getPools(fresh = false): Promise<NaviPool[]> {\n if (poolsCache && !fresh && Date.now() - poolsCache.ts < CACHE_TTL) return poolsCache.data;\n const data = await fetchJson<NaviPool[]>(POOLS_API);\n poolsCache = { data, ts: Date.now() };\n return data;\n}\n\nasync function getUsdcPool(): Promise<NaviPool> {\n const pools = await getPools();\n const usdc = pools.find(\n (p) => p.token?.symbol === 'USDC' || p.coinType?.toLowerCase().includes('usdc'),\n );\n if (!usdc) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'USDC pool not found on NAVI');\n return usdc;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractGasCost(effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null): number {\n if (!effects?.gasUsed) return 0;\n return Math.abs(\n (Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)) / 1e9,\n );\n}\n\nfunction rateToApy(rawRate: string): number {\n if (!rawRate || rawRate === '0') return 0;\n return Number(BigInt(rawRate)) / 10 ** RATE_DECIMALS * 100;\n}\n\nfunction parseLtv(rawLtv: string): number {\n if (!rawLtv || rawLtv === '0') return 0.75;\n return Number(BigInt(rawLtv)) / 10 ** LTV_DECIMALS;\n}\n\nfunction parseLiqThreshold(val: string | number): number {\n if (typeof val === 'number') return val;\n const n = Number(val);\n if (n > 1) return Number(BigInt(val)) / 10 ** LTV_DECIMALS;\n return n;\n}\n\nfunction normalizeHealthFactor(raw: number): number {\n const v = raw / 10 ** RATE_DECIMALS;\n return v > 1e5 ? Infinity : v;\n}\n\nfunction compoundBalance(rawBalance: bigint, currentIndex: string): number {\n if (!rawBalance || !currentIndex || currentIndex === '0') return 0;\n const scale = BigInt('1' + '0'.repeat(RATE_DECIMALS));\n const half = scale / 2n;\n const result = (rawBalance * scale + half) / BigInt(currentIndex);\n return Number(result) / 10 ** NAVI_BALANCE_DECIMALS;\n}\n\n// ---------------------------------------------------------------------------\n// On-chain reads\n// ---------------------------------------------------------------------------\n\nasync function getUserState(client: SuiJsonRpcClient, address: string): Promise<UserState[]> {\n const config = await getConfig();\n const tx = new Transaction();\n tx.moveCall({\n target: `${config.uiGetter}::getter_unchecked::get_user_state`,\n arguments: [tx.object(config.storage), tx.pure.address(address)],\n });\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address,\n });\n\n const decoded = decodeDevInspect(result, bcs.vector(UserStateInfo));\n if (!decoded) return [];\n\n return (decoded as Array<{ asset_id: number; supply_balance: unknown; borrow_balance: unknown }>)\n .map((s) => ({\n assetId: s.asset_id,\n supplyBalance: toBigInt(s.supply_balance),\n borrowBalance: toBigInt(s.borrow_balance),\n }))\n .filter((s) => s.supplyBalance !== 0n || s.borrowBalance !== 0n);\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\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\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\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 return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean } = {},\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n const [config, pool] = await Promise.all([getConfig(), getUsdcPool()]);\n\n const coins = await fetchCoins(client, address, USDC_TYPE);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coinObj, 'save');\n }\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coinObj,\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n return tx;\n}\n\nexport async function save(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<SaveResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildSaveTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const rates = await getRates(client);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n apy: rates.USDC.saveApy,\n fee: 0,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n savingsBalance: amount,\n };\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const [config, pool, pools, states] = await Promise.all([\n getConfig(),\n getUsdcPool(),\n getPools(),\n getUserState(client, address),\n ]);\n\n const usdcState = states.find((s) => s.assetId === pool.id);\n const deposited = usdcState ? compoundBalance(usdcState.supplyBalance, pool.currentSupplyIndex) : 0;\n\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - WITHDRAW_DUST_BUFFER));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', 'Nothing to withdraw');\n\n const rawAmount = Number(usdcToRaw(effectiveAmount));\n const tx = new Transaction();\n tx.setSender(address);\n\n const [balance] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object(SUI_SYSTEM_STATE),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n const [coin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [balance],\n typeArguments: [pool.suiCoinType],\n });\n\n tx.transferObjects([coin], address);\n\n return { tx, effectiveAmount };\n}\n\nexport async function withdraw(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<WithdrawResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const { tx, effectiveAmount } = await buildWithdrawTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n success: true,\n tx: result.digest,\n amount: effectiveAmount,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean } = {},\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n const [config, pool] = await Promise.all([getConfig(), getUsdcPool()]);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [balance] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object(SUI_SYSTEM_STATE),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n const [borrowedCoin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [balance],\n typeArguments: [pool.suiCoinType],\n });\n\n tx.transferObjects([borrowedCoin], address);\n\n return tx;\n}\n\nexport async function borrow(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<BorrowResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildBorrowTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const hfResult = await getHealthFactor(client, address);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n fee: 0,\n healthFactor: hfResult.healthFactor,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n const [config, pool] = await Promise.all([getConfig(), getUsdcPool()]);\n\n const coins = await fetchCoins(client, address, USDC_TYPE);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins to repay with');\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coinObj,\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n return tx;\n}\n\nexport async function repay(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<RepayResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildRepayTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const states = await getUserState(client, address);\n const pool = await getUsdcPool();\n const usdcState = states.find((s) => s.assetId === pool.id);\n const remainingDebt = usdcState ? compoundBalance(usdcState.borrowBalance, pool.currentBorrowIndex) : 0;\n\n return {\n success: true,\n tx: result.digest,\n amount,\n remainingDebt,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<HealthFactorResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\n\n const [config, pool, states] = await Promise.all([\n getConfig(),\n getUsdcPool(),\n getUserState(client, address),\n ]);\n\n const usdcState = states.find((s) => s.assetId === pool.id);\n const supplied = usdcState ? compoundBalance(usdcState.supplyBalance, pool.currentSupplyIndex) : 0;\n const borrowed = usdcState ? compoundBalance(usdcState.borrowBalance, pool.currentBorrowIndex) : 0;\n\n const ltv = parseLtv(pool.ltv);\n const liqThreshold = parseLiqThreshold(pool.liquidationFactor.threshold);\n const maxBorrowVal = Math.max(0, supplied * ltv - borrowed);\n\n let healthFactor: number;\n if (borrowed <= 0) {\n healthFactor = Infinity;\n } else {\n try {\n const tx = new Transaction();\n tx.moveCall({\n target: `${config.uiGetter}::calculator_unchecked::dynamic_health_factor`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.storage),\n tx.object(config.oracle.priceOracle),\n tx.pure.u8(pool.id),\n tx.pure.address(address),\n tx.pure.u8(pool.id),\n tx.pure.u64(0),\n tx.pure.u64(0),\n tx.pure.bool(false),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address,\n });\n\n const decoded = decodeDevInspect(result, bcs.u256());\n if (decoded !== undefined) {\n healthFactor = normalizeHealthFactor(Number(decoded));\n } else {\n healthFactor = borrowed > 0 ? (supplied * liqThreshold) / borrowed : Infinity;\n }\n } catch {\n healthFactor = borrowed > 0 ? (supplied * liqThreshold) / borrowed : Infinity;\n }\n }\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow: maxBorrowVal,\n liquidationThreshold: liqThreshold,\n };\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pool = await getUsdcPool();\n\n let saveApy = rateToApy(pool.currentSupplyRate);\n let borrowApy = rateToApy(pool.currentBorrowRate);\n\n if (saveApy <= 0 || saveApy > 100) saveApy = 4.0;\n if (borrowApy <= 0 || borrowApy > 100) borrowApy = 6.0;\n\n return { USDC: { saveApy, borrowApy } };\n } catch {\n return { USDC: { saveApy: 4.0, borrowApy: 6.0 } };\n }\n}\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<PositionsResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\n\n const [states, pools] = await Promise.all([getUserState(client, address), getPools()]);\n const positions: PositionEntry[] = [];\n\n for (const state of states) {\n const pool = pools.find((p) => p.id === state.assetId);\n if (!pool) continue;\n\n const symbol = pool.token?.symbol ?? 'UNKNOWN';\n const supplyBal = compoundBalance(state.supplyBalance, pool.currentSupplyIndex);\n const borrowBal = compoundBalance(state.borrowBalance, pool.currentBorrowIndex);\n\n if (supplyBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'save',\n amount: supplyBal,\n apy: rateToApy(pool.currentSupplyRate),\n });\n }\n\n if (borrowBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'borrow',\n amount: borrowBal,\n apy: rateToApy(pool.currentBorrowRate),\n });\n }\n }\n\n return { positions };\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\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 / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n} from './types.js';\nimport * as naviProtocol from '../protocols/navi.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[] = ['USDC'];\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 key = asset.toUpperCase() as keyof typeof rates;\n const r = rates[key];\n if (!r) throw new Error(`NAVI does not support ${asset}`);\n return { asset, 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, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, 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 options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, options);\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n _asset: string,\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount);\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n _asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, options);\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n _asset: string,\n ): Promise<AdapterTxResult> {\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount);\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk';\nimport { SUPPORTED_ASSETS, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { GasMethod } from '../types.js';\n\nconst DEFAULT_SLIPPAGE_BPS = 300; // 3%\n\nexport interface SwapParams {\n client: SuiJsonRpcClient;\n keypair: Ed25519Keypair;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}\n\nexport interface SwapTxResult {\n digest: string;\n fromAmount: number;\n fromAsset: string;\n toAmount: number;\n toAsset: string;\n priceImpact: number;\n gasCost: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nexport interface SwapBuildResult {\n tx: Transaction;\n estimatedOut: number;\n toDecimals: number;\n}\n\nfunction createAggregatorClient(client: SuiJsonRpcClient, signer?: string): AggregatorClient {\n // Cetus SDK bundles @mysten/sui v1 internally — the runtime API is\n // identical to SuiJsonRpcClient, so the cast is safe.\n return new AggregatorClient({\n client: client as never,\n signer,\n env: Env.Mainnet,\n });\n}\n\nexport async function buildSwapTx(params: {\n client: SuiJsonRpcClient;\n address: string;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const aggClient = createAggregatorClient(client, address);\n\n const result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `No swap route found for ${fromAsset} → ${toAsset}`,\n );\n }\n\n const tx = new Transaction();\n const slippage = maxSlippageBps / 10000;\n\n await aggClient.fastRouterSwap({\n router: result,\n txb: tx as never,\n slippage,\n });\n\n const estimatedOut = Number(result.amountOut.toString());\n\n return {\n tx,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\nexport async function executeSwap(params: SwapParams): Promise<SwapTxResult> {\n const { client, keypair, fromAsset, toAsset, amount, maxSlippageBps } = params;\n const address = keypair.getPublicKey().toSuiAddress();\n const toInfo = SUPPORTED_ASSETS[toAsset];\n\n const { tx, estimatedOut, toDecimals } = await buildSwapTx({\n client,\n address,\n fromAsset,\n toAsset,\n amount,\n maxSlippageBps,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let actualReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = estimatedOut / 10 ** toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n return {\n digest: result.digest,\n fromAmount: amount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n gasCost: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nexport async function getPoolPrice(client: SuiJsonRpcClient): Promise<number> {\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 suiPriceUsd = 1e3 / rawPrice;\n if (suiPriceUsd > 0.01 && suiPriceUsd < 1000) return suiPriceUsd;\n }\n }\n } catch {\n // Fallback\n }\n\n return 3.5;\n}\n\nexport async function getSwapQuote(\n client: SuiJsonRpcClient,\n fromAsset: 'USDC' | 'SUI',\n toAsset: 'USDC' | 'SUI',\n amount: number,\n): Promise<{ expectedOutput: number; priceImpact: number; poolPrice: number }> {\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const poolPrice = await getPoolPrice(client);\n\n try {\n const aggClient = createAggregatorClient(client);\n\n const result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!result || result.insufficientLiquidity) {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n\n const expectedOutput = Number(result.amountOut.toString()) / 10 ** toInfo.decimals;\n const priceImpact = result.deviationRatio ?? 0;\n\n return { expectedOutput, priceImpact, poolPrice };\n } catch {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n}\n\nfunction fallbackQuote(\n fromAsset: string,\n amount: number,\n poolPrice: number,\n): { expectedOutput: number; priceImpact: number; poolPrice: number } {\n const expectedOutput = fromAsset === 'USDC'\n ? amount / poolPrice\n : amount * poolPrice;\n return { expectedOutput, priceImpact: 0, poolPrice };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type {\n SwapAdapter,\n SwapQuote,\n AdapterTxResult,\n AdapterCapability,\n} from './types.js';\nimport * as cetusProtocol from '../protocols/cetus.js';\n\nexport class CetusAdapter implements SwapAdapter {\n readonly id = 'cetus';\n readonly name = 'Cetus';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['swap'];\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 getQuote(from: string, to: string, amount: number): Promise<SwapQuote> {\n return cetusProtocol.getSwapQuote(\n this.client,\n from.toUpperCase() as 'USDC' | 'SUI',\n to.toUpperCase() as 'USDC' | 'SUI',\n amount,\n );\n }\n\n async buildSwapTx(\n address: string,\n from: string,\n to: string,\n amount: number,\n maxSlippageBps?: number,\n ): Promise<AdapterTxResult & { estimatedOut: number; toDecimals: number }> {\n const result = await cetusProtocol.buildSwapTx({\n client: this.client,\n address,\n fromAsset: from.toUpperCase() as 'USDC' | 'SUI',\n toAsset: to.toUpperCase() as 'USDC' | 'SUI',\n amount,\n maxSlippageBps,\n });\n return {\n tx: result.tx,\n estimatedOut: result.estimatedOut,\n toDecimals: result.toDecimals,\n };\n }\n\n getSupportedPairs(): Array<{ from: string; to: string }> {\n return [\n { from: 'USDC', to: 'SUI' },\n { from: 'SUI', to: 'USDC' },\n ];\n }\n\n async getPoolPrice(): Promise<number> {\n return cetusProtocol.getPoolPrice(this.client);\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n} from './types.js';\nimport { SUPPORTED_ASSETS } from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\nimport { T2000Error } from '../errors.js';\nimport { addCollectFeeToTx } from '../protocols/protocolFee.js';\nimport type { TransactionObjectArgument } from '@mysten/sui/transactions';\n\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst WAD = 1e18;\nconst MIN_HEALTH_FACTOR = 1.5;\nconst CLOCK = '0x6';\n\nconst LENDING_MARKET_ID = '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1';\nconst LENDING_MARKET_TYPE = '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL';\nconst SUILEND_PACKAGE = '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf';\nconst UPGRADE_CAP_ID = '0x3d4ef1859c3ee9fc72858f588b56a09da5466e64f8cc4e90a7b3b909fba8a7ae';\nconst FALLBACK_PUBLISHED_AT = '0xd2a67633ccb8de063163e25bcfca242929caf5cf1a26c2929dab519ee0b8f331';\n\ninterface Reserve {\n coinType: string;\n mintDecimals: number;\n availableAmount: number;\n borrowedAmountWad: number;\n ctokenSupply: number;\n unclaimedSpreadFeesWad: number;\n cumulativeBorrowRateWad: number;\n openLtvPct: number;\n closeLtvPct: number;\n spreadFeeBps: number;\n interestRateUtils: number[];\n interestRateAprs: number[];\n arrayIndex: number;\n}\n\ninterface ObligationCap {\n id: string;\n obligationId: string;\n}\n\ninterface Obligation {\n deposits: Array<{ coinType: string; ctokenAmount: number; reserveIdx: number }>;\n borrows: Array<{ coinType: string; borrowedWad: number; cumBorrowRateWad: number; reserveIdx: number }>;\n}\n\n// ---------------------------------------------------------------------------\n// Rate math (unchanged from SDK-based version)\n// ---------------------------------------------------------------------------\n\nfunction interpolateRate(\n utilBreakpoints: number[],\n aprBreakpoints: number[],\n utilizationPct: number,\n): number {\n if (utilBreakpoints.length === 0) return 0;\n if (utilizationPct <= utilBreakpoints[0]) return aprBreakpoints[0];\n if (utilizationPct >= utilBreakpoints[utilBreakpoints.length - 1]) {\n return aprBreakpoints[aprBreakpoints.length - 1];\n }\n\n for (let i = 1; i < utilBreakpoints.length; i++) {\n if (utilizationPct <= utilBreakpoints[i]) {\n const t =\n (utilizationPct - utilBreakpoints[i - 1]) /\n (utilBreakpoints[i] - utilBreakpoints[i - 1]);\n return aprBreakpoints[i - 1] + t * (aprBreakpoints[i] - aprBreakpoints[i - 1]);\n }\n }\n return aprBreakpoints[aprBreakpoints.length - 1];\n}\n\nfunction computeRates(reserve: Reserve): { borrowAprPct: number; depositAprPct: number } {\n const available = reserve.availableAmount / 10 ** reserve.mintDecimals;\n const borrowed = reserve.borrowedAmountWad / WAD / 10 ** reserve.mintDecimals;\n const totalDeposited = available + borrowed;\n const utilizationPct = totalDeposited > 0 ? (borrowed / totalDeposited) * 100 : 0;\n\n if (reserve.interestRateUtils.length === 0) return { borrowAprPct: 0, depositAprPct: 0 };\n\n const aprs = reserve.interestRateAprs.map((a) => a / 100);\n const borrowAprPct = interpolateRate(reserve.interestRateUtils, aprs, utilizationPct);\n const depositAprPct =\n (utilizationPct / 100) *\n (borrowAprPct / 100) *\n (1 - reserve.spreadFeeBps / 10000) *\n 100;\n\n return { borrowAprPct, depositAprPct };\n}\n\nfunction cTokenRatio(reserve: Reserve): number {\n if (reserve.ctokenSupply === 0) return 1;\n const totalSupply =\n reserve.availableAmount +\n reserve.borrowedAmountWad / WAD -\n reserve.unclaimedSpreadFeesWad / WAD;\n return totalSupply / reserve.ctokenSupply;\n}\n\n// ---------------------------------------------------------------------------\n// JSON-RPC response helpers\n// ---------------------------------------------------------------------------\n\ntype Fields = Record<string, unknown>;\n\nfunction f(obj: unknown): Fields {\n if (obj && typeof obj === 'object' && 'fields' in obj) return (obj as { fields: Fields }).fields;\n return obj as Fields;\n}\n\nfunction str(v: unknown): string { return String(v ?? '0'); }\nfunction num(v: unknown): number { return Number(str(v)); }\n\nfunction parseReserve(raw: unknown, index: number): Reserve {\n const r = f(raw);\n const coinTypeField = f(r.coin_type);\n const config = f(f(r.config)?.element);\n\n return {\n coinType: str(coinTypeField?.name),\n mintDecimals: num(r.mint_decimals),\n availableAmount: num(r.available_amount),\n borrowedAmountWad: num(f(r.borrowed_amount)?.value),\n ctokenSupply: num(r.ctoken_supply),\n unclaimedSpreadFeesWad: num(f(r.unclaimed_spread_fees)?.value),\n cumulativeBorrowRateWad: num(f(r.cumulative_borrow_rate)?.value),\n openLtvPct: num(config?.open_ltv_pct),\n closeLtvPct: num(config?.close_ltv_pct),\n spreadFeeBps: num(config?.spread_fee_bps),\n interestRateUtils: Array.isArray(config?.interest_rate_utils) ? (config.interest_rate_utils as unknown[]).map(num) : [],\n interestRateAprs: Array.isArray(config?.interest_rate_aprs) ? (config.interest_rate_aprs as unknown[]).map(num) : [],\n arrayIndex: index,\n };\n}\n\nfunction parseObligation(raw: Fields): Obligation {\n const deposits = Array.isArray(raw.deposits)\n ? (raw.deposits as unknown[]).map((d) => {\n const df = f(d);\n return {\n coinType: str(f(df.coin_type)?.name),\n ctokenAmount: num(df.deposited_ctoken_amount),\n reserveIdx: num(df.reserve_array_index),\n };\n })\n : [];\n\n const borrows = Array.isArray(raw.borrows)\n ? (raw.borrows as unknown[]).map((b) => {\n const bf = f(b);\n return {\n coinType: str(f(bf.coin_type)?.name),\n borrowedWad: num(f(bf.borrowed_amount)?.value),\n cumBorrowRateWad: num(f(bf.cumulative_borrow_rate)?.value),\n reserveIdx: num(bf.reserve_array_index),\n };\n })\n : [];\n\n return { deposits, borrows };\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Suilend adapter — contract-first, no SDK dependency.\n * Interacts directly with Suilend Move contracts via RPC + PTB moveCall.\n */\nexport class SuilendAdapter implements LendingAdapter {\n readonly id = 'suilend';\n readonly name = 'Suilend';\n readonly version = '2.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw'];\n readonly supportedAssets: readonly string[] = ['USDC'];\n readonly supportsSameAssetBorrow = false;\n\n private client!: SuiJsonRpcClient;\n private publishedAt: string | null = null;\n private reserveCache: Reserve[] | null = null;\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 // -- On-chain reads -------------------------------------------------------\n\n private async resolvePackage(): Promise<string> {\n if (this.publishedAt) return this.publishedAt;\n try {\n const cap = await this.client.getObject({ id: UPGRADE_CAP_ID, options: { showContent: true } });\n if (cap.data?.content?.dataType === 'moveObject') {\n const fields = cap.data.content.fields as Fields;\n this.publishedAt = str(fields.package);\n return this.publishedAt;\n }\n } catch { /* use fallback */ }\n this.publishedAt = FALLBACK_PUBLISHED_AT;\n return this.publishedAt;\n }\n\n private async loadReserves(fresh = false): Promise<Reserve[]> {\n if (this.reserveCache && !fresh) return this.reserveCache;\n\n const market = await this.client.getObject({\n id: LENDING_MARKET_ID,\n options: { showContent: true },\n });\n\n if (market.data?.content?.dataType !== 'moveObject') {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to read Suilend lending market');\n }\n\n const fields = market.data.content.fields as Fields;\n const reservesRaw = fields.reserves as unknown[];\n\n if (!Array.isArray(reservesRaw)) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to parse Suilend reserves');\n }\n\n this.reserveCache = reservesRaw.map((r, i) => parseReserve(r, i));\n return this.reserveCache;\n }\n\n private findReserve(reserves: Reserve[], asset: string): Reserve | undefined {\n const upper = asset.toUpperCase();\n let coinType: string;\n if (upper === 'USDC') coinType = USDC_TYPE;\n else if (upper === 'SUI') coinType = '0x2::sui::SUI';\n else if (asset.includes('::')) coinType = asset;\n else return undefined;\n\n try {\n const normalized = normalizeStructTag(coinType);\n return reserves.find((r) => {\n try { return normalizeStructTag(r.coinType) === normalized; } catch { return false; }\n });\n } catch { return undefined; }\n }\n\n private async fetchObligationCaps(address: string): Promise<ObligationCap[]> {\n const capType = `${SUILEND_PACKAGE}::lending_market::ObligationOwnerCap<${LENDING_MARKET_TYPE}>`;\n const caps: ObligationCap[] = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n\n while (hasNext) {\n const page = await this.client.getOwnedObjects({\n owner: address,\n filter: { StructType: capType },\n options: { showContent: true },\n cursor: cursor ?? undefined,\n });\n\n for (const item of page.data) {\n if (item.data?.content?.dataType !== 'moveObject') continue;\n const fields = item.data.content.fields as Fields;\n caps.push({\n id: item.data.objectId,\n obligationId: str(fields.obligation_id),\n });\n }\n\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n return caps;\n }\n\n private async fetchObligation(obligationId: string): Promise<Obligation> {\n const obj = await this.client.getObject({ id: obligationId, options: { showContent: true } });\n if (obj.data?.content?.dataType !== 'moveObject') {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to read Suilend obligation');\n }\n return parseObligation(obj.data.content.fields as Fields);\n }\n\n private resolveSymbol(coinType: string): string {\n try {\n const normalized = normalizeStructTag(coinType);\n if (normalized === normalizeStructTag(USDC_TYPE)) return 'USDC';\n if (normalized === normalizeStructTag('0x2::sui::SUI')) return 'SUI';\n } catch { /* fall through */ }\n const parts = coinType.split('::');\n return parts[parts.length - 1] || 'UNKNOWN';\n }\n\n // -- Adapter interface ----------------------------------------------------\n\n async getRates(asset: string): Promise<LendingRates> {\n const reserves = await this.loadReserves();\n const reserve = this.findReserve(reserves, asset);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `Suilend does not support ${asset}`);\n\n const { borrowAprPct, depositAprPct } = computeRates(reserve);\n return { asset, saveApy: depositAprPct, borrowApy: borrowAprPct };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const supplies: Array<{ asset: string; amount: number; apy: number }> = [];\n const borrows: Array<{ asset: string; amount: number; apy: number }> = [];\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) return { supplies, borrows };\n\n const [reserves, obligation] = await Promise.all([\n this.loadReserves(),\n this.fetchObligation(caps[0].obligationId),\n ]);\n\n for (const dep of obligation.deposits) {\n const reserve = reserves[dep.reserveIdx];\n if (!reserve) continue;\n const ratio = cTokenRatio(reserve);\n const amount = (dep.ctokenAmount * ratio) / 10 ** reserve.mintDecimals;\n const { depositAprPct } = computeRates(reserve);\n supplies.push({ asset: this.resolveSymbol(dep.coinType), amount, apy: depositAprPct });\n }\n\n for (const bor of obligation.borrows) {\n const reserve = reserves[bor.reserveIdx];\n if (!reserve) continue;\n const rawAmount = bor.borrowedWad / WAD / 10 ** reserve.mintDecimals;\n const reserveRate = reserve.cumulativeBorrowRateWad / WAD;\n const posRate = bor.cumBorrowRateWad / WAD;\n const compounded = posRate > 0 ? rawAmount * (reserveRate / posRate) : rawAmount;\n const { borrowAprPct } = computeRates(reserve);\n borrows.push({ asset: this.resolveSymbol(bor.coinType), amount: compounded, apy: borrowAprPct });\n }\n\n return { supplies, borrows };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) {\n return { healthFactor: Infinity, supplied: 0, borrowed: 0, maxBorrow: 0, liquidationThreshold: 0 };\n }\n\n const positions = await this.getPositions(address);\n const supplied = positions.supplies.reduce((s, p) => s + p.amount, 0);\n const borrowed = positions.borrows.reduce((s, p) => s + p.amount, 0);\n\n const reserves = await this.loadReserves();\n const reserve = this.findReserve(reserves, 'USDC');\n const closeLtv = reserve?.closeLtvPct ?? 75;\n const openLtv = reserve?.openLtvPct ?? 70;\n const liqThreshold = closeLtv / 100;\n\n const healthFactor = borrowed > 0 ? (supplied * liqThreshold) / borrowed : Infinity;\n const maxBorrow = Math.max(0, supplied * (openLtv / 100) - borrowed);\n\n return { healthFactor, supplied, borrowed, maxBorrow, liquidationThreshold: liqThreshold };\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n _asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves()]);\n const usdcReserve = this.findReserve(reserves, 'USDC');\n if (!usdcReserve) throw new T2000Error('ASSET_NOT_SUPPORTED', 'USDC reserve not found on Suilend');\n\n const caps = await this.fetchObligationCaps(address);\n const tx = new Transaction();\n tx.setSender(address);\n\n let capRef: TransactionObjectArgument | string;\n if (caps.length === 0) {\n const [newCap] = tx.moveCall({\n target: `${pkg}::lending_market::create_obligation`,\n typeArguments: [LENDING_MARKET_TYPE],\n arguments: [tx.object(LENDING_MARKET_ID)],\n });\n capRef = newCap;\n } else {\n capRef = caps[0].id;\n }\n\n const allCoins = await this.fetchAllCoins(address, USDC_TYPE);\n if (allCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n\n const primaryCoinId = allCoins[0].coinObjectId;\n if (allCoins.length > 1) {\n tx.mergeCoins(tx.object(primaryCoinId), allCoins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n const rawAmount = usdcToRaw(amount).toString();\n const [depositCoin] = tx.splitCoins(tx.object(primaryCoinId), [rawAmount]);\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, depositCoin as TransactionObjectArgument, 'save');\n }\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::deposit_liquidity_and_mint_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n tx.object(CLOCK),\n depositCoin,\n ],\n });\n\n tx.moveCall({\n target: `${pkg}::lending_market::deposit_ctokens_into_obligation`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n typeof capRef === 'string' ? tx.object(capRef) : capRef,\n tx.object(CLOCK),\n ctokens,\n ],\n });\n\n if (typeof capRef !== 'string') {\n tx.transferObjects([capRef], address);\n }\n\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n _asset: string,\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves(true)]);\n const usdcReserve = this.findReserve(reserves, 'USDC');\n if (!usdcReserve) throw new T2000Error('ASSET_NOT_SUPPORTED', 'USDC reserve not found on Suilend');\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found');\n\n const positions = await this.getPositions(address);\n const deposited = positions.supplies.find((s) => s.asset === 'USDC')?.amount ?? 0;\n const effectiveAmount = Math.min(amount, deposited);\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', 'Nothing to withdraw from Suilend');\n\n const ratio = cTokenRatio(usdcReserve);\n const ctokenAmount = Math.ceil(effectiveAmount * 10 ** usdcReserve.mintDecimals / ratio);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::withdraw_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n tx.pure.u64(ctokenAmount),\n ],\n });\n\n const exemptionType = `${SUILEND_PACKAGE}::lending_market::RateLimiterExemption<${LENDING_MARKET_TYPE}, ${USDC_TYPE}>`;\n const [none] = tx.moveCall({\n target: '0x1::option::none',\n typeArguments: [exemptionType],\n });\n\n const [coin] = tx.moveCall({\n target: `${pkg}::lending_market::redeem_ctokens_and_withdraw_liquidity`,\n typeArguments: [LENDING_MARKET_TYPE, USDC_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(usdcReserve.arrayIndex),\n tx.object(CLOCK),\n ctokens,\n none,\n ],\n });\n\n tx.transferObjects([coin], address);\n\n return { tx, effectiveAmount };\n }\n\n async buildBorrowTx(\n _address: string,\n _amount: number,\n _asset: string,\n _options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'Suilend borrow requires different collateral/borrow assets. Deferred to Phase 10.');\n }\n\n async buildRepayTx(\n _address: string,\n _amount: number,\n _asset: string,\n ): Promise<AdapterTxResult> {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'Suilend repay deferred to Phase 10.');\n }\n\n async maxWithdraw(\n address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n const health = await this.getHealth(address);\n\n let maxAmount: number;\n if (health.borrowed === 0) {\n maxAmount = health.supplied;\n } else {\n maxAmount = Math.max(0, health.supplied - (health.borrowed * MIN_HEALTH_FACTOR) / health.liquidationThreshold);\n }\n\n const remainingSupply = health.supplied - maxAmount;\n const hfAfter = health.borrowed > 0\n ? (remainingSupply * health.liquidationThreshold) / health.borrowed\n : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: health.healthFactor };\n }\n\n async maxBorrow(\n _address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'Suilend maxBorrow deferred to Phase 10.');\n }\n\n private async fetchAllCoins(\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 = null;\n let hasNext = true;\n\n while (hasNext) {\n const page = await this.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\n return all;\n }\n}\n"]}