@t2000/sdk 0.22.3 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/adapters/index.cjs +3 -3
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.d.cts +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js +3 -3
- package/dist/adapters/index.js.map +1 -1
- package/dist/browser.cjs +3 -3
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +2 -2
- package/dist/browser.d.ts +2 -2
- package/dist/browser.js +3 -3
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +300 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +117 -6
- package/dist/index.d.ts +117 -6
- package/dist/index.js +280 -6
- package/dist/index.js.map +1 -1
- package/dist/{token-registry-bf_caDsv.d.cts → token-registry-BYEXDwjs.d.cts} +13 -2
- package/dist/{token-registry-DLEKjV8I.d.ts → token-registry-CX_RDDO_.d.ts} +13 -2
- package/dist/{types-XWEUAS-X.d.cts → types-D9NstGUu.d.cts} +75 -1
- package/dist/{types-XWEUAS-X.d.ts → types-D9NstGUu.d.ts} +75 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/token-registry.ts","../src/protocols/volo.ts","../src/protocols/cetus-swap.ts","../src/constants.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.ts","../src/wallet/send.ts","../src/utils/format.ts","../src/wallet/balance.ts","../src/wallet/history.ts","../src/t2000.ts","../src/protocols/protocolFee.ts","../src/protocols/navi.ts","../src/protocols/yieldTracker.ts","../src/adapters/registry.ts","../src/adapters/navi.ts","../src/adapters/descriptors.ts","../src/utils/hashcash.ts","../src/gas/manager.ts","../src/gas/autoTopUp.ts","../src/gas/gasStation.ts","../src/utils/base64.ts","../src/safeguards/types.ts","../src/safeguards/errors.ts","../src/safeguards/enforcer.ts","../src/contacts.ts","../src/index.ts","../src/utils/simulate.ts","../src/swap-quote.ts"],"names":["Transaction","T2000Error","naviGetPools","naviGetHealthFactor","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","keypair","buildStakeVSuiTx","getVoloStats","buildUnstakeVSuiTx","VSUI_TYPE","findSwapRoute","buildSwapTx","resolveTokenType","TOKEN_MAP","tx","adapters"],"mappings":"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","file":"index.js","sourcesContent":["export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'USDC_SPONSOR_FAILED'\n | 'USDC_SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","/**\n * Unified token registry — single source of truth for coin types, decimals, symbols, and tiers.\n *\n * ZERO heavy dependencies. Safe to import from any context (server, browser, Edge).\n *\n * Tier 1: USDC — the financial layer (save, borrow, receive, yield, allowances, marketplace, MPP).\n * Tier 2: 13 curated swap assets — hold, trade, and send only.\n * No tier: Legacy tokens kept for display accuracy (existing NAVI positions). No new operations.\n *\n * To add a new token: add ONE entry to COIN_REGISTRY below. Everything else derives from it.\n * Gate for Tier 2 addition: confirmed deep Cetus liquidity + clear user need.\n */\n\nexport interface CoinMeta {\n type: string;\n decimals: number;\n symbol: string;\n tier?: 1 | 2;\n}\n\n/**\n * Canonical coin registry.\n * Key = user-friendly name (used in swap_execute, CLI, prompts).\n */\nexport const COIN_REGISTRY: Record<string, CoinMeta> = {\n // ── Tier 1 — Financial layer ──────────────────────────────────────────\n USDC: { type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', decimals: 6, symbol: 'USDC', tier: 1 },\n\n // ── Tier 2 — Swap assets (13 tokens) ──────────────────────────────────\n SUI: { type: '0x2::sui::SUI', decimals: 9, symbol: 'SUI', tier: 2 },\n wBTC: { type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC', decimals: 8, symbol: 'wBTC', tier: 2 },\n ETH: { type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH', decimals: 8, symbol: 'ETH', tier: 2 },\n GOLD: { type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM', decimals: 9, symbol: 'GOLD', tier: 2 },\n DEEP: { type: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP', decimals: 6, symbol: 'DEEP', tier: 2 },\n WAL: { type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL', decimals: 9, symbol: 'WAL', tier: 2 },\n NS: { type: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS', decimals: 6, symbol: 'NS', tier: 2 },\n IKA: { type: '0x7262fb2f7a3a14c888c438a3cd9b912469a58cf60f367352c46584262e8299aa::ika::IKA', decimals: 9, symbol: 'IKA', tier: 2 },\n CETUS: { type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS', decimals: 9, symbol: 'CETUS', tier: 2 },\n NAVX: { type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX', decimals: 9, symbol: 'NAVX', tier: 2 },\n vSUI: { type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT', decimals: 9, symbol: 'vSUI', tier: 2 },\n LOFI: { type: '0xf22da9a24ad027cccb5f2d496cbe91de953d363513db08a3a734d361c7c17503::LOFI::LOFI', decimals: 9, symbol: 'LOFI', tier: 2 },\n MANIFEST: { type: '0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST', decimals: 9, symbol: 'MANIFEST', tier: 2 },\n\n // ── Legacy — no tier, kept for display accuracy on existing positions ──\n USDT: { type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT', decimals: 6, symbol: 'USDT' },\n USDe: { type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE', decimals: 6, symbol: 'USDe' },\n USDSUI: { type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI', decimals: 6, symbol: 'USDsui' },\n};\n\n/** Reverse lookup: coin type → CoinMeta. Built once at import time. */\nconst BY_TYPE = new Map<string, CoinMeta>();\nfor (const meta of Object.values(COIN_REGISTRY)) {\n BY_TYPE.set(meta.type, meta);\n}\n\n// ── Tier helpers ─────────────────────────────────────────────────────────\n\n/** Returns true if the coin type is Tier 1 (USDC — the financial layer). */\nexport function isTier1(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 1;\n}\n\n/** Returns true if the coin type is Tier 2 (curated swap asset). */\nexport function isTier2(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 2;\n}\n\n/** Returns true if the coin type is actively supported (Tier 1 or Tier 2). */\nexport function isSupported(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier !== undefined;\n}\n\n/** Returns the tier for a coin type, or undefined if legacy/unknown. */\nexport function getTier(coinType: string): 1 | 2 | undefined {\n return BY_TYPE.get(coinType)?.tier;\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Get decimals for any coin type. Checks full type match, then suffix match, then defaults to 9.\n * Works for both tiered and legacy tokens.\n */\nexport function getDecimalsForCoinType(coinType: string): number {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.decimals;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.decimals;\n }\n }\n\n return 9;\n}\n\n/**\n * Resolve a full coin type to a user-friendly symbol.\n * Returns the last `::` segment if not in the registry.\n */\nexport function resolveSymbol(coinType: string): string {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.symbol;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.symbol;\n }\n }\n\n return coinType.split('::').pop() ?? coinType;\n}\n\n/**\n * Name → type map for swap resolution. Derived from COIN_REGISTRY.\n * Contains BOTH original-case and UPPERCASE keys for case-insensitive lookup.\n */\nexport const TOKEN_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const [name, meta] of Object.entries(COIN_REGISTRY)) {\n map[name] = meta.type;\n map[name.toUpperCase()] = meta.type;\n }\n return map;\n})();\n\n/**\n * Resolve a user-friendly token name to its full coin type.\n * Returns the input unchanged if already a full coin type (contains \"::\").\n * Case-insensitive: 'usde', 'USDe', 'USDE' all resolve correctly.\n */\nexport function resolveTokenType(nameOrType: string): string | null {\n if (nameOrType.includes('::')) return nameOrType;\n return TOKEN_MAP[nameOrType] ?? TOKEN_MAP[nameOrType.toUpperCase()] ?? null;\n}\n\n/** Common type constants for direct import. */\nexport const SUI_TYPE = COIN_REGISTRY.SUI.type;\nexport const USDC_TYPE = COIN_REGISTRY.USDC.type;\nexport const USDT_TYPE = COIN_REGISTRY.USDT.type;\nexport const USDSUI_TYPE = COIN_REGISTRY.USDSUI.type;\nexport const USDE_TYPE = COIN_REGISTRY.USDe.type;\nexport const ETH_TYPE = COIN_REGISTRY.ETH.type;\nexport const WBTC_TYPE = COIN_REGISTRY.wBTC.type;\nexport const WAL_TYPE = COIN_REGISTRY.WAL.type;\nexport const NAVX_TYPE = COIN_REGISTRY.NAVX.type;\nexport const IKA_TYPE = COIN_REGISTRY.IKA.type;\nexport const LOFI_TYPE = COIN_REGISTRY.LOFI.type;\nexport const MANIFEST_TYPE = COIN_REGISTRY.MANIFEST.type;\n","/**\n * VOLO vSUI liquid staking — thin transaction builders.\n * No SDK dependency. Two Move calls, immutable contract addresses.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\n\nexport const VOLO_PKG = '0x68d22cf8bdbcd11ecba1e094922873e4080d4d11133e2443fddda0bfd11dae20';\nexport const VOLO_POOL = '0x2d914e23d82fedef1b5f56a32d5c64bdcc3087ccfea2b4d6ea51a71f587840e5';\nexport const VOLO_METADATA = '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60';\nexport const VSUI_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\nexport const SUI_SYSTEM_STATE = '0x05';\nexport const MIN_STAKE_MIST = 1_000_000_000n; // 1 SUI\n\nconst VOLO_STATS_URL = 'https://open-api.naviprotocol.io/api/volo/stats';\n\nexport interface VoloStats {\n apy: number;\n exchangeRate: number;\n tvl: number;\n}\n\n/**\n * Fetch VOLO vSUI staking stats (APY, exchange rate, TVL).\n */\nexport async function getVoloStats(): Promise<VoloStats> {\n const res = await fetch(VOLO_STATS_URL, {\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`VOLO stats API error: HTTP ${res.status}`);\n }\n\n const data = await res.json() as {\n apy?: number;\n exchange_rate?: number;\n exchangeRate?: number;\n tvl?: number;\n data?: { apy?: number; exchange_rate?: number; exchangeRate?: number; tvl?: number };\n };\n\n const d = data.data ?? data;\n\n return {\n apy: d.apy ?? 0,\n exchangeRate: d.exchange_rate ?? d.exchangeRate ?? 1,\n tvl: d.tvl ?? 0,\n };\n}\n\n/**\n * Build a PTB to stake SUI for vSUI.\n */\nexport async function buildStakeVSuiTx(\n _client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint,\n): Promise<Transaction> {\n if (amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${amountMist}`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [suiCoin] = tx.splitCoins(tx.gas, [amountMist]);\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n tx.transferObjects([vSuiCoin], address);\n return tx;\n}\n\n/**\n * Build a PTB to unstake vSUI back to SUI.\n */\nexport async function buildUnstakeVSuiTx(\n client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint | 'all',\n): Promise<Transaction> {\n const coins = await fetchVSuiCoins(client, address);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n let vSuiCoin: TransactionObjectArgument;\n if (amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [amountMist]);\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n tx.transferObjects([suiCoin], address);\n return tx;\n}\n\nasync function fetchVSuiCoins(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({\n owner: address,\n coinType: VSUI_TYPE,\n cursor: cursor ?? undefined,\n });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n","/**\n * Cetus Aggregator V3 SDK wrapper — the ONLY file that imports @cetusprotocol/aggregator-sdk.\n * Documented CLAUDE.md exception: multi-DEX routing cannot be feasibly replaced by thin tx builders.\n */\nimport { AggregatorClient, Env, type FindRouterParams, type RouterDataV3 } from '@cetusprotocol/aggregator-sdk';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\n\nexport interface SwapRouteResult {\n routerData: RouterDataV3;\n amountIn: string;\n amountOut: string;\n byAmountIn: boolean;\n priceImpact: number;\n insufficientLiquidity: boolean;\n}\n\nconst OVERLAY_FEE_RATE = 0.001; // 0.1% swap fee\nconst OVERLAY_FEE_RECEIVER = process.env.T2000_TREASURY_ADDRESS\n ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nlet clientInstance: AggregatorClient | null = null;\n\nfunction getClient(walletAddress: string): AggregatorClient {\n if (clientInstance) return clientInstance;\n clientInstance = new AggregatorClient({\n signer: walletAddress,\n env: Env.Mainnet,\n overlayFeeRate: OVERLAY_FEE_RATE,\n overlayFeeReceiver: OVERLAY_FEE_RECEIVER,\n });\n return clientInstance;\n}\n\n/**\n * Find the optimal swap route via Cetus Aggregator REST API.\n */\nexport async function findSwapRoute(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: bigint;\n byAmountIn: boolean;\n}): Promise<SwapRouteResult | null> {\n const client = getClient(params.walletAddress);\n\n const findParams: FindRouterParams = {\n from: params.from,\n target: params.to,\n amount: params.amount.toString(),\n byAmountIn: params.byAmountIn,\n };\n\n const routerData = await client.findRouters(findParams);\n if (!routerData) return null;\n\n if (routerData.insufficientLiquidity) {\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: routerData.deviationRatio,\n insufficientLiquidity: true,\n };\n }\n\n if (routerData.error) {\n const { T2000Error } = await import('../errors.js');\n throw new T2000Error('SWAP_FAILED', `Cetus routing error: ${routerData.error.msg} (code ${routerData.error.code})`);\n }\n\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: routerData.deviationRatio,\n insufficientLiquidity: false,\n };\n}\n\n/**\n * Build a swap PTB from a route result. The caller must provide an input coin\n * obtained by splitting/merging wallet coins.\n */\nexport async function buildSwapTx(params: {\n walletAddress: string;\n route: SwapRouteResult;\n tx: Transaction;\n inputCoin: TransactionObjectArgument;\n slippage: number;\n}): Promise<TransactionObjectArgument> {\n const client = getClient(params.walletAddress);\n const clampedSlippage = Math.max(0.001, Math.min(params.slippage, 0.05));\n\n const outputCoin = await client.routerSwap({\n router: params.route.routerData,\n inputCoin: params.inputCoin,\n slippage: clampedSlippage,\n txb: params.tx,\n });\n\n return outputCoin;\n}\n\n/**\n * Simulate a swap transaction without executing it.\n */\nexport async function simulateSwap(params: {\n walletAddress: string;\n tx: Transaction;\n}): Promise<{ success: boolean; error?: string }> {\n const client = getClient(params.walletAddress);\n try {\n await client.devInspectTransactionBlock(params.tx);\n return { success: true };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// Re-export from the canonical token registry for backward-compat.\nexport { TOKEN_MAP, resolveTokenType } from '../token-registry.js';\n","import { T2000Error } from './errors.js';\n\nexport const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\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 BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\n// ---------------------------------------------------------------------------\n// Operation → allowed asset rules (single source of truth)\n// ---------------------------------------------------------------------------\n\nexport const OPERATION_ASSETS = {\n save: ['USDC'],\n borrow: ['USDC'],\n withdraw: '*',\n repay: '*',\n send: '*',\n swap: '*',\n} as const;\n\nexport type Operation = keyof typeof OPERATION_ASSETS;\n\nexport function isAllowedAsset(op: Operation, asset: string): boolean {\n const allowed = OPERATION_ASSETS[op];\n if (allowed === '*') return true;\n return (allowed as readonly string[]).includes(asset.toUpperCase());\n}\n\n/**\n * Throws if the asset is not permitted for the given operation.\n * Passing `undefined` (omitted) is always valid — defaults to USDC.\n */\nexport function assertAllowedAsset(op: Operation, asset: string | undefined): void {\n if (!asset) return;\n if (!isAllowedAsset(op, asset)) {\n const allowed = OPERATION_ASSETS[op];\n const list = Array.isArray(allowed) ? allowed.join(', ') : 'any';\n throw new T2000Error(\n 'INVALID_ASSET',\n `${op} only supports ${list}. Cannot use ${asset}.${op === 'save' ? ' Swap to USDC first.' : ''}`,\n );\n }\n}\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_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\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import { SuiJsonRpcClient, getJsonRpcFullnodeUrl } from '@mysten/sui/jsonRpc';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiJsonRpcClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiJsonRpcClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiJsonRpcClient({ url, network: 'mainnet' });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiJsonRpcClient {\n return new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl(network), network });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'node:crypto';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from '../errors.js';\nimport { DEFAULT_KEY_PATH } from '../constants.js';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst SCRYPT_N = 2 ** 14; // 16384 — secure and fast enough\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SALT_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst TAG_LENGTH = 16;\n\ninterface EncryptedKey {\n version: 1;\n algorithm: typeof ALGORITHM;\n salt: string;\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, 32, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P });\n}\n\nfunction encrypt(data: Buffer, passphrase: string): EncryptedKey {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 1,\n algorithm: ALGORITHM,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: tag.toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n };\n}\n\nfunction decrypt(encrypted: EncryptedKey, passphrase: string): Buffer {\n const salt = Buffer.from(encrypted.salt, 'hex');\n const key = deriveKey(passphrase, salt);\n const iv = Buffer.from(encrypted.iv, 'hex');\n const tag = Buffer.from(encrypted.tag, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n try {\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n } catch {\n throw new T2000Error('WALLET_LOCKED', 'Invalid PIN');\n }\n}\n\nexport function generateKeypair(): Ed25519Keypair {\n return Ed25519Keypair.generate();\n}\n\nexport function keypairFromPrivateKey(privateKey: string): Ed25519Keypair {\n if (privateKey.startsWith('suiprivkey')) {\n const decoded = decodeSuiPrivateKey(privateKey);\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n }\n const bytes = Buffer.from(privateKey.replace(/^0x/, ''), 'hex');\n return Ed25519Keypair.fromSecretKey(bytes);\n}\n\nexport async function saveKey(\n keypair: Ed25519Keypair,\n passphrase: string,\n keyPath?: string,\n): Promise<string> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n try {\n await access(filePath);\n throw new T2000Error('WALLET_EXISTS', `Wallet already exists at ${filePath}`);\n } catch (error) {\n if (error instanceof T2000Error) throw error;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const bech32Key = keypair.getSecretKey();\n const encrypted = encrypt(Buffer.from(bech32Key, 'utf-8'), passphrase);\n\n await writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n\n return filePath;\n}\n\nexport async function loadKey(passphrase: string, keyPath?: string): Promise<Ed25519Keypair> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n throw new T2000Error('WALLET_NOT_FOUND', `No wallet found at ${filePath}`);\n }\n\n const encrypted: EncryptedKey = JSON.parse(content);\n const decrypted = decrypt(encrypted, passphrase);\n const bech32Key = decrypted.toString('utf-8');\n const decoded = decodeSuiPrivateKey(bech32Key);\n\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n}\n\nexport async function walletExists(keyPath?: string): Promise<boolean> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function exportPrivateKey(keypair: Ed25519Keypair): string {\n return keypair.getSecretKey();\n}\n\nexport function getAddress(keypair: Ed25519Keypair): string {\n return keypair.getPublicKey().toSuiAddress();\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiJsonRpcClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { StableAsset } from '../constants.js';\nimport type { BalanceResponse } from '../types.js';\n\nconst SUI_PRICE_FALLBACK = 1.0;\nlet _cachedSuiPrice = 0;\nlet _priceLastFetched = 0;\nconst PRICE_CACHE_TTL_MS = 60_000;\n\n/**\n * Fetch SUI price in USD from the Cetus USDC/SUI pool's sqrt_price.\n *\n * Pool is Pool<USDC, SUI> so coin_a = USDC (6 dec), coin_b = SUI (9 dec).\n * current_sqrt_price (Q64 fixed-point) encodes sqrt(raw_price) where\n * raw_price = SUI_raw / USDC_raw.\n *\n * USDC per SUI = 10^(decimals_a - decimals_b) / raw_price\n * = 10^(6-9) / raw_price\n * = 1 / (raw_price * 1000)\n *\n * Equivalently: 1000 / raw_price\n */\nasync function fetchSuiPrice(client: SuiJsonRpcClient): Promise<number> {\n const now = Date.now();\n if (_cachedSuiPrice > 0 && now - _priceLastFetched < PRICE_CACHE_TTL_MS) {\n return _cachedSuiPrice;\n }\n\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const currentSqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n\n if (currentSqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtPriceFloat = Number(currentSqrtPrice) / Number(Q64);\n const rawPrice = sqrtPriceFloat * sqrtPriceFloat;\n const price = 1000 / rawPrice;\n if (price > 0.01 && price < 1000) {\n _cachedSuiPrice = price;\n _priceLastFetched = now;\n }\n }\n }\n } catch {\n // Use cached/fallback price\n }\n\n return _cachedSuiPrice || SUI_PRICE_FALLBACK;\n}\n\nexport async function queryBalance(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<BalanceResponse> {\n const stableBalancePromises = STABLE_ASSETS.map((asset) =>\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS[asset].type })\n .then((b) => ({ asset, amount: Number(b.totalBalance) / 10 ** SUPPORTED_ASSETS[asset].decimals }))\n .catch(() => ({ asset, amount: 0 })),\n );\n\n const [suiBalance, suiPriceUsd, ...stableResults] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ...stableBalancePromises,\n ]);\n\n const stables = {} as Record<StableAsset, number>;\n let totalStables = 0;\n for (const { asset, amount } of stableResults) {\n stables[asset] = amount;\n totalStables += amount;\n }\n\n const suiAmount = Number(suiBalance.totalBalance) / Number(MIST_PER_SUI);\n const savings = 0; // Merged from NAVI in T2000.balance()\n const usdEquiv = suiAmount * suiPriceUsd;\n const total = totalStables + savings + usdEquiv;\n\n return {\n available: totalStables,\n savings,\n debt: 0,\n pendingRewards: 0,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n stables,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { TransactionRecord } from '../types.js';\nimport { getDecimalsForCoinType, resolveSymbol, SUI_TYPE } from '../token-registry.js';\n\nconst KNOWN_TARGETS: [RegExp, string][] = [\n [/::suilend|::obligation/, 'lending'],\n [/::navi|::incentive_v\\d+|::oracle_pro/, 'lending'],\n [/::cetus|::pool/, 'swap'],\n [/::deepbook/, 'swap'],\n [/::transfer::public_transfer/, 'send'],\n];\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => parseTxRecord(tx as unknown as TxBlock, address));\n}\n\nexport async function queryTransaction(\n client: SuiJsonRpcClient,\n digest: string,\n senderAddress: string,\n): Promise<TransactionRecord | null> {\n try {\n const tx = await client.getTransactionBlock({\n digest,\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n });\n return parseTxRecord(tx as unknown as TxBlock, senderAddress);\n } catch {\n return null;\n }\n}\n\ninterface TxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: BalanceChange[];\n}\n\nfunction parseTxRecord(tx: TxBlock, address: string): TransactionRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n const { moveCallTargets, commandTypes } = extractCommands(tx.transaction);\n const { amount, asset, recipient } = extractTransferDetails(tx.balanceChanges, address);\n const action = classifyAction(moveCallTargets, commandTypes);\n\n return {\n digest: tx.digest,\n action,\n amount,\n asset,\n recipient,\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n}\n\ninterface BalanceChange {\n owner: { AddressOwner?: string } | string;\n coinType: string;\n amount: string;\n}\n\nfunction resolveOwner(owner: BalanceChange['owner']): string | null {\n if (typeof owner === 'object' && owner.AddressOwner) return owner.AddressOwner;\n if (typeof owner === 'string') return owner;\n return null;\n}\n\nfunction extractTransferDetails(\n changes: BalanceChange[] | undefined,\n sender: string,\n): { amount?: number; asset?: string; recipient?: string } {\n if (!changes || changes.length === 0) return {};\n\n const outflows = changes.filter((c) => resolveOwner(c.owner) === sender && BigInt(c.amount) < 0n);\n const inflows = changes.filter((c) => resolveOwner(c.owner) !== sender && BigInt(c.amount) > 0n);\n\n const primaryOutflow = outflows\n .filter((c) => c.coinType !== SUI_TYPE)\n .sort((a, b) => Number(BigInt(a.amount) - BigInt(b.amount)))[0]\n ?? outflows[0];\n\n if (!primaryOutflow) return {};\n\n const coinType = primaryOutflow.coinType;\n const decimals = getDecimalsForCoinType(coinType);\n const amount = Math.abs(Number(BigInt(primaryOutflow.amount))) / 10 ** decimals;\n const asset = resolveSymbol(coinType);\n\n const recipientChange = inflows.find((c) => c.coinType === coinType);\n const recipient = recipientChange ? resolveOwner(recipientChange.owner) ?? undefined : undefined;\n\n return { amount, asset, recipient };\n}\n\ninterface CommandInfo {\n moveCallTargets: string[];\n commandTypes: string[];\n}\n\nfunction extractCommands(txBlock: unknown): CommandInfo {\n const result: CommandInfo = { moveCallTargets: [], commandTypes: [] };\n try {\n if (!txBlock || typeof txBlock !== 'object') return result;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return result;\n const inner = 'transaction' in (data as Record<string, unknown>)\n ? (data as Record<string, unknown>).transaction\n : undefined;\n if (!inner || typeof inner !== 'object') return result;\n const commands = 'commands' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).commands\n : undefined;\n if (!Array.isArray(commands)) return result;\n\n for (const cmd of commands as Record<string, unknown>[]) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n result.moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n result.commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n result.commandTypes.push('TransferObjects');\n }\n }\n } catch { /* best effort */ }\n return result;\n}\n\nfunction classifyAction(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of KNOWN_TARGETS) {\n if (pattern.test(target)) return label;\n }\n }\n\n const hasTransfer = commandTypes.includes('TransferObjects');\n const hasMoveCall = commandTypes.includes('MoveCall');\n\n if (hasTransfer && !hasMoveCall) return 'send';\n if (hasMoveCall) return 'transaction';\n\n return 'transaction';\n}\n","import { EventEmitter } from 'eventemitter3';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { getSuiClient } from './utils/sui.js';\nimport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nimport type { TransactionSigner } from './signer.js';\nimport { KeypairSigner } from './wallet/keypairSigner.js';\nimport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory, queryTransaction } from './wallet/history.js';\nimport { getDecimalsForCoinType, resolveSymbol } from './token-registry.js';\nimport { calculateFee, reportFee } from './protocols/protocolFee.js';\nimport * as yieldTracker from './protocols/yieldTracker.js';\nimport { ProtocolRegistry } from './adapters/registry.js';\nimport { NaviAdapter } from './adapters/navi.js';\nimport type { LendingAdapter } from './adapters/types.js';\nimport { solveHashcash } from './utils/hashcash.js';\nimport { executeWithGas } from './gas/manager.js';\nimport type {\n T2000Options,\n BalanceResponse,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n RatesResult,\n PositionsResult,\n TransactionRecord,\n DepositInfo,\n EarningsResult,\n FundStatusResult,\n ClaimRewardsResult,\n PendingReward,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, DEFAULT_NETWORK, API_BASE_URL, MIST_PER_SUI, assertAllowedAsset, type SupportedAsset } from './constants.js';\n\nimport { truncateAddress } from './utils/sui.js';\nimport { SafeguardEnforcer } from './safeguards/enforcer.js';\nimport type { TxMetadata } from './safeguards/types.js';\nimport { ContactManager } from './contacts.js';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.t2000');\n\ninterface T2000Events {\n balanceChange: (event: { asset: string; previous: number; current: number; cause: string; tx?: string }) => void;\n healthWarning: (event: { healthFactor: number; threshold: number; severity: 'warning' }) => void;\n healthCritical: (event: { healthFactor: number; threshold: number; severity: 'critical' }) => void;\n yield: (event: { earned: number; total: number; apy: number; timestamp: number }) => void;\n gasAutoTopUp: (result: { usdcSpent: number; suiReceived: number }) => void;\n gasStationFallback: (event: { reason: string; method: string; suiUsed: number }) => void;\n error: (error: T2000Error) => void;\n}\n\nexport class T2000 extends EventEmitter<T2000Events> {\n private readonly _signer: TransactionSigner;\n private readonly _keypair?: Ed25519Keypair;\n private readonly client: SuiJsonRpcClient;\n private readonly _address: string;\n private readonly registry: ProtocolRegistry;\n readonly enforcer: SafeguardEnforcer;\n readonly contacts: ContactManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string);\n private constructor(signer: TransactionSigner, client: SuiJsonRpcClient, registry: ProtocolRegistry | undefined, configDir: string | undefined, isSignerMode: true);\n private constructor(\n keypairOrSigner: Ed25519Keypair | TransactionSigner,\n client: SuiJsonRpcClient,\n registry?: ProtocolRegistry,\n configDir?: string,\n isSignerMode?: boolean,\n ) {\n super();\n if (isSignerMode) {\n this._signer = keypairOrSigner as TransactionSigner;\n this._keypair = undefined;\n this._address = this._signer.getAddress();\n } else {\n const kp = keypairOrSigner as Ed25519Keypair;\n this._keypair = kp;\n this._signer = new KeypairSigner(kp);\n this._address = getAddress(kp);\n }\n this.client = client;\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n }\n\n private static createDefaultRegistry(client: SuiJsonRpcClient): ProtocolRegistry {\n const registry = new ProtocolRegistry();\n const naviAdapter = new NaviAdapter();\n naviAdapter.initSync(client);\n registry.registerLending(naviAdapter);\n return registry;\n }\n\n static async create(options: T2000Options = {}): Promise<T2000> {\n const { keyPath, pin, passphrase, network = DEFAULT_NETWORK, rpcUrl, sponsored, name } = options;\n const secret = pin ?? passphrase;\n\n const client = getSuiClient(rpcUrl);\n\n if (sponsored) {\n const keypair = generateKeypair();\n if (secret) {\n await saveKey(keypair, secret, keyPath);\n }\n return new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n }\n\n const exists = await walletExists(keyPath);\n if (!exists) {\n throw new T2000Error(\n 'WALLET_NOT_FOUND',\n 'No wallet found. Run `t2000 init` to create one.',\n );\n }\n\n if (!secret) {\n throw new T2000Error('WALLET_LOCKED', 'PIN required to unlock wallet');\n }\n\n const keypair = await loadKey(secret, keyPath);\n return new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n }\n\n static fromPrivateKey(privateKey: string, options: { network?: 'mainnet' | 'testnet'; rpcUrl?: string } = {}): T2000 {\n const keypair = keypairFromPrivateKey(privateKey);\n const client = getSuiClient(options.rpcUrl);\n return new T2000(keypair, client);\n }\n\n static async init(options: { pin: string; passphrase?: string; keyPath?: string; name?: string; sponsored?: boolean }): Promise<{ agent: T2000; address: string; sponsored: boolean; usdcSponsored: boolean }> {\n const secret = options.pin ?? options.passphrase ?? '';\n const keypair = generateKeypair();\n await saveKey(keypair, secret, options.keyPath);\n\n const client = getSuiClient();\n const agent = new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n const address = agent.address();\n\n let sponsored = false;\n let usdcSponsored = false;\n if (options.sponsored !== false) {\n try {\n await callSponsorApi(address, options.name);\n sponsored = true;\n } catch {\n // SUI gas sponsor unavailable — agent can still be funded manually\n }\n\n try {\n await callUsdcSponsorApi(address);\n usdcSponsored = true;\n } catch {\n // USDC sponsor unavailable — not critical, user can deposit manually\n }\n }\n\n return { agent, address, sponsored, usdcSponsored };\n }\n\n // -- Gas --\n\n /** SuiJsonRpcClient used by this agent — exposed for integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for CLI/MCP integrations. */\n get keypair(): Ed25519Keypair {\n if (!this._keypair) {\n throw new T2000Error('WALLET_NOT_FOUND', 'Keypair not available — this instance uses zkLogin');\n }\n return this._keypair;\n }\n\n /** Transaction signer (works for both keypair and zkLogin). */\n get signer(): TransactionSigner {\n return this._signer;\n }\n\n // -- MPP Payments --\n\n async pay(options: PayOptions): Promise<PayResult> {\n this.enforcer.assertNotLocked();\n this.enforcer.check({ operation: 'pay', amount: options.maxPrice ?? 1.0 });\n\n const { Mppx } = await import('mppx/client');\n const { sui } = await import('@suimpp/mpp/client');\n\n const client = this.client;\n const signer = this._signer;\n const signerAddress = signer.getAddress();\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [sui({\n client,\n signer: { toSuiAddress: () => signerAddress } as Parameters<typeof sui>[0]['signer'],\n execute: async (tx) => {\n const result = await executeWithGas(client, signer, () => tx);\n return { digest: result.digest, effects: result.effects };\n },\n })],\n });\n\n const method = (options.method ?? 'GET').toUpperCase();\n const canHaveBody = method !== 'GET' && method !== 'HEAD';\n\n const response = await mppx.fetch(options.url, {\n method,\n headers: options.headers,\n body: canHaveBody ? options.body : undefined,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n let body: unknown;\n try {\n body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n } catch {\n body = null;\n }\n\n const receiptHeader = response.headers.get('x-payment-receipt');\n const paid = !!receiptHeader;\n\n if (paid) {\n this.enforcer.recordUsage(options.maxPrice ?? 1.0);\n }\n\n return {\n status: response.status,\n body,\n paid,\n cost: paid ? (options.maxPrice ?? undefined) : undefined,\n receipt: receiptHeader\n ? { reference: receiptHeader, timestamp: new Date().toISOString() }\n : undefined,\n };\n }\n\n // -- VOLO vSUI Staking --\n\n async stakeVSui(params: { amount: number }): Promise<StakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildStakeVSuiTx, getVoloStats } = await import('./protocols/volo.js');\n\n const amountMist = BigInt(Math.floor(params.amount * Number(MIST_PER_SUI)));\n const stats = await getVoloStats();\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n return buildStakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const vSuiReceived = params.amount / stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n amountSui: params.amount,\n vSuiReceived,\n apy: stats.apy,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async unstakeVSui(params: { amount: number | 'all' }): Promise<UnstakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildUnstakeVSuiTx, getVoloStats, VSUI_TYPE } = await import('./protocols/volo.js');\n\n let amountMist: bigint | 'all';\n let vSuiAmount: number;\n\n if (params.amount === 'all') {\n amountMist = 'all';\n const coins = await this._fetchCoins(VSUI_TYPE);\n vSuiAmount = coins.reduce((sum, c) => sum + Number(c.balance), 0) / 1e9;\n } else {\n amountMist = BigInt(Math.floor(params.amount * 1e9));\n vSuiAmount = params.amount;\n }\n\n const stats = await getVoloStats();\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n return buildUnstakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const suiReceived = vSuiAmount * stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n vSuiAmount,\n suiReceived,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n // -- Swap --\n\n async swap(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n slippage?: number;\n }): Promise<SwapResult> {\n this.enforcer.assertNotLocked();\n\n const { findSwapRoute, buildSwapTx, resolveTokenType, TOKEN_MAP } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n const slippage = Math.min(params.slippage ?? 0.01, 0.05);\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n if (route.priceImpact > 0.05) {\n console.warn(`[swap] High price impact: ${(route.priceImpact * 100).toFixed(2)}%`);\n }\n\n const toDecimals = getDecimalsForCoinType(toType);\n\n // Snapshot pre-swap balance for fallback diff calculation\n let preBalRaw = 0n;\n try {\n const preBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n preBalRaw = BigInt(preBal.totalBalance);\n } catch { /* first time holding this token — balance is 0 */ }\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n let inputCoin: TransactionObjectArgument;\n if (fromType === '0x2::sui::SUI') {\n [inputCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(fromType);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${params.from} coins found.`);\n const merged = this._mergeCoinsInTx(tx, coins);\n [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n let toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n // --- Primary: parse balance changes from the finalized transaction ---\n const toTypeSuffix = toType.split('::').slice(1).join('::');\n try {\n const fullTx = await this.client.waitForTransaction({\n digest: gasResult.digest,\n options: { showBalanceChanges: true },\n timeout: 8_000,\n pollInterval: 400,\n });\n type BalChange = { coinType: string; amount: string; owner: { AddressOwner?: string } };\n const changes = ((fullTx as { balanceChanges?: BalChange[] }).balanceChanges ?? []);\n const received = changes.find((c) => {\n if (BigInt(c.amount) <= 0n) return false;\n const ownerAddr = (c.owner as { AddressOwner?: string })?.AddressOwner;\n if (!ownerAddr || ownerAddr.toLowerCase() !== this._address.toLowerCase()) return false;\n if (c.coinType === toType) return true;\n return c.coinType.endsWith(toTypeSuffix);\n });\n if (received) {\n const actual = Number(BigInt(received.amount)) / 10 ** toDecimals;\n if (actual > 0) toAmount = actual;\n }\n } catch {\n // waitForTransaction timeout — fall through to balance diff\n }\n\n // --- Fallback: pre/post getBalance diff ---\n const cetusEstimate = Number(route.amountOut) / 10 ** toDecimals;\n if (Math.abs(toAmount - cetusEstimate) < 0.001) {\n try {\n await new Promise((r) => setTimeout(r, 2000));\n const postBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n const postRaw = BigInt(postBal.totalBalance);\n const delta = Number(postRaw - preBalRaw) / 10 ** toDecimals;\n if (delta > 0) toAmount = delta;\n } catch {\n // Balance diff fallback failed — use Cetus estimate\n }\n }\n\n // Resolve full coin types to user-friendly token names\n const fromName = resolveSymbol(fromType);\n const toName = resolveSymbol(toType);\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n success: true,\n tx: gasResult.digest,\n fromToken: fromName,\n toToken: toName,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async swapQuote(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n }): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType, TOKEN_MAP } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n this.enforcer.assertNotLocked();\n\n const asset = (params.asset ?? 'USDC') as keyof typeof SUPPORTED_ASSETS;\n if (!(asset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n\n const resolved = this.contacts.resolve(params.to);\n const sendAmount = params.amount;\n const sendTo = resolved.address;\n\n const gasResult = await executeWithGas(this.client, this._signer, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n { metadata: { operation: 'send', amount: sendAmount }, enforcer: this.enforcer },\n );\n\n this.enforcer.recordUsage(sendAmount);\n const balance = await this.balance();\n\n this.emitBalanceChange(asset, sendAmount, 'send', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: sendAmount,\n to: resolved.address,\n contactName: resolved.contactName,\n gasCost: gasResult.gasCostSui,\n gasCostUnit: 'SUI',\n gasMethod: gasResult.gasMethod,\n balance,\n };\n }\n\n async balance(): Promise<BalanceResponse> {\n const bal = await queryBalance(this.client, this._address);\n\n let chainTotal = bal.available + bal.gasReserve.usdEquiv;\n\n try {\n const positions = await this.positions();\n for (const pos of positions.positions) {\n const usdValue = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') {\n chainTotal += usdValue;\n bal.savings += usdValue;\n } else if (pos.type === 'borrow') {\n chainTotal -= usdValue;\n bal.debt += usdValue;\n }\n }\n } catch {\n // Protocol unavailable — chain total limited to wallet\n }\n\n try {\n const pendingRewards = await this.getPendingRewards();\n bal.pendingRewards = pendingRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n } catch {\n bal.pendingRewards = 0;\n }\n\n bal.total = chainTotal;\n return bal;\n }\n\n async history(params?: { limit?: number }): Promise<TransactionRecord[]> {\n return queryHistory(this.client, this._address, params?.limit);\n }\n\n async transactionDetail(digest: string): Promise<TransactionRecord | null> {\n return queryTransaction(this.client, digest, this._address);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'mainnet',\n supportedAssets: ['USDC', 'USDT', 'SUI'],\n instructions: [\n `Send USDC to: ${this._address}`,\n `Network: Sui Mainnet`,\n `Or buy USDC on an exchange and withdraw to this address.`,\n `USDC contract: ${SUPPORTED_ASSETS.USDC.type}`,\n ].join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n static fromZkLogin(opts: {\n ephemeralKeypair: Ed25519Keypair;\n zkProof: ZkLoginProof;\n userAddress: string;\n maxEpoch: number;\n rpcUrl?: string;\n }): T2000 {\n const signer = new ZkLoginSigner(opts.ephemeralKeypair, opts.zkProof, opts.userAddress, opts.maxEpoch);\n const client = getSuiClient(opts.rpcUrl);\n return new T2000(signer, client, undefined, undefined, true);\n }\n\n async registerAdapter(adapter: LendingAdapter): Promise<void> {\n await adapter.init(this.client);\n this.registry.registerLending(adapter);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<SaveResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('save', params.asset);\n const asset: SupportedAsset = 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n let amount: number;\n if (params.amount === 'all') {\n const bal = await queryBalance(this.client, this._address);\n amount = (bal.available ?? 0) - 1.0;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No USDC available to save`, {\n reason: 'insufficient_balance', asset,\n });\n }\n } else {\n amount = params.amount;\n const bal = await queryBalance(this.client, this._address);\n if (amount > (bal.available ?? 0)) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance. Available: $${(bal.available ?? 0).toFixed(2)}, requested: $${amount.toFixed(2)}`);\n }\n }\n\n const fee = calculateFee('save', amount);\n const saveAmount = amount;\n const adapter = await this.resolveLending(params.protocol, asset, 'save');\n const canPTB = !!adapter.addSaveToTx;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n const merged = this._mergeCoinsInTx(tx, coins);\n const rawAmount = BigInt(Math.floor(saveAmount * 10 ** assetInfo.decimals));\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n await adapter.addSaveToTx!(tx, this._address, inputCoin, asset, { collectFee: true });\n return tx;\n }\n\n const { tx } = await adapter.buildSaveTx(this._address, saveAmount, asset, { collectFee: true });\n return tx;\n });\n\n const rates = await adapter.getRates(asset);\n reportFee(this._address, 'save', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(asset, saveAmount, 'save', gasResult.digest);\n\n let savingsBalance = saveAmount;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const positions = await this.positions();\n const actual = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n if (actual > 0) {\n savingsBalance = actual;\n break;\n }\n } catch { /* retry */ }\n await new Promise(r => setTimeout(r, 2000));\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.saveApy,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n savingsBalance,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; asset?: string; protocol?: string }): Promise<WithdrawResult> {\n this.enforcer.assertNotLocked();\n if (params.amount === 'all' && !params.protocol && !params.asset) {\n return this.withdrawAllProtocols();\n }\n\n const allPositions = await this.registry.allPositions(this._address);\n const supplies: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const s of pos.positions.supplies) {\n if (s.amount > 0.001) {\n if (params.asset && s.asset !== params.asset) continue;\n supplies.push({ protocolId: pos.protocolId, asset: s.asset, amount: s.amount, apy: s.apy });\n }\n }\n }\n\n if (supplies.length === 0) {\n throw new T2000Error('NO_COLLATERAL', params.asset ? `No ${params.asset} savings to withdraw` : 'No savings to withdraw');\n }\n\n supplies.sort((a, b) => {\n const aIsUsdc = a.asset === 'USDC' ? 0 : 1;\n const bIsUsdc = b.asset === 'USDC' ? 0 : 1;\n if (aIsUsdc !== bIsUsdc) return aIsUsdc - bIsUsdc;\n return a.apy - b.apy;\n });\n const target = supplies[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n let amount: number;\n if (params.amount === 'all') {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n amount = maxResult.maxAmount;\n if (amount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw');\n }\n } else {\n amount = params.amount;\n\n const hf = await adapter.getHealth(this._address);\n if (hf.borrowed > 0) {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n if (amount > maxResult.maxAmount) {\n throw new T2000Error(\n 'WITHDRAW_WOULD_LIQUIDATE',\n `Withdrawing $${amount.toFixed(2)} would drop health factor below 1.5`,\n {\n safeWithdrawAmount: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n projectedHF: maxResult.healthFactorAfter,\n },\n );\n }\n }\n }\n\n const withdrawAmount = amount;\n let finalAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (adapter.addWithdrawToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const { coin, effectiveAmount } = await adapter.addWithdrawToTx!(tx, this._address, withdrawAmount, target.asset);\n finalAmount = effectiveAmount;\n tx.transferObjects([coin], this._address);\n return tx;\n }\n\n const built = await adapter.buildWithdrawTx(this._address, withdrawAmount, target.asset);\n finalAmount = built.effectiveAmount;\n return built.tx;\n });\n\n this.emitBalanceChange(target.asset, finalAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: finalAmount,\n asset: target.asset,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n private async withdrawAllProtocols(): Promise<WithdrawResult> {\n const allPositions = await this.registry.allPositions(this._address);\n\n const withdrawable: Array<{ protocolId: string; asset: string; amount: number }> = [];\n for (const pos of allPositions) {\n for (const supply of pos.positions.supplies) {\n if (supply.amount > 0.01) {\n withdrawable.push({ protocolId: pos.protocolId, asset: supply.asset, amount: supply.amount });\n }\n }\n }\n\n if (withdrawable.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n const protocolMaxes = new Map<string, number>();\n const entries: Array<{ protocolId: string; asset: string; maxAmount: number; adapter: LendingAdapter }> = [];\n for (const entry of withdrawable) {\n const adapter = this.registry.getLending(entry.protocolId);\n if (!adapter) continue;\n if (!protocolMaxes.has(entry.protocolId)) {\n const maxResult = await adapter.maxWithdraw(this._address, entry.asset);\n protocolMaxes.set(entry.protocolId, maxResult.maxAmount);\n }\n const remaining = protocolMaxes.get(entry.protocolId)!;\n const perAssetMax = Math.min(entry.amount, remaining);\n if (perAssetMax > 0.01) {\n entries.push({ ...entry, maxAmount: perAssetMax, adapter });\n protocolMaxes.set(entry.protocolId, remaining - perAssetMax);\n }\n }\n\n if (entries.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n let totalReceived = 0;\n const canPTB = entries.every(e => e.adapter.addWithdrawToTx);\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n for (const entry of entries) {\n const { coin, effectiveAmount } = await entry.adapter.addWithdrawToTx!(\n tx, this._address, entry.maxAmount, entry.asset,\n );\n totalReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const entry of entries) {\n const built = await entry.adapter.buildWithdrawTx(this._address, entry.maxAmount, entry.asset);\n totalReceived += built.effectiveAmount;\n lastTx = built.tx;\n }\n return lastTx!;\n });\n\n if (totalReceived <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalReceived,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n private async _fetchCoins(coinType: string): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await this.client.getCoins({ owner: this._address, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n if (all.length > 0) {\n this._lastFundDigest = undefined;\n return all;\n }\n\n if (this._lastFundDigest && coinType === SUPPORTED_ASSETS.USDC.type) {\n const txInfo = await this.client.getTransactionBlock({\n digest: this._lastFundDigest,\n options: { showObjectChanges: true },\n });\n const coinIds = (txInfo.objectChanges ?? [])\n .filter((c): c is typeof c & { objectId: string } =>\n (c.type === 'created' || c.type === 'mutated') &&\n 'objectType' in c &&\n typeof c.objectType === 'string' &&\n c.objectType.includes('0x2::coin::Coin') &&\n c.objectType.includes(coinType),\n )\n .map(c => c.objectId);\n\n if (coinIds.length > 0) {\n const objects = await this.client.multiGetObjects({\n ids: coinIds,\n options: { showContent: true, showOwner: true },\n });\n for (const obj of objects) {\n if (\n obj.data?.content?.dataType === 'moveObject' &&\n obj.data.owner &&\n typeof obj.data.owner === 'object' &&\n 'AddressOwner' in obj.data.owner &&\n obj.data.owner.AddressOwner === this._address\n ) {\n const fields = obj.data.content.fields as Record<string, unknown>;\n all.push({ coinObjectId: obj.data.objectId!, balance: String(fields.balance ?? '0') });\n }\n }\n }\n }\n\n return all;\n }\n\n private _mergeCoinsInTx(tx: Transaction, coins: Array<{ coinObjectId: string; balance: string }>): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n }\n\n private _lastFundDigest: string | undefined;\n\n private async _autoFundFromSavings(shortfall: number): Promise<void> {\n const positions = await this.positions();\n const savingsTotal = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n if (savingsTotal < shortfall * 0.95) {\n const bal = await queryBalance(this.client, this._address);\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. Available: $${bal.available.toFixed(2)}, savings: $${savingsTotal.toFixed(2)}, requested shortfall: $${shortfall.toFixed(2)}`,\n );\n }\n\n const result = await this.withdraw({ amount: shortfall });\n if (result.amount < shortfall * 0.5) {\n throw new T2000Error(\n 'WITHDRAW_FAILED',\n `Auto-withdraw from savings returned $${result.amount.toFixed(2)} — expected ~$${shortfall.toFixed(2)}. Try withdrawing manually first.`,\n );\n }\n\n const txInfo = await this.client.getTransactionBlock({\n digest: result.tx,\n options: { showBalanceChanges: true },\n });\n const usdcReceived = (txInfo.balanceChanges ?? []).some(\n c => c.coinType === SUPPORTED_ASSETS.USDC.type &&\n Number(c.amount) > 0 &&\n typeof c.owner === 'object' && 'AddressOwner' in c.owner &&\n c.owner.AddressOwner === this._address,\n );\n if (!usdcReceived) {\n throw new T2000Error('WITHDRAW_FAILED', 'Withdraw TX did not produce USDC');\n }\n this._lastFundDigest = result.tx;\n }\n\n async maxWithdraw(): Promise<MaxWithdrawResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'withdraw');\n return adapter.maxWithdraw(this._address, 'USDC');\n }\n\n // -- Borrowing --\n\n async borrow(params: { amount: number; protocol?: string }): Promise<BorrowResult> {\n this.enforcer.assertNotLocked();\n const asset = 'USDC';\n const adapter = await this.resolveLending(params.protocol, asset, 'borrow');\n\n const maxResult = await adapter.maxBorrow(this._address, asset);\n if (maxResult.maxAmount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No collateral deposited. Save first with `t2000 save <amount>`.');\n }\n if (params.amount > maxResult.maxAmount) {\n throw new T2000Error('HEALTH_FACTOR_TOO_LOW', `Max safe borrow: $${maxResult.maxAmount.toFixed(2)}. Only savings deposits count as borrowable collateral.`, {\n maxBorrow: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n });\n }\n const fee = calculateFee('borrow', params.amount);\n const borrowAmount = params.amount;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n const { tx } = await adapter.buildBorrowTx(this._address, borrowAmount, asset, { collectFee: true });\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n reportFee(this._address, 'borrow', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(asset, borrowAmount, 'borrow', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: borrowAmount,\n fee: fee.amount,\n healthFactor: hf.healthFactor,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async repay(params: { amount: number | 'all'; protocol?: string }): Promise<RepayResult> {\n this.enforcer.assertNotLocked();\n const allPositions = await this.registry.allPositions(this._address);\n const borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const b of pos.positions.borrows) {\n if (b.amount > 0.001) borrows.push({ protocolId: pos.protocolId, asset: b.asset, amount: b.amount, apy: b.apy });\n }\n }\n\n if (borrows.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No outstanding borrow to repay');\n }\n\n if (params.amount === 'all') {\n return this._repayAllBorrows(borrows);\n }\n\n borrows.sort((a, b) => b.apy - a.apy);\n const target = borrows[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n const repayAmount = Math.min(params.amount, target.amount);\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (adapter.addRepayToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (usdcCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins');\n const merged = this._mergeCoinsInTx(tx, usdcCoins);\n const raw = BigInt(Math.floor(repayAmount * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, target.asset);\n return tx;\n }\n\n const { tx } = await adapter.buildRepayTx(this._address, repayAmount, target.asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n this.emitBalanceChange('USDC', repayAmount, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: repayAmount,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n private async _repayAllBorrows(borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }>): Promise<RepayResult> {\n borrows.sort((a, b) => b.apy - a.apy);\n\n const entries: Array<{ borrow: typeof borrows[0]; adapter: LendingAdapter }> = [];\n for (const borrow of borrows) {\n const adapter = this.registry.getLending(borrow.protocolId);\n if (adapter) entries.push({ borrow, adapter });\n }\n\n const canPTB = entries.every(e => e.adapter.addRepayToTx);\n let totalRepaid = 0;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n let usdcMerged: TransactionObjectArgument | undefined;\n if (usdcCoins.length > 0) {\n usdcMerged = this._mergeCoinsInTx(tx, usdcCoins);\n }\n\n for (const { borrow, adapter } of entries) {\n const raw = BigInt(Math.floor(borrow.amount * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n if (!usdcMerged) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC for repayment');\n const [repayCoin] = tx.splitCoins(usdcMerged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, borrow.asset);\n totalRepaid += borrow.amount;\n }\n\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const { borrow, adapter } of entries) {\n const { tx } = await adapter.buildRepayTx(this._address, borrow.amount, borrow.asset);\n lastTx = tx;\n totalRepaid += borrow.amount;\n }\n return lastTx!;\n });\n\n const firstAdapter = entries[0]?.adapter;\n const hf = firstAdapter ? await firstAdapter.getHealth(this._address) : { borrowed: 0 };\n this.emitBalanceChange('USDC', totalRepaid, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalRepaid,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async maxBorrow(): Promise<MaxBorrowResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'borrow');\n return adapter.maxBorrow(this._address, 'USDC');\n }\n\n async healthFactor(): Promise<HealthFactorResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const hf = await adapter.getHealth(this._address);\n\n if (hf.healthFactor < 1.2) {\n this.emit('healthCritical', { healthFactor: hf.healthFactor, threshold: 1.5, severity: 'critical' });\n } else if (hf.healthFactor < 2.0) {\n this.emit('healthWarning', { healthFactor: hf.healthFactor, threshold: 2.0, severity: 'warning' });\n }\n\n return hf;\n }\n\n // -- Claim Rewards --\n\n async getPendingRewards(): Promise<PendingReward[]> {\n const adapters = this.registry.listLending();\n const results = await Promise.allSettled(\n adapters\n .filter((a) => a.getPendingRewards)\n .map((a) => a.getPendingRewards!(this._address)),\n );\n const all: PendingReward[] = [];\n for (const r of results) {\n if (r.status === 'fulfilled') all.push(...r.value);\n }\n return all;\n }\n\n async claimRewards(): Promise<ClaimRewardsResult> {\n this.enforcer.assertNotLocked();\n\n const adapters = this.registry.listLending().filter((a) => a.addClaimRewardsToTx);\n if (adapters.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0, gasMethod: 'none' };\n }\n\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const allRewards: PendingReward[] = [];\n for (const adapter of adapters) {\n try {\n const claimed = await adapter.addClaimRewardsToTx!(tx, this._address);\n allRewards.push(...claimed);\n } catch { /* skip unavailable adapters */ }\n }\n\n if (allRewards.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0, gasMethod: 'none' };\n }\n\n const claimResult = await executeWithGas(this.client, this._signer, async () => tx);\n await this.client.waitForTransaction({ digest: claimResult.digest });\n\n const totalValueUsd = allRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n\n return {\n success: true,\n tx: claimResult.digest,\n rewards: allRewards,\n totalValueUsd,\n gasCost: claimResult.gasCostSui,\n gasMethod: claimResult.gasMethod,\n };\n }\n\n // -- Info --\n\n async positions(): Promise<PositionsResult> {\n const allPositions = await this.registry.allPositions(this._address);\n const positions = allPositions.flatMap(p =>\n [\n ...p.positions.supplies\n .filter(s => s.amount > 0.005)\n .map(s => ({\n protocol: p.protocolId,\n asset: s.asset,\n type: 'save' as const,\n amount: s.amount,\n amountUsd: s.amountUsd,\n apy: s.apy,\n })),\n ...p.positions.borrows\n .filter(b => b.amount > 0.005)\n .map(b => ({\n protocol: p.protocolId,\n asset: b.asset,\n type: 'borrow' as const,\n amount: b.amount,\n amountUsd: b.amountUsd,\n apy: b.apy,\n })),\n ],\n );\n return { positions };\n }\n\n async rates(): Promise<RatesResult> {\n const allRatesResult = await this.registry.allRatesAcrossAssets();\n const result: RatesResult = {};\n for (const entry of allRatesResult) {\n if (!result[entry.asset] || entry.rates.saveApy > result[entry.asset].saveApy) {\n result[entry.asset] = { saveApy: entry.rates.saveApy, borrowApy: entry.rates.borrowApy };\n }\n }\n if (!result.USDC) result.USDC = { saveApy: 0, borrowApy: 0 };\n return result;\n }\n\n async allRates(asset = 'USDC') {\n return this.registry.allRates(asset);\n }\n\n async allRatesAcrossAssets() {\n return this.registry.allRatesAcrossAssets();\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this._address);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this._address);\n }\n\n // -- Helpers --\n\n private async resolveLending(protocol: string | undefined, asset: string, capability: 'save' | 'withdraw' | 'borrow' | 'repay'): Promise<LendingAdapter> {\n if (protocol) {\n const adapter = this.registry.getLending(protocol);\n if (!adapter) throw new T2000Error('ASSET_NOT_SUPPORTED', `Lending adapter '${protocol}' not found`);\n return adapter;\n }\n\n if (capability === 'save') {\n const { adapter } = await this.registry.bestSaveRate(asset);\n return adapter;\n }\n\n if (capability === 'borrow' || capability === 'repay') {\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) &&\n a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => a.name).join(', ');\n const altAssets = [...new Set(alternatives.flatMap(a => [...a.supportedAssets]))].join(', ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Available for ${capability}: ${altList} (assets: ${altAssets})`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) && a.capabilities.includes(capability),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => `${a.name} (${[...a.supportedAssets].join(', ')})`).join('; ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Try: ${altList}`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n private emitBalanceChange(asset: string, amount: number, cause: string, tx?: string): void {\n this.emit('balanceChange', { asset, previous: 0, current: 0, cause, tx });\n }\n}\n\nasync function callSponsorApi(address: string, name?: string): Promise<void> {\n const res = await fetch(`${API_BASE_URL}/api/sponsor`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, name }),\n });\n\n if (res.status === 429) {\n const data = await res.json() as { challenge?: string };\n if (data.challenge) {\n const proof = solveHashcash(data.challenge);\n const retry = await fetch(`${API_BASE_URL}/api/sponsor`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, name, proof }),\n });\n if (!retry.ok) throw new T2000Error('SPONSOR_RATE_LIMITED', 'Sponsor rate limited');\n return;\n }\n }\n\n if (!res.ok) {\n throw new T2000Error('SPONSOR_FAILED', 'Sponsor API unavailable');\n }\n}\n\nasync function callUsdcSponsorApi(address: string): Promise<void> {\n const res = await fetch(`${API_BASE_URL}/api/sponsor/usdc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, source: 'cli' }),\n });\n\n if (res.status === 429) {\n const data = await res.json() as { challenge?: string };\n if (data.challenge) {\n const proof = solveHashcash(data.challenge);\n const retry = await fetch(`${API_BASE_URL}/api/sponsor/usdc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, source: 'cli', proof }),\n });\n if (!retry.ok) throw new T2000Error('USDC_SPONSOR_RATE_LIMITED', 'USDC sponsor rate limited');\n return;\n }\n }\n\n if (res.status === 409) return; // Already sponsored — not an error\n\n if (!res.ok) {\n throw new T2000Error('USDC_SPONSOR_FAILED', 'USDC sponsor unavailable');\n }\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_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' | '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 borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\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 { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, ALL_NAVI_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw } from '../utils/format.js';\nimport { addCollectFeeToTx } from './protocolFee.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\n\n// NAVI SDK expects SuiClient (v1 name), our code uses SuiJsonRpcClient (v2 name).\n// They're the same runtime class, so the cast is safe.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sdkOptions(client: SuiJsonRpcClient): { env: 'prod'; client: any; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean; skipOracle?: boolean },\n): Promise<void> {\n if (options?.skipOracle) return;\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n // Pyth update uses tx.splitCoins(tx.gas, ...) which is incompatible\n // with sponsored transactions where tx.gas belongs to the sponsor.\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n WAL: 'WAL',\n NAVX: 'NAVX',\n ETH: 'ETH',\n GOLD: 'GOLD',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = (isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0')) / 100;\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of ALL_NAVI_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p: Pool) => {\n const poolSuffix = (p.suiCoinType || p.coinType || '').split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n });\n if (!pool) continue;\n\n const saveApy = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0') / 100;\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0') / 100;\n\n if (saveApy >= 0 && saveApy < 2.0) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 2.0 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 0.04, borrowApy: 0.06 };\n return result;\n } catch {\n return { USDC: { saveApy: 0.04, borrowApy: 0.06 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coinObj, 'save');\n }\n\n const rawAmount = Math.min(Number(stableToRaw(amount, assetInfo.decimals)), Number(totalBalance));\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coinObj as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; collectFee?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string; sponsored?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin as TransactionObjectArgument, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean; skipOracle?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with. Withdraw some savings first to get cash.`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n const rawRequested = Number(stableToRaw(amount, assetInfo.decimals));\n\n if (Number(totalBalance) < rawRequested && Number(totalBalance) < 1000) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Not enough ${assetInfo.displayName} to repay (need $${amount.toFixed(2)}, wallet has ~$${(Number(totalBalance) / 10 ** assetInfo.decimals).toFixed(4)}). Withdraw some savings first.`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Math.min(rawRequested, Number(totalBalance));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\n\n await refreshOracle(tx, client, address, {\n skipPythUpdate: options.sponsored,\n skipOracle: options.skipOracle,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n } catch {\n return [];\n }\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n const claimed = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n\n return claimed.map((c) => ({\n protocol: 'navi',\n asset: '',\n coinType: '',\n symbol: 'REWARD',\n amount: 0,\n estimatedValueUsd: 0,\n }));\n } catch {\n return [];\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, address);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n const totalYieldEarned = dailyEarning * 30;\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, address);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\n","import type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports saving ${asset}`);\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async bestBorrowRate(asset: string, opts?: { requireSameAssetBorrow?: boolean }): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('borrow')) continue;\n if (opts?.requireSameAssetBorrow && !adapter.supportsSameAssetBorrow) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports borrowing ${asset}`);\n }\n\n candidates.sort((a, b) => a.rate.borrowApy - b.rate.borrowApy);\n return candidates[0];\n }\n\n async bestSaveRateAcrossAssets(): Promise<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> = [];\n\n for (const asset of STABLE_ASSETS) {\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate, asset });\n } catch { /* skip */ }\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'No lending adapter found for any stablecoin');\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async allRatesAcrossAssets(): Promise<Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }> = [];\n const seen = new Set<string>();\n for (const asset of STABLE_ASSETS) {\n if (seen.has(asset)) continue;\n seen.add(asset);\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n if (rates.saveApy > 0 || rates.borrowApy > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, asset, rates });\n }\n } catch { /* skip */ }\n }\n }\n return results;\n }\n\n async allRates(asset: string): Promise<Array<{ protocol: string; protocolId: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; rates: LendingRates }> = [];\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n results.push({ protocol: adapter.name, protocolId: adapter.id, rates });\n } catch {\n // skip\n }\n }\n return results;\n }\n\n async allPositions(address: string): Promise<Array<{ protocol: string; protocolId: string; positions: AdapterPositions }>> {\n const results: Array<{ protocol: string; protocolId: string; positions: AdapterPositions }> = [];\n const errors: string[] = [];\n for (const adapter of this.lending.values()) {\n try {\n const positions = await adapter.getPositions(address);\n if (positions.supplies.length > 0 || positions.borrows.length > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, positions });\n }\n } catch (err) {\n errors.push(`${adapter.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (results.length === 0 && errors.length > 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol queries failed (${errors.length}/${this.lending.size}): ${errors.join('; ')}`);\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n PendingReward,\n} from './types.js';\nimport { ALL_NAVI_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport { naviDescriptor as descriptor } from './descriptors.js';\n\nexport class NaviAdapter implements LendingAdapter {\n readonly id = 'navi';\n readonly name = 'NAVI Protocol';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...ALL_NAVI_ASSETS];\n readonly supportsSameAssetBorrow = true;\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n const rates = await naviProtocol.getRates(this.client);\n const normalized = normalizeAsset(asset);\n const r = rates[normalized as keyof typeof rates];\n if (!r) throw new T2000Error('ASSET_NOT_SUPPORTED', `NAVI does not support ${asset}`);\n return { asset: normalized, saveApy: r.saveApy, borrowApy: r.borrowApy };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const result = await naviProtocol.getPositions(this.client, address);\n return {\n supplies: result.positions\n .filter(p => p.type === 'save')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\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; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean; skipOracle?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, {\n asset: normalized,\n sponsored: options?.sponsored,\n skipOracle: options?.skipOracle,\n });\n return { tx };\n }\n\n async maxWithdraw(address: string, _asset: string) {\n return naviProtocol.maxWithdrawAmount(this.client, address);\n }\n\n async maxBorrow(address: string, _asset: string) {\n return naviProtocol.maxBorrowAmount(this.client, address);\n }\n\n async addWithdrawToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n ): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addWithdrawToTx(tx, this.client, address, amount, { asset: normalized });\n }\n\n async addSaveToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addSaveToTx(tx, this.client, address, coin, { ...options, asset: normalized });\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addRepayToTx(tx, this.client, address, coin, { asset: normalized });\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n return naviProtocol.getPendingRewards(this.client, address);\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n return naviProtocol.addClaimRewardsToTx(tx, this.client, address);\n }\n}\n","import type { ProtocolDescriptor } from './types.js';\n\nexport type { ProtocolDescriptor } from './types.js';\n\nexport const naviDescriptor: ProtocolDescriptor = {\n id: 'navi',\n name: 'NAVI Protocol',\n packages: [],\n dynamicPackageId: true,\n actionMap: {\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","import { createHash } from 'node:crypto';\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n\n return true;\n}\n\nexport function solveHashcash(challenge: string): string {\n const bits = parseInt(challenge.split(':')[1], 10);\n let counter = 0;\n while (true) {\n const stamp = `${challenge}${counter.toString(16)}`;\n const hash = createHash('sha256').update(stamp).digest();\n if (hasLeadingZeroBits(hash, bits)) return stamp;\n counter++;\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error, isMoveAbort, parseMoveAbortMessage } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport type { SafeguardEnforcer } from '../safeguards/enforcer.js';\nimport type { TxMetadata } from '../safeguards/types.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n balanceChanges?: unknown[];\n gasMethod: GasMethod;\n gasCostSui: number;\n /** Pre-TX SUI balance in MIST — used internally for proactive gas maintenance. */\n preTxSuiMist?: bigint;\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\nasync function getSuiBalance(client: SuiJsonRpcClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function assertTxSuccess(effects: unknown, digest: string): Promise<void> {\n const eff = effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n const errMsg = eff.status.error ?? 'unknown on-chain error';\n if (isMoveAbort(errMsg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(errMsg));\n }\n throw new T2000Error('TRANSACTION_FAILED', `Transaction ${digest} failed on-chain: ${errMsg}`);\n }\n}\n\nasync function trySelfFunded(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiBalance,\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, signer);\n\n // Rebuild the transaction with fresh object versions (auto-topup changed coin state)\n const tx = await buildTx();\n tx.setSender(address);\n\n const suiAfterTopUp = await getSuiBalance(client, address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiAfterTopUp,\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n tx.setSender(address);\n\n // Use serialize() for pure v2 transactions, fall back to build() for\n // mixed v1/v2 transactions (e.g. Cetus aggregator adds v1 commands).\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = tx.serialize();\n } catch {\n const bcsBytes = await tx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = fromBase64(sponsoredResult.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n preTxSuiMist: suiBalance,\n };\n}\n\n/**\n * Best-effort indexer readiness check after transaction finalization.\n * Verifies the TX effects are queryable. Note: aggregate indices\n * (getBalance, getDynamicFields) may still lag — callers that need\n * consistent reads should poll their expected state separately.\n */\nasync function waitForIndexer(client: SuiJsonRpcClient, digest: string): Promise<void> {\n for (let i = 0; i < 3; i++) {\n try {\n await client.getTransactionBlock({ digest, options: { showObjectChanges: true } });\n return;\n } catch {\n await new Promise(r => setTimeout(r, 500));\n }\n }\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n *\n * After every successful transaction, proactively tops up SUI if it\n * dropped below threshold — so the user never hits a \"no gas\" wall.\n */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n options?: { metadata?: TxMetadata; enforcer?: SafeguardEnforcer },\n): Promise<GasExecutionResult> {\n if (options?.enforcer && options?.metadata) {\n options.enforcer.check(options.metadata);\n }\n\n const result = await resolveGas(client, signer, buildTx);\n\n // Proactive gas maintenance — compute remaining SUI from the TX result\n // instead of querying the indexer (which may still show stale balances).\n try {\n if (result.preTxSuiMist !== undefined) {\n const gasCostMist = result.gasMethod === 'sponsored'\n ? 0n\n : BigInt(Math.round(result.gasCostSui * 1e9));\n const estimatedRemaining = result.preTxSuiMist - gasCostMist;\n if (estimatedRemaining < GAS_RESERVE_TARGET) {\n const address = signer.getAddress();\n const usdcBal = await client.getBalance({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n if (BigInt(usdcBal.totalBalance) >= AUTO_TOPUP_MIN_USDC) {\n await executeAutoTopUp(client, signer);\n }\n }\n }\n } catch { /* best-effort — don't fail the main operation */ }\n\n return result;\n}\n\nconst GAS_RESOLUTION_CODES: Set<string> = new Set([\n 'INSUFFICIENT_GAS',\n 'GAS_STATION_UNAVAILABLE',\n 'GAS_FEE_EXCEEDED',\n 'AUTO_TOPUP_FAILED',\n 'SPONSOR_UNAVAILABLE',\n]);\n\nfunction isBuildError(err: unknown): err is T2000Error {\n return err instanceof T2000Error && !GAS_RESOLUTION_CODES.has(err.code);\n}\n\nasync function resolveGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n let lastBuildError: T2000Error | undefined;\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (swap USDC→SUI) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, signer, buildTx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2.5: Retry self-funded — auto-topup may have deposited SUI\n // even if the combined operation failed\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded-retry: ${msg}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('sponsored: returned null');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n if (lastBuildError) throw lastBuildError;\n\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and sponsorship unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SUPPORTED_ASSETS,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n} from '../constants.js';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n // Auto top-up requires a DEX swap (USDC→SUI) which is not available\n // without a swap adapter. Gas station sponsorship is the fallback.\n if (suiRaw < GAS_RESERVE_TARGET && usdcRaw >= AUTO_TOPUP_MIN_USDC) {\n return false;\n }\n return false;\n}\n\nexport async function executeAutoTopUp(\n _client: SuiJsonRpcClient,\n _signer: TransactionSigner,\n): Promise<AutoTopUpResult> {\n // Auto top-up requires USDC→SUI swap via DEX. Currently unavailable —\n // gas station sponsorship handles gas funding instead.\n return { success: false, tx: '', usdcSpent: 0, suiReceived: 0 };\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { toBase64 } from '../utils/base64.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\n/**\n * Request gas sponsorship from the gas station.\n *\n * Sends `txJson` (preferred) or `txBcsBytes` (base64-encoded BCS from tx.build(),\n * used when serialize() fails due to v1/v2 SDK mismatch with aggregator).\n */\nexport async function requestGasSponsorship(\n txJson: string,\n sender: string,\n type?: GasRequestType,\n txBcsBytes?: string,\n): Promise<GasSponsorResponse> {\n const payload: Record<string, unknown> = { sender, type };\n if (txBcsBytes) {\n payload.txBcsBytes = txBcsBytes;\n } else {\n payload.txJson = txJson;\n payload.txBytes = toBase64(new TextEncoder().encode(txJson));\n }\n\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED' || errorCode === 'PRICE_STALE') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter, reason: errorCode },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n { reason: errorCode },\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","/** Cross-platform (Node + browser) base64 helpers. */\n\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nexport function fromBase64(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","export interface SafeguardConfig {\n locked: boolean;\n maxPerTx: number;\n maxDailySend: number;\n dailyUsed: number;\n dailyResetDate: string;\n maxLeverage?: number;\n maxPositionSize?: number;\n}\n\nexport interface TxMetadata {\n operation:\n | 'send'\n | 'save'\n | 'withdraw'\n | 'borrow'\n | 'repay'\n | 'pay';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n]);\n\nexport const DEFAULT_SAFEGUARD_CONFIG: SafeguardConfig = {\n locked: false,\n maxPerTx: 0,\n maxDailySend: 0,\n dailyUsed: 0,\n dailyResetDate: '',\n};\n","import { T2000Error } from '../errors.js';\n\nexport type SafeguardRule = 'locked' | 'maxPerTx' | 'maxDailySend';\n\nexport interface SafeguardErrorDetails {\n attempted?: number;\n limit?: number;\n current?: number;\n}\n\nexport class SafeguardError extends T2000Error {\n readonly rule: SafeguardRule;\n readonly details: SafeguardErrorDetails;\n\n constructor(rule: SafeguardRule, details: SafeguardErrorDetails, message?: string) {\n const msg = message ?? buildMessage(rule, details);\n super('SAFEGUARD_BLOCKED' as any, msg, { rule, ...details });\n this.name = 'SafeguardError';\n this.rule = rule;\n this.details = details;\n }\n\n override toJSON() {\n return {\n error: 'SAFEGUARD_BLOCKED' as const,\n message: this.message,\n retryable: this.retryable,\n data: { rule: this.rule, ...this.details },\n };\n }\n}\n\nfunction buildMessage(rule: SafeguardRule, details: SafeguardErrorDetails): string {\n switch (rule) {\n case 'locked':\n return 'Agent is locked. All operations are frozen.';\n case 'maxPerTx':\n return `Amount $${(details.attempted ?? 0).toFixed(2)} exceeds per-transaction limit ($${(details.limit ?? 0).toFixed(2)})`;\n case 'maxDailySend':\n return `Daily send limit reached ($${(details.current ?? 0).toFixed(2)}/$${(details.limit ?? 0).toFixed(2)} used today)`;\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SafeguardConfig, TxMetadata } from './types.js';\nimport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './types.js';\nimport { SafeguardError } from './errors.js';\n\nexport class SafeguardEnforcer {\n private config: SafeguardConfig;\n private readonly configPath: string | null;\n\n constructor(configDir?: string) {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n this.configPath = configDir ? join(configDir, 'config.json') : null;\n }\n\n load(): void {\n if (!this.configPath) return;\n try {\n const raw = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n this.config = {\n ...DEFAULT_SAFEGUARD_CONFIG,\n locked: raw.locked ?? false,\n maxPerTx: raw.maxPerTx ?? 0,\n maxDailySend: raw.maxDailySend ?? 0,\n dailyUsed: raw.dailyUsed ?? 0,\n dailyResetDate: raw.dailyResetDate ?? '',\n };\n } catch {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n }\n }\n\n assertNotLocked(): void {\n this.load();\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n }\n\n check(metadata: TxMetadata): void {\n this.load();\n\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n\n if (!OUTBOUND_OPS.has(metadata.operation)) return;\n\n const amount = metadata.amount ?? 0;\n\n if (this.config.maxPerTx > 0 && amount > this.config.maxPerTx) {\n throw new SafeguardError('maxPerTx', {\n attempted: amount,\n limit: this.config.maxPerTx,\n });\n }\n\n this.resetDailyIfNewDay();\n\n if (this.config.maxDailySend > 0 && this.config.dailyUsed + amount > this.config.maxDailySend) {\n throw new SafeguardError('maxDailySend', {\n attempted: amount,\n limit: this.config.maxDailySend,\n current: this.config.dailyUsed,\n });\n }\n }\n\n recordUsage(amount: number): void {\n this.resetDailyIfNewDay();\n this.config.dailyUsed += amount;\n this.save();\n }\n\n lock(): void {\n this.config.locked = true;\n this.save();\n }\n\n unlock(): void {\n this.config.locked = false;\n this.save();\n }\n\n set(key: string, value: unknown): void {\n if (key === 'locked' && typeof value === 'boolean') {\n this.config.locked = value;\n } else if (key === 'maxPerTx' && typeof value === 'number') {\n this.config.maxPerTx = value;\n } else if (key === 'maxDailySend' && typeof value === 'number') {\n this.config.maxDailySend = value;\n }\n this.save();\n }\n\n getConfig(): SafeguardConfig {\n this.load();\n this.resetDailyIfNewDay();\n return { ...this.config };\n }\n\n isConfigured(): boolean {\n return this.config.maxPerTx > 0 || this.config.maxDailySend > 0;\n }\n\n private resetDailyIfNewDay(): void {\n const today = new Date().toISOString().slice(0, 10);\n if (this.config.dailyResetDate !== today) {\n this.config.dailyUsed = 0;\n this.config.dailyResetDate = today;\n this.save();\n }\n }\n\n private save(): void {\n if (!this.configPath) return;\n try {\n let existing: Record<string, unknown> = {};\n try {\n existing = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n } catch {\n // no existing config\n }\n\n const merged = {\n ...existing,\n locked: this.config.locked,\n maxPerTx: this.config.maxPerTx,\n maxDailySend: this.config.maxDailySend,\n dailyUsed: this.config.dailyUsed,\n dailyResetDate: this.config.dailyResetDate,\n };\n\n const dir = this.configPath.replace(/[/\\\\][^/\\\\]+$/, '');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.configPath, JSON.stringify(merged, null, 2) + '\\n');\n } catch {\n // Best-effort persistence\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { validateAddress } from './utils/sui.js';\nimport { T2000Error } from './errors.js';\n\nexport interface Contact {\n name: string;\n address: string;\n}\n\nexport type ContactMap = Record<string, Contact>;\n\nconst RESERVED_NAMES = new Set(['to', 'all', 'address']);\n\nexport class ContactManager {\n private contacts: ContactMap = {};\n private readonly filePath: string;\n private readonly dir: string;\n\n constructor(configDir?: string) {\n this.dir = configDir ?? join(homedir(), '.t2000');\n this.filePath = join(this.dir, 'contacts.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.contacts = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.contacts = {};\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.contacts, null, 2));\n }\n\n add(name: string, address: string): { action: 'added' | 'updated' } {\n this.validateName(name);\n const normalized = validateAddress(address);\n const key = name.toLowerCase();\n const existed = key in this.contacts;\n this.contacts[key] = { name, address: normalized };\n this.save();\n return { action: existed ? 'updated' : 'added' };\n }\n\n remove(name: string): boolean {\n const key = name.toLowerCase();\n if (!(key in this.contacts)) return false;\n delete this.contacts[key];\n this.save();\n return true;\n }\n\n get(name: string): Contact | undefined {\n this.load();\n return this.contacts[name.toLowerCase()];\n }\n\n list(): Contact[] {\n this.load();\n return Object.values(this.contacts);\n }\n\n resolve(nameOrAddress: string): { address: string; contactName?: string } {\n this.load();\n\n if (nameOrAddress.startsWith('0x') && nameOrAddress.length >= 42) {\n return { address: validateAddress(nameOrAddress) };\n }\n\n const contact = this.contacts[nameOrAddress.toLowerCase()];\n if (contact) {\n return { address: contact.address, contactName: contact.name };\n }\n\n throw new T2000Error(\n 'CONTACT_NOT_FOUND',\n `\"${nameOrAddress}\" is not a valid Sui address or saved contact.\\n` +\n ` Add it: t2000 contacts add ${nameOrAddress} 0x...`,\n );\n }\n\n private validateName(name: string): void {\n if (name.startsWith('0x')) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names cannot start with 0x');\n }\n if (!/^[a-zA-Z0-9_]+$/.test(name)) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names can only contain letters, numbers, and underscores');\n }\n if (name.length > 32) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names must be 32 characters or fewer');\n }\n if (RESERVED_NAMES.has(name.toLowerCase())) {\n throw new T2000Error('INVALID_CONTACT_NAME', `\"${name}\" is a reserved name and cannot be used as a contact`);\n }\n }\n}\n","export { T2000 } from './t2000.js';\nexport type { TransactionSigner } from './signer.js';\nexport { KeypairSigner } from './wallet/keypairSigner.js';\nexport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nexport { ContactManager } from './contacts.js';\nexport { T2000Error, mapWalletError, mapMoveAbortCode } from './errors.js';\nexport type { T2000ErrorCode, T2000ErrorData } from './errors.js';\nexport type {\n T2000Options,\n BalanceResponse,\n GasReserve,\n GasMethod,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n AssetRates,\n RatesResult,\n PositionEntry,\n PositionsResult,\n EarningsResult,\n FundStatusResult,\n DepositInfo,\n TransactionRecord,\n PendingReward,\n ClaimRewardsResult,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n} from './types.js';\nexport {\n MIST_PER_SUI,\n SUI_DECIMALS,\n USDC_DECIMALS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n CLOCK_ID,\n DEFAULT_NETWORK,\n} from './constants.js';\nexport type { SupportedAsset, StableAsset } from './constants.js';\nexport {\n STABLE_ASSETS,\n ALL_NAVI_ASSETS,\n GAS_RESERVE_MIN,\n CETUS_USDC_SUI_POOL,\n OPERATION_ASSETS,\n isAllowedAsset,\n assertAllowedAsset,\n} from './constants.js';\nexport type { Operation } from './constants.js';\nexport { validateAddress, truncateAddress } from './utils/sui.js';\nexport {\n mistToSui,\n suiToMist,\n usdcToRaw,\n rawToUsdc,\n stableToRaw,\n rawToStable,\n getDecimals,\n formatUsd,\n formatSui,\n formatAssetAmount,\n} from './utils/format.js';\nexport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nexport { solveHashcash } from './utils/hashcash.js';\nexport { calculateFee, addCollectFeeToTx } from './protocols/protocolFee.js';\nexport type { ProtocolFeeInfo, FeeOperation } from './protocols/protocolFee.js';\nexport { simulateTransaction, throwIfSimulationFailed } from './utils/simulate.js';\nexport type { SimulationResult } from './utils/simulate.js';\nexport { getRates } from './protocols/navi.js';\nexport { getSwapQuote } from './swap-quote.js';\nexport {\n findSwapRoute,\n buildSwapTx,\n} from './protocols/cetus-swap.js';\nexport type { SwapRouteResult } from './protocols/cetus-swap.js';\nexport {\n COIN_REGISTRY,\n TOKEN_MAP,\n resolveTokenType,\n resolveSymbol,\n getDecimalsForCoinType,\n isTier1,\n isTier2,\n isSupported,\n getTier,\n SUI_TYPE,\n USDC_TYPE,\n USDT_TYPE,\n USDSUI_TYPE,\n USDE_TYPE,\n ETH_TYPE,\n WBTC_TYPE,\n WAL_TYPE,\n NAVX_TYPE,\n IKA_TYPE,\n LOFI_TYPE,\n MANIFEST_TYPE,\n} from './token-registry.js';\nexport type { CoinMeta } from './token-registry.js';\nexport {\n buildStakeVSuiTx,\n buildUnstakeVSuiTx,\n getVoloStats,\n VSUI_TYPE,\n VOLO_PKG,\n VOLO_POOL,\n VOLO_METADATA,\n} from './protocols/volo.js';\nexport type { VoloStats } from './protocols/volo.js';\nexport * from './adapters/index.js';\nexport { SafeguardEnforcer, SafeguardError } from './safeguards/index.js';\nexport type { SafeguardConfig, TxMetadata, SafeguardRule, SafeguardErrorDetails } from './safeguards/index.js';\nexport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './safeguards/index.js';\nexport {\n executeWithGas,\n shouldAutoTopUp,\n executeAutoTopUp,\n getGasStatus,\n} from './gas/index.js';\nexport type {\n GasExecutionResult,\n AutoTopUpResult,\n GasSponsorResponse,\n GasStatusResponse,\n GasRequestType,\n} from './gas/index.js';\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\nimport { mapMoveAbortCode } from '../errors.js';\n\nexport interface SimulationResult {\n success: boolean;\n gasEstimateSui: number;\n error?: {\n moveAbortCode?: number;\n moveModule?: string;\n reason: string;\n rawError: string;\n };\n}\n\nexport async function simulateTransaction(\n client: SuiJsonRpcClient,\n tx: Transaction,\n sender: string,\n): Promise<SimulationResult> {\n tx.setSender(sender);\n\n try {\n const txBytes = await tx.build({ client });\n const dryRun = await client.dryRunTransactionBlock({\n transactionBlock: Buffer.from(txBytes).toString('base64'),\n });\n\n const status = dryRun.effects?.status;\n const gasUsed = dryRun.effects?.gasUsed;\n\n const gasEstimateSui = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) / 1e9\n : 0;\n\n if (status?.status === 'failure') {\n const rawError = status.error ?? 'Unknown simulation error';\n const parsed = parseMoveAbort(rawError);\n\n return {\n success: false,\n gasEstimateSui,\n error: {\n moveAbortCode: parsed.abortCode,\n moveModule: parsed.module,\n reason: parsed.reason,\n rawError,\n },\n };\n }\n\n return { success: true, gasEstimateSui };\n } catch (err) {\n const rawError = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n gasEstimateSui: 0,\n error: {\n reason: 'Simulation failed: ' + rawError,\n rawError,\n },\n };\n }\n}\n\nexport function throwIfSimulationFailed(sim: SimulationResult): void {\n if (sim.success) return;\n\n throw new T2000Error(\n 'SIMULATION_FAILED',\n sim.error?.reason ?? 'Transaction simulation failed',\n {\n moveAbortCode: sim.error?.moveAbortCode,\n moveModule: sim.error?.moveModule,\n reason: sim.error?.reason,\n rawError: sim.error?.rawError,\n },\n );\n}\n\nfunction parseMoveAbort(errorStr: string): {\n abortCode?: number;\n module?: string;\n reason: string;\n} {\n // Pattern: MoveAbort(MoveLocation { module: ModuleId { ... name: \"module\" }, ... }, code)\n const abortMatch = errorStr.match(/MoveAbort\\([^,]*,\\s*(\\d+)\\)/);\n const moduleMatch = errorStr.match(/name:\\s*Identifier\\(\"([^\"]+)\"\\)/);\n\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n const module = moduleMatch?.[1];\n const reason = mapMoveAbortCode(code);\n return { abortCode: code, module, reason };\n }\n\n // Pattern: MovePrimitiveRuntimeError\n if (errorStr.includes('MovePrimitiveRuntimeError')) {\n const module = moduleMatch?.[1];\n return {\n module,\n reason: `Move runtime error in ${module ?? 'unknown'} module`,\n };\n }\n\n return { reason: errorStr };\n}\n","/**\n * Standalone swap quote — no T2000 agent instance required.\n * Only needs a wallet address for Cetus Aggregator routing.\n */\nimport { getDecimalsForCoinType } from './token-registry.js';\nimport type { SwapQuoteResult } from './types.js';\n\nexport async function getSwapQuote(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n}): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType, TOKEN_MAP } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new Error(`Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new Error(`Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: params.walletAddress,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new Error(`No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new Error(`Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p: { provider?: string }) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/token-registry.ts","../src/protocols/volo.ts","../src/protocols/cetus-swap.ts","../src/constants.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.ts","../src/wallet/send.ts","../src/utils/format.ts","../src/wallet/balance.ts","../src/wallet/history.ts","../src/t2000.ts","../src/protocols/protocolFee.ts","../src/protocols/navi.ts","../src/protocols/yieldTracker.ts","../src/adapters/registry.ts","../src/adapters/navi.ts","../src/adapters/descriptors.ts","../src/utils/hashcash.ts","../src/gas/manager.ts","../src/gas/autoTopUp.ts","../src/gas/gasStation.ts","../src/utils/base64.ts","../src/safeguards/types.ts","../src/safeguards/errors.ts","../src/safeguards/enforcer.ts","../src/contacts.ts","../src/index.ts","../src/protocols/allowance.ts","../src/protocols/financialSummary.ts","../src/utils/simulate.ts","../src/swap-quote.ts","../src/auth/intent-builder.ts"],"names":["Transaction","T2000Error","naviGetPools","naviGetHealthFactor","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","keypair","buildStakeVSuiTx","getVoloStats","buildUnstakeVSuiTx","VSUI_TYPE","findSwapRoute","buildSwapTx","resolveTokenType","TOKEN_MAP","tx","adapters","USDC_TYPE"],"mappings":"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","file":"index.js","sourcesContent":["export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'USDC_SPONSOR_FAILED'\n | 'USDC_SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","/**\n * Unified token registry — single source of truth for coin types, decimals, symbols, and tiers.\n *\n * ZERO heavy dependencies. Safe to import from any context (server, browser, Edge).\n *\n * Tier 1: USDC — the financial layer (save, borrow, receive, yield, allowances, marketplace, MPP).\n * Tier 2: 13 curated swap assets — hold, trade, and send only.\n * No tier: Legacy tokens kept for display accuracy (existing NAVI positions). No new operations.\n *\n * To add a new token: add ONE entry to COIN_REGISTRY below. Everything else derives from it.\n * Gate for Tier 2 addition: confirmed deep Cetus liquidity + clear user need.\n */\n\nexport interface CoinMeta {\n type: string;\n decimals: number;\n symbol: string;\n tier?: 1 | 2;\n}\n\n/**\n * Canonical coin registry.\n * Key = user-friendly name (used in swap_execute, CLI, prompts).\n */\nexport const COIN_REGISTRY: Record<string, CoinMeta> = {\n // ── Tier 1 — Financial layer ──────────────────────────────────────────\n USDC: { type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', decimals: 6, symbol: 'USDC', tier: 1 },\n\n // ── Tier 2 — Swap assets (13 tokens) ──────────────────────────────────\n SUI: { type: '0x2::sui::SUI', decimals: 9, symbol: 'SUI', tier: 2 },\n wBTC: { type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC', decimals: 8, symbol: 'wBTC', tier: 2 },\n ETH: { type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH', decimals: 8, symbol: 'ETH', tier: 2 },\n GOLD: { type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM', decimals: 9, symbol: 'GOLD', tier: 2 },\n DEEP: { type: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP', decimals: 6, symbol: 'DEEP', tier: 2 },\n WAL: { type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL', decimals: 9, symbol: 'WAL', tier: 2 },\n NS: { type: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS', decimals: 6, symbol: 'NS', tier: 2 },\n IKA: { type: '0x7262fb2f7a3a14c888c438a3cd9b912469a58cf60f367352c46584262e8299aa::ika::IKA', decimals: 9, symbol: 'IKA', tier: 2 },\n CETUS: { type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS', decimals: 9, symbol: 'CETUS', tier: 2 },\n NAVX: { type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX', decimals: 9, symbol: 'NAVX', tier: 2 },\n vSUI: { type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT', decimals: 9, symbol: 'vSUI', tier: 2 },\n LOFI: { type: '0xf22da9a24ad027cccb5f2d496cbe91de953d363513db08a3a734d361c7c17503::LOFI::LOFI', decimals: 9, symbol: 'LOFI', tier: 2 },\n MANIFEST: { type: '0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST', decimals: 9, symbol: 'MANIFEST', tier: 2 },\n\n // ── Legacy — no tier, kept for display accuracy on existing positions ──\n USDT: { type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT', decimals: 6, symbol: 'USDT' },\n USDe: { type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE', decimals: 6, symbol: 'USDe' },\n USDSUI: { type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI', decimals: 6, symbol: 'USDsui' },\n};\n\n/** Reverse lookup: coin type → CoinMeta. Built once at import time. */\nconst BY_TYPE = new Map<string, CoinMeta>();\nfor (const meta of Object.values(COIN_REGISTRY)) {\n BY_TYPE.set(meta.type, meta);\n}\n\n// ── Tier helpers ─────────────────────────────────────────────────────────\n\n/** Returns true if the coin type is Tier 1 (USDC — the financial layer). */\nexport function isTier1(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 1;\n}\n\n/** Returns true if the coin type is Tier 2 (curated swap asset). */\nexport function isTier2(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 2;\n}\n\n/** Returns true if the coin type is actively supported (Tier 1 or Tier 2). */\nexport function isSupported(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier !== undefined;\n}\n\n/** Returns the tier for a coin type, or undefined if legacy/unknown. */\nexport function getTier(coinType: string): 1 | 2 | undefined {\n return BY_TYPE.get(coinType)?.tier;\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Get decimals for any coin type. Checks full type match, then suffix match, then defaults to 9.\n * Works for both tiered and legacy tokens.\n */\nexport function getDecimalsForCoinType(coinType: string): number {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.decimals;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.decimals;\n }\n }\n\n return 9;\n}\n\n/**\n * Resolve a full coin type to a user-friendly symbol.\n * Returns the last `::` segment if not in the registry.\n */\nexport function resolveSymbol(coinType: string): string {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.symbol;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.symbol;\n }\n }\n\n return coinType.split('::').pop() ?? coinType;\n}\n\n/**\n * Name → type map for swap resolution. Derived from COIN_REGISTRY.\n * Contains BOTH original-case and UPPERCASE keys for case-insensitive lookup.\n */\nexport const TOKEN_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const [name, meta] of Object.entries(COIN_REGISTRY)) {\n map[name] = meta.type;\n map[name.toUpperCase()] = meta.type;\n }\n return map;\n})();\n\n/**\n * Resolve a user-friendly token name to its full coin type.\n * Returns the input unchanged if already a full coin type (contains \"::\").\n * Case-insensitive: 'usde', 'USDe', 'USDE' all resolve correctly.\n */\nexport function resolveTokenType(nameOrType: string): string | null {\n if (nameOrType.includes('::')) return nameOrType;\n return TOKEN_MAP[nameOrType] ?? TOKEN_MAP[nameOrType.toUpperCase()] ?? null;\n}\n\n/** Common type constants for direct import. */\nexport const SUI_TYPE = COIN_REGISTRY.SUI.type;\nexport const USDC_TYPE = COIN_REGISTRY.USDC.type;\nexport const USDT_TYPE = COIN_REGISTRY.USDT.type;\nexport const USDSUI_TYPE = COIN_REGISTRY.USDSUI.type;\nexport const USDE_TYPE = COIN_REGISTRY.USDe.type;\nexport const ETH_TYPE = COIN_REGISTRY.ETH.type;\nexport const WBTC_TYPE = COIN_REGISTRY.wBTC.type;\nexport const WAL_TYPE = COIN_REGISTRY.WAL.type;\nexport const NAVX_TYPE = COIN_REGISTRY.NAVX.type;\nexport const IKA_TYPE = COIN_REGISTRY.IKA.type;\nexport const LOFI_TYPE = COIN_REGISTRY.LOFI.type;\nexport const MANIFEST_TYPE = COIN_REGISTRY.MANIFEST.type;\n","/**\n * VOLO vSUI liquid staking — thin transaction builders.\n * No SDK dependency. Two Move calls, immutable contract addresses.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\n\nexport const VOLO_PKG = '0x68d22cf8bdbcd11ecba1e094922873e4080d4d11133e2443fddda0bfd11dae20';\nexport const VOLO_POOL = '0x2d914e23d82fedef1b5f56a32d5c64bdcc3087ccfea2b4d6ea51a71f587840e5';\nexport const VOLO_METADATA = '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60';\nexport const VSUI_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\nexport const SUI_SYSTEM_STATE = '0x05';\nexport const MIN_STAKE_MIST = 1_000_000_000n; // 1 SUI\n\nconst VOLO_STATS_URL = 'https://open-api.naviprotocol.io/api/volo/stats';\n\nexport interface VoloStats {\n apy: number;\n exchangeRate: number;\n tvl: number;\n}\n\n/**\n * Fetch VOLO vSUI staking stats (APY, exchange rate, TVL).\n */\nexport async function getVoloStats(): Promise<VoloStats> {\n const res = await fetch(VOLO_STATS_URL, {\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`VOLO stats API error: HTTP ${res.status}`);\n }\n\n const data = await res.json() as {\n apy?: number;\n exchange_rate?: number;\n exchangeRate?: number;\n tvl?: number;\n data?: { apy?: number; exchange_rate?: number; exchangeRate?: number; tvl?: number };\n };\n\n const d = data.data ?? data;\n\n return {\n apy: d.apy ?? 0,\n exchangeRate: d.exchange_rate ?? d.exchangeRate ?? 1,\n tvl: d.tvl ?? 0,\n };\n}\n\n/**\n * Build a PTB to stake SUI for vSUI.\n */\nexport async function buildStakeVSuiTx(\n _client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint,\n): Promise<Transaction> {\n if (amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${amountMist}`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [suiCoin] = tx.splitCoins(tx.gas, [amountMist]);\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n tx.transferObjects([vSuiCoin], address);\n return tx;\n}\n\n/**\n * Build a PTB to unstake vSUI back to SUI.\n */\nexport async function buildUnstakeVSuiTx(\n client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint | 'all',\n): Promise<Transaction> {\n const coins = await fetchVSuiCoins(client, address);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n let vSuiCoin: TransactionObjectArgument;\n if (amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [amountMist]);\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n tx.transferObjects([suiCoin], address);\n return tx;\n}\n\nasync function fetchVSuiCoins(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({\n owner: address,\n coinType: VSUI_TYPE,\n cursor: cursor ?? undefined,\n });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n","/**\n * Cetus Aggregator V3 SDK wrapper — the ONLY file that imports @cetusprotocol/aggregator-sdk.\n * Documented CLAUDE.md exception: multi-DEX routing cannot be feasibly replaced by thin tx builders.\n */\nimport { AggregatorClient, Env, type FindRouterParams, type RouterDataV3 } from '@cetusprotocol/aggregator-sdk';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\n\nexport interface SwapRouteResult {\n routerData: RouterDataV3;\n amountIn: string;\n amountOut: string;\n byAmountIn: boolean;\n priceImpact: number;\n insufficientLiquidity: boolean;\n}\n\nconst OVERLAY_FEE_RATE = 0.001; // 0.1% swap fee\nconst OVERLAY_FEE_RECEIVER = process.env.T2000_TREASURY_ADDRESS\n ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nlet clientInstance: AggregatorClient | null = null;\n\nfunction getClient(walletAddress: string): AggregatorClient {\n if (clientInstance) return clientInstance;\n clientInstance = new AggregatorClient({\n signer: walletAddress,\n env: Env.Mainnet,\n overlayFeeRate: OVERLAY_FEE_RATE,\n overlayFeeReceiver: OVERLAY_FEE_RECEIVER,\n });\n return clientInstance;\n}\n\n/**\n * Find the optimal swap route via Cetus Aggregator REST API.\n */\nexport async function findSwapRoute(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: bigint;\n byAmountIn: boolean;\n}): Promise<SwapRouteResult | null> {\n const client = getClient(params.walletAddress);\n\n const findParams: FindRouterParams = {\n from: params.from,\n target: params.to,\n amount: params.amount.toString(),\n byAmountIn: params.byAmountIn,\n };\n\n const routerData = await client.findRouters(findParams);\n if (!routerData) return null;\n\n if (routerData.insufficientLiquidity) {\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: routerData.deviationRatio,\n insufficientLiquidity: true,\n };\n }\n\n if (routerData.error) {\n const { T2000Error } = await import('../errors.js');\n throw new T2000Error('SWAP_FAILED', `Cetus routing error: ${routerData.error.msg} (code ${routerData.error.code})`);\n }\n\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: routerData.deviationRatio,\n insufficientLiquidity: false,\n };\n}\n\n/**\n * Build a swap PTB from a route result. The caller must provide an input coin\n * obtained by splitting/merging wallet coins.\n */\nexport async function buildSwapTx(params: {\n walletAddress: string;\n route: SwapRouteResult;\n tx: Transaction;\n inputCoin: TransactionObjectArgument;\n slippage: number;\n}): Promise<TransactionObjectArgument> {\n const client = getClient(params.walletAddress);\n const clampedSlippage = Math.max(0.001, Math.min(params.slippage, 0.05));\n\n const outputCoin = await client.routerSwap({\n router: params.route.routerData,\n inputCoin: params.inputCoin,\n slippage: clampedSlippage,\n txb: params.tx,\n });\n\n return outputCoin;\n}\n\n/**\n * Simulate a swap transaction without executing it.\n */\nexport async function simulateSwap(params: {\n walletAddress: string;\n tx: Transaction;\n}): Promise<{ success: boolean; error?: string }> {\n const client = getClient(params.walletAddress);\n try {\n await client.devInspectTransactionBlock(params.tx);\n return { success: true };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// Re-export from the canonical token registry for backward-compat.\nexport { TOKEN_MAP, resolveTokenType } from '../token-registry.js';\n","import { T2000Error } from './errors.js';\n\nexport const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\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 BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\n// ---------------------------------------------------------------------------\n// Operation → allowed asset rules (single source of truth)\n// ---------------------------------------------------------------------------\n\nexport const OPERATION_ASSETS = {\n save: ['USDC'],\n borrow: ['USDC'],\n withdraw: '*',\n repay: '*',\n send: '*',\n swap: '*',\n} as const;\n\nexport type Operation = keyof typeof OPERATION_ASSETS;\n\nexport function isAllowedAsset(op: Operation, asset: string): boolean {\n const allowed = OPERATION_ASSETS[op];\n if (allowed === '*') return true;\n return (allowed as readonly string[]).includes(asset.toUpperCase());\n}\n\n/**\n * Throws if the asset is not permitted for the given operation.\n * Passing `undefined` (omitted) is always valid — defaults to USDC.\n */\nexport function assertAllowedAsset(op: Operation, asset: string | undefined): void {\n if (!asset) return;\n if (!isAllowedAsset(op, asset)) {\n const allowed = OPERATION_ASSETS[op];\n const list = Array.isArray(allowed) ? allowed.join(', ') : 'any';\n throw new T2000Error(\n 'INVALID_ASSET',\n `${op} only supports ${list}. Cannot use ${asset}.${op === 'save' ? ' Swap to USDC first.' : ''}`,\n );\n }\n}\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xd775fcc66eae26797654d435d751dea56b82eeb999de51fd285348e573b968ad';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x08ba26f0d260b5edf6a19c71492b3eb914906a7419baf2df1426765157e5862a';\nexport const T2000_ADMIN_CAP_ID = '0xa97bfff140f5a2c268a03fe5422d382c228057deb7bcfdaf2967ca18b9bdbbd9';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0xf420ec0dcad44433042fb56e1413fb88d3ff65be94fcf425ef9ff750164590e8';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n\n// Allowance feature tags — must match constants.move\nexport const ALLOWANCE_FEATURES = {\n BRIEFING: 0,\n YIELD_ALERT: 1,\n PAYMENT_ALERT: 2,\n ACTION_REMIND: 3,\n SESSION: 4,\n AUTO_COMPOUND: 5,\n DCA: 6,\n HF_ALERT: 7,\n} as const;\nexport type AllowanceFeature = typeof ALLOWANCE_FEATURES[keyof typeof ALLOWANCE_FEATURES];\n\nexport const FEATURES_ALL = 0xFF;\n","import { SuiJsonRpcClient, getJsonRpcFullnodeUrl } from '@mysten/sui/jsonRpc';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiJsonRpcClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiJsonRpcClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiJsonRpcClient({ url, network: 'mainnet' });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiJsonRpcClient {\n return new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl(network), network });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'node:crypto';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from '../errors.js';\nimport { DEFAULT_KEY_PATH } from '../constants.js';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst SCRYPT_N = 2 ** 14; // 16384 — secure and fast enough\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SALT_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst TAG_LENGTH = 16;\n\ninterface EncryptedKey {\n version: 1;\n algorithm: typeof ALGORITHM;\n salt: string;\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, 32, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P });\n}\n\nfunction encrypt(data: Buffer, passphrase: string): EncryptedKey {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 1,\n algorithm: ALGORITHM,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: tag.toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n };\n}\n\nfunction decrypt(encrypted: EncryptedKey, passphrase: string): Buffer {\n const salt = Buffer.from(encrypted.salt, 'hex');\n const key = deriveKey(passphrase, salt);\n const iv = Buffer.from(encrypted.iv, 'hex');\n const tag = Buffer.from(encrypted.tag, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n try {\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n } catch {\n throw new T2000Error('WALLET_LOCKED', 'Invalid PIN');\n }\n}\n\nexport function generateKeypair(): Ed25519Keypair {\n return Ed25519Keypair.generate();\n}\n\nexport function keypairFromPrivateKey(privateKey: string): Ed25519Keypair {\n if (privateKey.startsWith('suiprivkey')) {\n const decoded = decodeSuiPrivateKey(privateKey);\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n }\n const bytes = Buffer.from(privateKey.replace(/^0x/, ''), 'hex');\n return Ed25519Keypair.fromSecretKey(bytes);\n}\n\nexport async function saveKey(\n keypair: Ed25519Keypair,\n passphrase: string,\n keyPath?: string,\n): Promise<string> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n try {\n await access(filePath);\n throw new T2000Error('WALLET_EXISTS', `Wallet already exists at ${filePath}`);\n } catch (error) {\n if (error instanceof T2000Error) throw error;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const bech32Key = keypair.getSecretKey();\n const encrypted = encrypt(Buffer.from(bech32Key, 'utf-8'), passphrase);\n\n await writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n\n return filePath;\n}\n\nexport async function loadKey(passphrase: string, keyPath?: string): Promise<Ed25519Keypair> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n throw new T2000Error('WALLET_NOT_FOUND', `No wallet found at ${filePath}`);\n }\n\n const encrypted: EncryptedKey = JSON.parse(content);\n const decrypted = decrypt(encrypted, passphrase);\n const bech32Key = decrypted.toString('utf-8');\n const decoded = decodeSuiPrivateKey(bech32Key);\n\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n}\n\nexport async function walletExists(keyPath?: string): Promise<boolean> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function exportPrivateKey(keypair: Ed25519Keypair): string {\n return keypair.getSecretKey();\n}\n\nexport function getAddress(keypair: Ed25519Keypair): string {\n return keypair.getPublicKey().toSuiAddress();\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiJsonRpcClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { StableAsset } from '../constants.js';\nimport type { BalanceResponse } from '../types.js';\n\nconst SUI_PRICE_FALLBACK = 1.0;\nlet _cachedSuiPrice = 0;\nlet _priceLastFetched = 0;\nconst PRICE_CACHE_TTL_MS = 60_000;\n\n/**\n * Fetch SUI price in USD from the Cetus USDC/SUI pool's sqrt_price.\n *\n * Pool is Pool<USDC, SUI> so coin_a = USDC (6 dec), coin_b = SUI (9 dec).\n * current_sqrt_price (Q64 fixed-point) encodes sqrt(raw_price) where\n * raw_price = SUI_raw / USDC_raw.\n *\n * USDC per SUI = 10^(decimals_a - decimals_b) / raw_price\n * = 10^(6-9) / raw_price\n * = 1 / (raw_price * 1000)\n *\n * Equivalently: 1000 / raw_price\n */\nasync function fetchSuiPrice(client: SuiJsonRpcClient): Promise<number> {\n const now = Date.now();\n if (_cachedSuiPrice > 0 && now - _priceLastFetched < PRICE_CACHE_TTL_MS) {\n return _cachedSuiPrice;\n }\n\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const currentSqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n\n if (currentSqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtPriceFloat = Number(currentSqrtPrice) / Number(Q64);\n const rawPrice = sqrtPriceFloat * sqrtPriceFloat;\n const price = 1000 / rawPrice;\n if (price > 0.01 && price < 1000) {\n _cachedSuiPrice = price;\n _priceLastFetched = now;\n }\n }\n }\n } catch {\n // Use cached/fallback price\n }\n\n return _cachedSuiPrice || SUI_PRICE_FALLBACK;\n}\n\nexport async function queryBalance(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<BalanceResponse> {\n const stableBalancePromises = STABLE_ASSETS.map((asset) =>\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS[asset].type })\n .then((b) => ({ asset, amount: Number(b.totalBalance) / 10 ** SUPPORTED_ASSETS[asset].decimals }))\n .catch(() => ({ asset, amount: 0 })),\n );\n\n const [suiBalance, suiPriceUsd, ...stableResults] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ...stableBalancePromises,\n ]);\n\n const stables = {} as Record<StableAsset, number>;\n let totalStables = 0;\n for (const { asset, amount } of stableResults) {\n stables[asset] = amount;\n totalStables += amount;\n }\n\n const suiAmount = Number(suiBalance.totalBalance) / Number(MIST_PER_SUI);\n const savings = 0; // Merged from NAVI in T2000.balance()\n const usdEquiv = suiAmount * suiPriceUsd;\n const total = totalStables + savings + usdEquiv;\n\n return {\n available: totalStables,\n savings,\n debt: 0,\n pendingRewards: 0,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n stables,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { TransactionRecord } from '../types.js';\nimport { getDecimalsForCoinType, resolveSymbol, SUI_TYPE } from '../token-registry.js';\n\nconst KNOWN_TARGETS: [RegExp, string][] = [\n [/::suilend|::obligation/, 'lending'],\n [/::navi|::incentive_v\\d+|::oracle_pro/, 'lending'],\n [/::cetus|::pool/, 'swap'],\n [/::deepbook/, 'swap'],\n [/::transfer::public_transfer/, 'send'],\n];\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => parseTxRecord(tx as unknown as TxBlock, address));\n}\n\nexport async function queryTransaction(\n client: SuiJsonRpcClient,\n digest: string,\n senderAddress: string,\n): Promise<TransactionRecord | null> {\n try {\n const tx = await client.getTransactionBlock({\n digest,\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n });\n return parseTxRecord(tx as unknown as TxBlock, senderAddress);\n } catch {\n return null;\n }\n}\n\ninterface TxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: BalanceChange[];\n}\n\nfunction parseTxRecord(tx: TxBlock, address: string): TransactionRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n const { moveCallTargets, commandTypes } = extractCommands(tx.transaction);\n const { amount, asset, recipient } = extractTransferDetails(tx.balanceChanges, address);\n const action = classifyAction(moveCallTargets, commandTypes);\n\n return {\n digest: tx.digest,\n action,\n amount,\n asset,\n recipient,\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n}\n\ninterface BalanceChange {\n owner: { AddressOwner?: string } | string;\n coinType: string;\n amount: string;\n}\n\nfunction resolveOwner(owner: BalanceChange['owner']): string | null {\n if (typeof owner === 'object' && owner.AddressOwner) return owner.AddressOwner;\n if (typeof owner === 'string') return owner;\n return null;\n}\n\nfunction extractTransferDetails(\n changes: BalanceChange[] | undefined,\n sender: string,\n): { amount?: number; asset?: string; recipient?: string } {\n if (!changes || changes.length === 0) return {};\n\n const outflows = changes.filter((c) => resolveOwner(c.owner) === sender && BigInt(c.amount) < 0n);\n const inflows = changes.filter((c) => resolveOwner(c.owner) !== sender && BigInt(c.amount) > 0n);\n\n const primaryOutflow = outflows\n .filter((c) => c.coinType !== SUI_TYPE)\n .sort((a, b) => Number(BigInt(a.amount) - BigInt(b.amount)))[0]\n ?? outflows[0];\n\n if (!primaryOutflow) return {};\n\n const coinType = primaryOutflow.coinType;\n const decimals = getDecimalsForCoinType(coinType);\n const amount = Math.abs(Number(BigInt(primaryOutflow.amount))) / 10 ** decimals;\n const asset = resolveSymbol(coinType);\n\n const recipientChange = inflows.find((c) => c.coinType === coinType);\n const recipient = recipientChange ? resolveOwner(recipientChange.owner) ?? undefined : undefined;\n\n return { amount, asset, recipient };\n}\n\ninterface CommandInfo {\n moveCallTargets: string[];\n commandTypes: string[];\n}\n\nfunction extractCommands(txBlock: unknown): CommandInfo {\n const result: CommandInfo = { moveCallTargets: [], commandTypes: [] };\n try {\n if (!txBlock || typeof txBlock !== 'object') return result;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return result;\n const inner = 'transaction' in (data as Record<string, unknown>)\n ? (data as Record<string, unknown>).transaction\n : undefined;\n if (!inner || typeof inner !== 'object') return result;\n const commands = 'commands' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).commands\n : 'transactions' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).transactions\n : undefined;\n if (!Array.isArray(commands)) return result;\n\n for (const cmd of commands as Record<string, unknown>[]) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n result.moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n result.commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n result.commandTypes.push('TransferObjects');\n }\n }\n } catch { /* best effort */ }\n return result;\n}\n\nfunction classifyAction(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of KNOWN_TARGETS) {\n if (pattern.test(target)) return label;\n }\n }\n\n const hasTransfer = commandTypes.includes('TransferObjects');\n const hasMoveCall = commandTypes.includes('MoveCall');\n\n if (hasTransfer && !hasMoveCall) return 'send';\n if (hasMoveCall) return 'transaction';\n\n return 'transaction';\n}\n","import { EventEmitter } from 'eventemitter3';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { getSuiClient } from './utils/sui.js';\nimport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nimport type { TransactionSigner } from './signer.js';\nimport { KeypairSigner } from './wallet/keypairSigner.js';\nimport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory, queryTransaction } from './wallet/history.js';\nimport { getDecimalsForCoinType, resolveSymbol } from './token-registry.js';\nimport { calculateFee, reportFee } from './protocols/protocolFee.js';\nimport * as yieldTracker from './protocols/yieldTracker.js';\nimport { ProtocolRegistry } from './adapters/registry.js';\nimport { NaviAdapter } from './adapters/navi.js';\nimport type { LendingAdapter } from './adapters/types.js';\nimport { solveHashcash } from './utils/hashcash.js';\nimport { executeWithGas } from './gas/manager.js';\nimport type {\n T2000Options,\n BalanceResponse,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n RatesResult,\n PositionsResult,\n TransactionRecord,\n DepositInfo,\n PaymentRequest,\n EarningsResult,\n FundStatusResult,\n ClaimRewardsResult,\n PendingReward,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, DEFAULT_NETWORK, API_BASE_URL, MIST_PER_SUI, assertAllowedAsset, type SupportedAsset } from './constants.js';\n\nimport { truncateAddress } from './utils/sui.js';\nimport { SafeguardEnforcer } from './safeguards/enforcer.js';\nimport type { TxMetadata } from './safeguards/types.js';\nimport { ContactManager } from './contacts.js';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.t2000');\n\ninterface T2000Events {\n balanceChange: (event: { asset: string; previous: number; current: number; cause: string; tx?: string }) => void;\n healthWarning: (event: { healthFactor: number; threshold: number; severity: 'warning' }) => void;\n healthCritical: (event: { healthFactor: number; threshold: number; severity: 'critical' }) => void;\n yield: (event: { earned: number; total: number; apy: number; timestamp: number }) => void;\n gasAutoTopUp: (result: { usdcSpent: number; suiReceived: number }) => void;\n gasStationFallback: (event: { reason: string; method: string; suiUsed: number }) => void;\n error: (error: T2000Error) => void;\n}\n\nexport class T2000 extends EventEmitter<T2000Events> {\n private readonly _signer: TransactionSigner;\n private readonly _keypair?: Ed25519Keypair;\n private readonly client: SuiJsonRpcClient;\n private readonly _address: string;\n private readonly registry: ProtocolRegistry;\n readonly enforcer: SafeguardEnforcer;\n readonly contacts: ContactManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string);\n private constructor(signer: TransactionSigner, client: SuiJsonRpcClient, registry: ProtocolRegistry | undefined, configDir: string | undefined, isSignerMode: true);\n private constructor(\n keypairOrSigner: Ed25519Keypair | TransactionSigner,\n client: SuiJsonRpcClient,\n registry?: ProtocolRegistry,\n configDir?: string,\n isSignerMode?: boolean,\n ) {\n super();\n if (isSignerMode) {\n this._signer = keypairOrSigner as TransactionSigner;\n this._keypair = undefined;\n this._address = this._signer.getAddress();\n } else {\n const kp = keypairOrSigner as Ed25519Keypair;\n this._keypair = kp;\n this._signer = new KeypairSigner(kp);\n this._address = getAddress(kp);\n }\n this.client = client;\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n }\n\n private static createDefaultRegistry(client: SuiJsonRpcClient): ProtocolRegistry {\n const registry = new ProtocolRegistry();\n const naviAdapter = new NaviAdapter();\n naviAdapter.initSync(client);\n registry.registerLending(naviAdapter);\n return registry;\n }\n\n static async create(options: T2000Options = {}): Promise<T2000> {\n const { keyPath, pin, passphrase, network = DEFAULT_NETWORK, rpcUrl, sponsored, name } = options;\n const secret = pin ?? passphrase;\n\n const client = getSuiClient(rpcUrl);\n\n if (sponsored) {\n const keypair = generateKeypair();\n if (secret) {\n await saveKey(keypair, secret, keyPath);\n }\n return new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n }\n\n const exists = await walletExists(keyPath);\n if (!exists) {\n throw new T2000Error(\n 'WALLET_NOT_FOUND',\n 'No wallet found. Run `t2000 init` to create one.',\n );\n }\n\n if (!secret) {\n throw new T2000Error('WALLET_LOCKED', 'PIN required to unlock wallet');\n }\n\n const keypair = await loadKey(secret, keyPath);\n return new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n }\n\n static fromPrivateKey(privateKey: string, options: { network?: 'mainnet' | 'testnet'; rpcUrl?: string } = {}): T2000 {\n const keypair = keypairFromPrivateKey(privateKey);\n const client = getSuiClient(options.rpcUrl);\n return new T2000(keypair, client);\n }\n\n static async init(options: { pin: string; passphrase?: string; keyPath?: string; name?: string; sponsored?: boolean }): Promise<{ agent: T2000; address: string; sponsored: boolean; usdcSponsored: boolean }> {\n const secret = options.pin ?? options.passphrase ?? '';\n const keypair = generateKeypair();\n await saveKey(keypair, secret, options.keyPath);\n\n const client = getSuiClient();\n const agent = new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n const address = agent.address();\n\n let sponsored = false;\n let usdcSponsored = false;\n if (options.sponsored !== false) {\n try {\n await callSponsorApi(address, options.name);\n sponsored = true;\n } catch {\n // SUI gas sponsor unavailable — agent can still be funded manually\n }\n\n try {\n await callUsdcSponsorApi(address);\n usdcSponsored = true;\n } catch {\n // USDC sponsor unavailable — not critical, user can deposit manually\n }\n }\n\n return { agent, address, sponsored, usdcSponsored };\n }\n\n // -- Gas --\n\n /** SuiJsonRpcClient used by this agent — exposed for integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for CLI/MCP integrations. */\n get keypair(): Ed25519Keypair {\n if (!this._keypair) {\n throw new T2000Error('WALLET_NOT_FOUND', 'Keypair not available — this instance uses zkLogin');\n }\n return this._keypair;\n }\n\n /** Transaction signer (works for both keypair and zkLogin). */\n get signer(): TransactionSigner {\n return this._signer;\n }\n\n // -- MPP Payments --\n\n async pay(options: PayOptions): Promise<PayResult> {\n this.enforcer.assertNotLocked();\n this.enforcer.check({ operation: 'pay', amount: options.maxPrice ?? 1.0 });\n\n const { Mppx } = await import('mppx/client');\n const { sui } = await import('@suimpp/mpp/client');\n\n const client = this.client;\n const signer = this._signer;\n const signerAddress = signer.getAddress();\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [sui({\n client,\n signer: { toSuiAddress: () => signerAddress } as Parameters<typeof sui>[0]['signer'],\n execute: async (tx) => {\n const result = await executeWithGas(client, signer, () => tx);\n return { digest: result.digest, effects: result.effects };\n },\n })],\n });\n\n const method = (options.method ?? 'GET').toUpperCase();\n const canHaveBody = method !== 'GET' && method !== 'HEAD';\n\n const response = await mppx.fetch(options.url, {\n method,\n headers: options.headers,\n body: canHaveBody ? options.body : undefined,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n let body: unknown;\n try {\n body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n } catch {\n body = null;\n }\n\n const receiptHeader = response.headers.get('x-payment-receipt');\n const paid = !!receiptHeader;\n\n if (paid) {\n this.enforcer.recordUsage(options.maxPrice ?? 1.0);\n }\n\n return {\n status: response.status,\n body,\n paid,\n cost: paid ? (options.maxPrice ?? undefined) : undefined,\n receipt: receiptHeader\n ? { reference: receiptHeader, timestamp: new Date().toISOString() }\n : undefined,\n };\n }\n\n // -- VOLO vSUI Staking --\n\n async stakeVSui(params: { amount: number }): Promise<StakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildStakeVSuiTx, getVoloStats } = await import('./protocols/volo.js');\n\n const amountMist = BigInt(Math.floor(params.amount * Number(MIST_PER_SUI)));\n const stats = await getVoloStats();\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n return buildStakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const vSuiReceived = params.amount / stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n amountSui: params.amount,\n vSuiReceived,\n apy: stats.apy,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async unstakeVSui(params: { amount: number | 'all' }): Promise<UnstakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildUnstakeVSuiTx, getVoloStats, VSUI_TYPE } = await import('./protocols/volo.js');\n\n let amountMist: bigint | 'all';\n let vSuiAmount: number;\n\n if (params.amount === 'all') {\n amountMist = 'all';\n const coins = await this._fetchCoins(VSUI_TYPE);\n vSuiAmount = coins.reduce((sum, c) => sum + Number(c.balance), 0) / 1e9;\n } else {\n amountMist = BigInt(Math.floor(params.amount * 1e9));\n vSuiAmount = params.amount;\n }\n\n const stats = await getVoloStats();\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n return buildUnstakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const suiReceived = vSuiAmount * stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n vSuiAmount,\n suiReceived,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n // -- Swap --\n\n async swap(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n slippage?: number;\n }): Promise<SwapResult> {\n this.enforcer.assertNotLocked();\n\n const { findSwapRoute, buildSwapTx, resolveTokenType, TOKEN_MAP } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n const slippage = Math.min(params.slippage ?? 0.01, 0.05);\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n if (route.priceImpact > 0.05) {\n console.warn(`[swap] High price impact: ${(route.priceImpact * 100).toFixed(2)}%`);\n }\n\n const toDecimals = getDecimalsForCoinType(toType);\n\n // Snapshot pre-swap balance for fallback diff calculation\n let preBalRaw = 0n;\n try {\n const preBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n preBalRaw = BigInt(preBal.totalBalance);\n } catch { /* first time holding this token — balance is 0 */ }\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n let inputCoin: TransactionObjectArgument;\n if (fromType === '0x2::sui::SUI') {\n [inputCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(fromType);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${params.from} coins found.`);\n const merged = this._mergeCoinsInTx(tx, coins);\n [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n let toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n // --- Primary: parse balance changes from the finalized transaction ---\n const toTypeSuffix = toType.split('::').slice(1).join('::');\n try {\n const fullTx = await this.client.waitForTransaction({\n digest: gasResult.digest,\n options: { showBalanceChanges: true },\n timeout: 8_000,\n pollInterval: 400,\n });\n type BalChange = { coinType: string; amount: string; owner: { AddressOwner?: string } };\n const changes = ((fullTx as { balanceChanges?: BalChange[] }).balanceChanges ?? []);\n const received = changes.find((c) => {\n if (BigInt(c.amount) <= 0n) return false;\n const ownerAddr = (c.owner as { AddressOwner?: string })?.AddressOwner;\n if (!ownerAddr || ownerAddr.toLowerCase() !== this._address.toLowerCase()) return false;\n if (c.coinType === toType) return true;\n return c.coinType.endsWith(toTypeSuffix);\n });\n if (received) {\n const actual = Number(BigInt(received.amount)) / 10 ** toDecimals;\n if (actual > 0) toAmount = actual;\n }\n } catch {\n // waitForTransaction timeout — fall through to balance diff\n }\n\n // --- Fallback: pre/post getBalance diff ---\n const cetusEstimate = Number(route.amountOut) / 10 ** toDecimals;\n if (Math.abs(toAmount - cetusEstimate) < 0.001) {\n try {\n await new Promise((r) => setTimeout(r, 2000));\n const postBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n const postRaw = BigInt(postBal.totalBalance);\n const delta = Number(postRaw - preBalRaw) / 10 ** toDecimals;\n if (delta > 0) toAmount = delta;\n } catch {\n // Balance diff fallback failed — use Cetus estimate\n }\n }\n\n // Resolve full coin types to user-friendly token names\n const fromName = resolveSymbol(fromType);\n const toName = resolveSymbol(toType);\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n success: true,\n tx: gasResult.digest,\n fromToken: fromName,\n toToken: toName,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async swapQuote(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n }): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType, TOKEN_MAP } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n this.enforcer.assertNotLocked();\n\n const asset = (params.asset ?? 'USDC') as keyof typeof SUPPORTED_ASSETS;\n if (!(asset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n\n const resolved = this.contacts.resolve(params.to);\n const sendAmount = params.amount;\n const sendTo = resolved.address;\n\n const gasResult = await executeWithGas(this.client, this._signer, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n { metadata: { operation: 'send', amount: sendAmount }, enforcer: this.enforcer },\n );\n\n this.enforcer.recordUsage(sendAmount);\n const balance = await this.balance();\n\n this.emitBalanceChange(asset, sendAmount, 'send', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: sendAmount,\n to: resolved.address,\n contactName: resolved.contactName,\n gasCost: gasResult.gasCostSui,\n gasCostUnit: 'SUI',\n gasMethod: gasResult.gasMethod,\n balance,\n };\n }\n\n async balance(): Promise<BalanceResponse> {\n const bal = await queryBalance(this.client, this._address);\n\n let chainTotal = bal.available + bal.gasReserve.usdEquiv;\n\n try {\n const positions = await this.positions();\n for (const pos of positions.positions) {\n const usdValue = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') {\n chainTotal += usdValue;\n bal.savings += usdValue;\n } else if (pos.type === 'borrow') {\n chainTotal -= usdValue;\n bal.debt += usdValue;\n }\n }\n } catch {\n // Protocol unavailable — chain total limited to wallet\n }\n\n try {\n const pendingRewards = await this.getPendingRewards();\n bal.pendingRewards = pendingRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n } catch {\n bal.pendingRewards = 0;\n }\n\n bal.total = chainTotal;\n return bal;\n }\n\n async history(params?: { limit?: number }): Promise<TransactionRecord[]> {\n return queryHistory(this.client, this._address, params?.limit);\n }\n\n async transactionDetail(digest: string): Promise<TransactionRecord | null> {\n return queryTransaction(this.client, digest, this._address);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'mainnet',\n supportedAssets: ['USDC', 'USDT', 'SUI'],\n instructions: [\n `Send USDC to: ${this._address}`,\n `Network: Sui Mainnet`,\n `Or buy USDC on an exchange and withdraw to this address.`,\n `USDC contract: ${SUPPORTED_ASSETS.USDC.type}`,\n ].join('\\n'),\n };\n }\n\n receive(params?: { amount?: number; currency?: string; memo?: string; label?: string }): PaymentRequest {\n const amount = params?.amount ?? null;\n const currency = params?.currency ?? 'USDC';\n const memo = params?.memo ?? null;\n const label = params?.label ?? null;\n\n const qrParts = [`sui:${this._address}`];\n const queryParams: string[] = [];\n if (amount != null) queryParams.push(`amount=${amount}`);\n if (currency !== 'SUI') queryParams.push(`currency=${currency}`);\n if (memo) queryParams.push(`memo=${encodeURIComponent(memo)}`);\n if (label) queryParams.push(`label=${encodeURIComponent(label)}`);\n const qrUri = queryParams.length > 0 ? `${qrParts[0]}?${queryParams.join('&')}` : qrParts[0];\n\n const amountStr = amount != null ? `$${amount.toFixed(2)} ` : '';\n const displayParts = [`Send ${amountStr}${currency} to ${truncateAddress(this._address)}`];\n if (memo) displayParts.push(`Memo: ${memo}`);\n\n return {\n address: this._address,\n network: 'mainnet',\n amount,\n currency,\n memo,\n label,\n qrUri,\n displayText: displayParts.join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n static fromZkLogin(opts: {\n ephemeralKeypair: Ed25519Keypair;\n zkProof: ZkLoginProof;\n userAddress: string;\n maxEpoch: number;\n rpcUrl?: string;\n }): T2000 {\n const signer = new ZkLoginSigner(opts.ephemeralKeypair, opts.zkProof, opts.userAddress, opts.maxEpoch);\n const client = getSuiClient(opts.rpcUrl);\n return new T2000(signer, client, undefined, undefined, true);\n }\n\n async registerAdapter(adapter: LendingAdapter): Promise<void> {\n await adapter.init(this.client);\n this.registry.registerLending(adapter);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<SaveResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('save', params.asset);\n const asset: SupportedAsset = 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n let amount: number;\n if (params.amount === 'all') {\n const bal = await queryBalance(this.client, this._address);\n amount = (bal.available ?? 0) - 1.0;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No USDC available to save`, {\n reason: 'insufficient_balance', asset,\n });\n }\n } else {\n amount = params.amount;\n const bal = await queryBalance(this.client, this._address);\n if (amount > (bal.available ?? 0)) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance. Available: $${(bal.available ?? 0).toFixed(2)}, requested: $${amount.toFixed(2)}`);\n }\n }\n\n const fee = calculateFee('save', amount);\n const saveAmount = amount;\n const adapter = await this.resolveLending(params.protocol, asset, 'save');\n const canPTB = !!adapter.addSaveToTx;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n const merged = this._mergeCoinsInTx(tx, coins);\n const rawAmount = BigInt(Math.floor(saveAmount * 10 ** assetInfo.decimals));\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n await adapter.addSaveToTx!(tx, this._address, inputCoin, asset, { collectFee: true });\n return tx;\n }\n\n const { tx } = await adapter.buildSaveTx(this._address, saveAmount, asset, { collectFee: true });\n return tx;\n });\n\n const rates = await adapter.getRates(asset);\n reportFee(this._address, 'save', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(asset, saveAmount, 'save', gasResult.digest);\n\n let savingsBalance = saveAmount;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const positions = await this.positions();\n const actual = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n if (actual > 0) {\n savingsBalance = actual;\n break;\n }\n } catch { /* retry */ }\n await new Promise(r => setTimeout(r, 2000));\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.saveApy,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n savingsBalance,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; asset?: string; protocol?: string }): Promise<WithdrawResult> {\n this.enforcer.assertNotLocked();\n if (params.amount === 'all' && !params.protocol && !params.asset) {\n return this.withdrawAllProtocols();\n }\n\n const allPositions = await this.registry.allPositions(this._address);\n const supplies: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const s of pos.positions.supplies) {\n if (s.amount > 0.001) {\n if (params.asset && s.asset !== params.asset) continue;\n supplies.push({ protocolId: pos.protocolId, asset: s.asset, amount: s.amount, apy: s.apy });\n }\n }\n }\n\n if (supplies.length === 0) {\n throw new T2000Error('NO_COLLATERAL', params.asset ? `No ${params.asset} savings to withdraw` : 'No savings to withdraw');\n }\n\n supplies.sort((a, b) => {\n const aIsUsdc = a.asset === 'USDC' ? 0 : 1;\n const bIsUsdc = b.asset === 'USDC' ? 0 : 1;\n if (aIsUsdc !== bIsUsdc) return aIsUsdc - bIsUsdc;\n return a.apy - b.apy;\n });\n const target = supplies[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n let amount: number;\n if (params.amount === 'all') {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n amount = maxResult.maxAmount;\n if (amount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw');\n }\n } else {\n amount = params.amount;\n\n const hf = await adapter.getHealth(this._address);\n if (hf.borrowed > 0) {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n if (amount > maxResult.maxAmount) {\n throw new T2000Error(\n 'WITHDRAW_WOULD_LIQUIDATE',\n `Withdrawing $${amount.toFixed(2)} would drop health factor below 1.5`,\n {\n safeWithdrawAmount: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n projectedHF: maxResult.healthFactorAfter,\n },\n );\n }\n }\n }\n\n const withdrawAmount = amount;\n let finalAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (adapter.addWithdrawToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const { coin, effectiveAmount } = await adapter.addWithdrawToTx!(tx, this._address, withdrawAmount, target.asset);\n finalAmount = effectiveAmount;\n tx.transferObjects([coin], this._address);\n return tx;\n }\n\n const built = await adapter.buildWithdrawTx(this._address, withdrawAmount, target.asset);\n finalAmount = built.effectiveAmount;\n return built.tx;\n });\n\n this.emitBalanceChange(target.asset, finalAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: finalAmount,\n asset: target.asset,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n private async withdrawAllProtocols(): Promise<WithdrawResult> {\n const allPositions = await this.registry.allPositions(this._address);\n\n const withdrawable: Array<{ protocolId: string; asset: string; amount: number }> = [];\n for (const pos of allPositions) {\n for (const supply of pos.positions.supplies) {\n if (supply.amount > 0.01) {\n withdrawable.push({ protocolId: pos.protocolId, asset: supply.asset, amount: supply.amount });\n }\n }\n }\n\n if (withdrawable.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n const protocolMaxes = new Map<string, number>();\n const entries: Array<{ protocolId: string; asset: string; maxAmount: number; adapter: LendingAdapter }> = [];\n for (const entry of withdrawable) {\n const adapter = this.registry.getLending(entry.protocolId);\n if (!adapter) continue;\n if (!protocolMaxes.has(entry.protocolId)) {\n const maxResult = await adapter.maxWithdraw(this._address, entry.asset);\n protocolMaxes.set(entry.protocolId, maxResult.maxAmount);\n }\n const remaining = protocolMaxes.get(entry.protocolId)!;\n const perAssetMax = Math.min(entry.amount, remaining);\n if (perAssetMax > 0.01) {\n entries.push({ ...entry, maxAmount: perAssetMax, adapter });\n protocolMaxes.set(entry.protocolId, remaining - perAssetMax);\n }\n }\n\n if (entries.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n let totalReceived = 0;\n const canPTB = entries.every(e => e.adapter.addWithdrawToTx);\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n for (const entry of entries) {\n const { coin, effectiveAmount } = await entry.adapter.addWithdrawToTx!(\n tx, this._address, entry.maxAmount, entry.asset,\n );\n totalReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const entry of entries) {\n const built = await entry.adapter.buildWithdrawTx(this._address, entry.maxAmount, entry.asset);\n totalReceived += built.effectiveAmount;\n lastTx = built.tx;\n }\n return lastTx!;\n });\n\n if (totalReceived <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalReceived,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n private async _fetchCoins(coinType: string): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await this.client.getCoins({ owner: this._address, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n if (all.length > 0) {\n this._lastFundDigest = undefined;\n return all;\n }\n\n if (this._lastFundDigest && coinType === SUPPORTED_ASSETS.USDC.type) {\n const txInfo = await this.client.getTransactionBlock({\n digest: this._lastFundDigest,\n options: { showObjectChanges: true },\n });\n const coinIds = (txInfo.objectChanges ?? [])\n .filter((c): c is typeof c & { objectId: string } =>\n (c.type === 'created' || c.type === 'mutated') &&\n 'objectType' in c &&\n typeof c.objectType === 'string' &&\n c.objectType.includes('0x2::coin::Coin') &&\n c.objectType.includes(coinType),\n )\n .map(c => c.objectId);\n\n if (coinIds.length > 0) {\n const objects = await this.client.multiGetObjects({\n ids: coinIds,\n options: { showContent: true, showOwner: true },\n });\n for (const obj of objects) {\n if (\n obj.data?.content?.dataType === 'moveObject' &&\n obj.data.owner &&\n typeof obj.data.owner === 'object' &&\n 'AddressOwner' in obj.data.owner &&\n obj.data.owner.AddressOwner === this._address\n ) {\n const fields = obj.data.content.fields as Record<string, unknown>;\n all.push({ coinObjectId: obj.data.objectId!, balance: String(fields.balance ?? '0') });\n }\n }\n }\n }\n\n return all;\n }\n\n private _mergeCoinsInTx(tx: Transaction, coins: Array<{ coinObjectId: string; balance: string }>): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n }\n\n private _lastFundDigest: string | undefined;\n\n private async _autoFundFromSavings(shortfall: number): Promise<void> {\n const positions = await this.positions();\n const savingsTotal = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n if (savingsTotal < shortfall * 0.95) {\n const bal = await queryBalance(this.client, this._address);\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. Available: $${bal.available.toFixed(2)}, savings: $${savingsTotal.toFixed(2)}, requested shortfall: $${shortfall.toFixed(2)}`,\n );\n }\n\n const result = await this.withdraw({ amount: shortfall });\n if (result.amount < shortfall * 0.5) {\n throw new T2000Error(\n 'WITHDRAW_FAILED',\n `Auto-withdraw from savings returned $${result.amount.toFixed(2)} — expected ~$${shortfall.toFixed(2)}. Try withdrawing manually first.`,\n );\n }\n\n const txInfo = await this.client.getTransactionBlock({\n digest: result.tx,\n options: { showBalanceChanges: true },\n });\n const usdcReceived = (txInfo.balanceChanges ?? []).some(\n c => c.coinType === SUPPORTED_ASSETS.USDC.type &&\n Number(c.amount) > 0 &&\n typeof c.owner === 'object' && 'AddressOwner' in c.owner &&\n c.owner.AddressOwner === this._address,\n );\n if (!usdcReceived) {\n throw new T2000Error('WITHDRAW_FAILED', 'Withdraw TX did not produce USDC');\n }\n this._lastFundDigest = result.tx;\n }\n\n async maxWithdraw(): Promise<MaxWithdrawResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'withdraw');\n return adapter.maxWithdraw(this._address, 'USDC');\n }\n\n // -- Borrowing --\n\n async borrow(params: { amount: number; protocol?: string }): Promise<BorrowResult> {\n this.enforcer.assertNotLocked();\n const asset = 'USDC';\n const adapter = await this.resolveLending(params.protocol, asset, 'borrow');\n\n const maxResult = await adapter.maxBorrow(this._address, asset);\n if (maxResult.maxAmount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No collateral deposited. Save first with `t2000 save <amount>`.');\n }\n if (params.amount > maxResult.maxAmount) {\n throw new T2000Error('HEALTH_FACTOR_TOO_LOW', `Max safe borrow: $${maxResult.maxAmount.toFixed(2)}. Only savings deposits count as borrowable collateral.`, {\n maxBorrow: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n });\n }\n const fee = calculateFee('borrow', params.amount);\n const borrowAmount = params.amount;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n const { tx } = await adapter.buildBorrowTx(this._address, borrowAmount, asset, { collectFee: true });\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n reportFee(this._address, 'borrow', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(asset, borrowAmount, 'borrow', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: borrowAmount,\n fee: fee.amount,\n healthFactor: hf.healthFactor,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async repay(params: { amount: number | 'all'; protocol?: string }): Promise<RepayResult> {\n this.enforcer.assertNotLocked();\n const allPositions = await this.registry.allPositions(this._address);\n const borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const b of pos.positions.borrows) {\n if (b.amount > 0.001) borrows.push({ protocolId: pos.protocolId, asset: b.asset, amount: b.amount, apy: b.apy });\n }\n }\n\n if (borrows.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No outstanding borrow to repay');\n }\n\n if (params.amount === 'all') {\n return this._repayAllBorrows(borrows);\n }\n\n borrows.sort((a, b) => b.apy - a.apy);\n const target = borrows[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n const repayAmount = Math.min(params.amount, target.amount);\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (adapter.addRepayToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (usdcCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins');\n const merged = this._mergeCoinsInTx(tx, usdcCoins);\n const raw = BigInt(Math.floor(repayAmount * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, target.asset);\n return tx;\n }\n\n const { tx } = await adapter.buildRepayTx(this._address, repayAmount, target.asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n this.emitBalanceChange('USDC', repayAmount, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: repayAmount,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n private async _repayAllBorrows(borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }>): Promise<RepayResult> {\n borrows.sort((a, b) => b.apy - a.apy);\n\n const entries: Array<{ borrow: typeof borrows[0]; adapter: LendingAdapter }> = [];\n for (const borrow of borrows) {\n const adapter = this.registry.getLending(borrow.protocolId);\n if (adapter) entries.push({ borrow, adapter });\n }\n\n const canPTB = entries.every(e => e.adapter.addRepayToTx);\n let totalRepaid = 0;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n let usdcMerged: TransactionObjectArgument | undefined;\n if (usdcCoins.length > 0) {\n usdcMerged = this._mergeCoinsInTx(tx, usdcCoins);\n }\n\n for (const { borrow, adapter } of entries) {\n const raw = BigInt(Math.floor(borrow.amount * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n if (!usdcMerged) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC for repayment');\n const [repayCoin] = tx.splitCoins(usdcMerged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, borrow.asset);\n totalRepaid += borrow.amount;\n }\n\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const { borrow, adapter } of entries) {\n const { tx } = await adapter.buildRepayTx(this._address, borrow.amount, borrow.asset);\n lastTx = tx;\n totalRepaid += borrow.amount;\n }\n return lastTx!;\n });\n\n const firstAdapter = entries[0]?.adapter;\n const hf = firstAdapter ? await firstAdapter.getHealth(this._address) : { borrowed: 0 };\n this.emitBalanceChange('USDC', totalRepaid, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalRepaid,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async maxBorrow(): Promise<MaxBorrowResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'borrow');\n return adapter.maxBorrow(this._address, 'USDC');\n }\n\n async healthFactor(): Promise<HealthFactorResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const hf = await adapter.getHealth(this._address);\n\n if (hf.healthFactor < 1.2) {\n this.emit('healthCritical', { healthFactor: hf.healthFactor, threshold: 1.5, severity: 'critical' });\n } else if (hf.healthFactor < 2.0) {\n this.emit('healthWarning', { healthFactor: hf.healthFactor, threshold: 2.0, severity: 'warning' });\n }\n\n return hf;\n }\n\n // -- Claim Rewards --\n\n async getPendingRewards(): Promise<PendingReward[]> {\n const adapters = this.registry.listLending();\n const results = await Promise.allSettled(\n adapters\n .filter((a) => a.getPendingRewards)\n .map((a) => a.getPendingRewards!(this._address)),\n );\n const all: PendingReward[] = [];\n for (const r of results) {\n if (r.status === 'fulfilled') all.push(...r.value);\n }\n return all;\n }\n\n async claimRewards(): Promise<ClaimRewardsResult> {\n this.enforcer.assertNotLocked();\n\n const adapters = this.registry.listLending().filter((a) => a.addClaimRewardsToTx);\n if (adapters.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0, gasMethod: 'none' };\n }\n\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const allRewards: PendingReward[] = [];\n for (const adapter of adapters) {\n try {\n const claimed = await adapter.addClaimRewardsToTx!(tx, this._address);\n allRewards.push(...claimed);\n } catch { /* skip unavailable adapters */ }\n }\n\n if (allRewards.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0, gasMethod: 'none' };\n }\n\n const claimResult = await executeWithGas(this.client, this._signer, async () => tx);\n await this.client.waitForTransaction({ digest: claimResult.digest });\n\n const totalValueUsd = allRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n\n return {\n success: true,\n tx: claimResult.digest,\n rewards: allRewards,\n totalValueUsd,\n gasCost: claimResult.gasCostSui,\n gasMethod: claimResult.gasMethod,\n };\n }\n\n // -- Info --\n\n async positions(): Promise<PositionsResult> {\n const allPositions = await this.registry.allPositions(this._address);\n const positions = allPositions.flatMap(p =>\n [\n ...p.positions.supplies\n .filter(s => s.amount > 0.005)\n .map(s => ({\n protocol: p.protocolId,\n asset: s.asset,\n type: 'save' as const,\n amount: s.amount,\n amountUsd: s.amountUsd,\n apy: s.apy,\n })),\n ...p.positions.borrows\n .filter(b => b.amount > 0.005)\n .map(b => ({\n protocol: p.protocolId,\n asset: b.asset,\n type: 'borrow' as const,\n amount: b.amount,\n amountUsd: b.amountUsd,\n apy: b.apy,\n })),\n ],\n );\n return { positions };\n }\n\n async rates(): Promise<RatesResult> {\n const allRatesResult = await this.registry.allRatesAcrossAssets();\n const result: RatesResult = {};\n for (const entry of allRatesResult) {\n if (!result[entry.asset] || entry.rates.saveApy > result[entry.asset].saveApy) {\n result[entry.asset] = { saveApy: entry.rates.saveApy, borrowApy: entry.rates.borrowApy };\n }\n }\n if (!result.USDC) result.USDC = { saveApy: 0, borrowApy: 0 };\n return result;\n }\n\n async allRates(asset = 'USDC') {\n return this.registry.allRates(asset);\n }\n\n async allRatesAcrossAssets() {\n return this.registry.allRatesAcrossAssets();\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this._address);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this._address);\n }\n\n // -- Helpers --\n\n private async resolveLending(protocol: string | undefined, asset: string, capability: 'save' | 'withdraw' | 'borrow' | 'repay'): Promise<LendingAdapter> {\n if (protocol) {\n const adapter = this.registry.getLending(protocol);\n if (!adapter) throw new T2000Error('ASSET_NOT_SUPPORTED', `Lending adapter '${protocol}' not found`);\n return adapter;\n }\n\n if (capability === 'save') {\n const { adapter } = await this.registry.bestSaveRate(asset);\n return adapter;\n }\n\n if (capability === 'borrow' || capability === 'repay') {\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) &&\n a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => a.name).join(', ');\n const altAssets = [...new Set(alternatives.flatMap(a => [...a.supportedAssets]))].join(', ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Available for ${capability}: ${altList} (assets: ${altAssets})`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) && a.capabilities.includes(capability),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => `${a.name} (${[...a.supportedAssets].join(', ')})`).join('; ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Try: ${altList}`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n private emitBalanceChange(asset: string, amount: number, cause: string, tx?: string): void {\n this.emit('balanceChange', { asset, previous: 0, current: 0, cause, tx });\n }\n}\n\nasync function callSponsorApi(address: string, name?: string): Promise<void> {\n const res = await fetch(`${API_BASE_URL}/api/sponsor`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, name }),\n });\n\n if (res.status === 429) {\n const data = await res.json() as { challenge?: string };\n if (data.challenge) {\n const proof = solveHashcash(data.challenge);\n const retry = await fetch(`${API_BASE_URL}/api/sponsor`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, name, proof }),\n });\n if (!retry.ok) throw new T2000Error('SPONSOR_RATE_LIMITED', 'Sponsor rate limited');\n return;\n }\n }\n\n if (!res.ok) {\n throw new T2000Error('SPONSOR_FAILED', 'Sponsor API unavailable');\n }\n}\n\nasync function callUsdcSponsorApi(address: string): Promise<void> {\n const res = await fetch(`${API_BASE_URL}/api/sponsor/usdc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, source: 'cli' }),\n });\n\n if (res.status === 429) {\n const data = await res.json() as { challenge?: string };\n if (data.challenge) {\n const proof = solveHashcash(data.challenge);\n const retry = await fetch(`${API_BASE_URL}/api/sponsor/usdc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ address, source: 'cli', proof }),\n });\n if (!retry.ok) throw new T2000Error('USDC_SPONSOR_RATE_LIMITED', 'USDC sponsor rate limited');\n return;\n }\n }\n\n if (res.status === 409) return; // Already sponsored — not an error\n\n if (!res.ok) {\n throw new T2000Error('USDC_SPONSOR_FAILED', 'USDC sponsor unavailable');\n }\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_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' | '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 borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\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 { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, ALL_NAVI_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw } from '../utils/format.js';\nimport { addCollectFeeToTx } from './protocolFee.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\n\n// NAVI SDK expects SuiClient (v1 name), our code uses SuiJsonRpcClient (v2 name).\n// They're the same runtime class, so the cast is safe.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sdkOptions(client: SuiJsonRpcClient): { env: 'prod'; client: any; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean; skipOracle?: boolean },\n): Promise<void> {\n if (options?.skipOracle) return;\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n // Pyth update uses tx.splitCoins(tx.gas, ...) which is incompatible\n // with sponsored transactions where tx.gas belongs to the sponsor.\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n WAL: 'WAL',\n NAVX: 'NAVX',\n ETH: 'ETH',\n GOLD: 'GOLD',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = (isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0')) / 100;\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of ALL_NAVI_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p: Pool) => {\n const poolSuffix = (p.suiCoinType || p.coinType || '').split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n });\n if (!pool) continue;\n\n const saveApy = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0') / 100;\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0') / 100;\n\n if (saveApy >= 0 && saveApy < 2.0) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 2.0 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 0.04, borrowApy: 0.06 };\n return result;\n } catch {\n return { USDC: { saveApy: 0.04, borrowApy: 0.06 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coinObj, 'save');\n }\n\n const rawAmount = Math.min(Number(stableToRaw(amount, assetInfo.decimals)), Number(totalBalance));\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coinObj as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; collectFee?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string; sponsored?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin as TransactionObjectArgument, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean; skipOracle?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with. Withdraw some savings first to get cash.`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n const rawRequested = Number(stableToRaw(amount, assetInfo.decimals));\n\n if (Number(totalBalance) < rawRequested && Number(totalBalance) < 1000) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Not enough ${assetInfo.displayName} to repay (need $${amount.toFixed(2)}, wallet has ~$${(Number(totalBalance) / 10 ** assetInfo.decimals).toFixed(4)}). Withdraw some savings first.`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Math.min(rawRequested, Number(totalBalance));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\n\n await refreshOracle(tx, client, address, {\n skipPythUpdate: options.sponsored,\n skipOracle: options.skipOracle,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n } catch {\n return [];\n }\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n const claimed = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n\n return claimed.map((c) => ({\n protocol: 'navi',\n asset: '',\n coinType: '',\n symbol: 'REWARD',\n amount: 0,\n estimatedValueUsd: 0,\n }));\n } catch {\n return [];\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, address);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n const totalYieldEarned = dailyEarning * 30;\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, address);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\n","import type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports saving ${asset}`);\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async bestBorrowRate(asset: string, opts?: { requireSameAssetBorrow?: boolean }): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('borrow')) continue;\n if (opts?.requireSameAssetBorrow && !adapter.supportsSameAssetBorrow) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports borrowing ${asset}`);\n }\n\n candidates.sort((a, b) => a.rate.borrowApy - b.rate.borrowApy);\n return candidates[0];\n }\n\n async bestSaveRateAcrossAssets(): Promise<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> = [];\n\n for (const asset of STABLE_ASSETS) {\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate, asset });\n } catch { /* skip */ }\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'No lending adapter found for any stablecoin');\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async allRatesAcrossAssets(): Promise<Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }> = [];\n const seen = new Set<string>();\n for (const asset of STABLE_ASSETS) {\n if (seen.has(asset)) continue;\n seen.add(asset);\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n if (rates.saveApy > 0 || rates.borrowApy > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, asset, rates });\n }\n } catch { /* skip */ }\n }\n }\n return results;\n }\n\n async allRates(asset: string): Promise<Array<{ protocol: string; protocolId: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; rates: LendingRates }> = [];\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n results.push({ protocol: adapter.name, protocolId: adapter.id, rates });\n } catch {\n // skip\n }\n }\n return results;\n }\n\n async allPositions(address: string): Promise<Array<{ protocol: string; protocolId: string; positions: AdapterPositions }>> {\n const results: Array<{ protocol: string; protocolId: string; positions: AdapterPositions }> = [];\n const errors: string[] = [];\n for (const adapter of this.lending.values()) {\n try {\n const positions = await adapter.getPositions(address);\n if (positions.supplies.length > 0 || positions.borrows.length > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, positions });\n }\n } catch (err) {\n errors.push(`${adapter.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (results.length === 0 && errors.length > 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol queries failed (${errors.length}/${this.lending.size}): ${errors.join('; ')}`);\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n PendingReward,\n} from './types.js';\nimport { ALL_NAVI_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport { naviDescriptor as descriptor } from './descriptors.js';\n\nexport class NaviAdapter implements LendingAdapter {\n readonly id = 'navi';\n readonly name = 'NAVI Protocol';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...ALL_NAVI_ASSETS];\n readonly supportsSameAssetBorrow = true;\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n const rates = await naviProtocol.getRates(this.client);\n const normalized = normalizeAsset(asset);\n const r = rates[normalized as keyof typeof rates];\n if (!r) throw new T2000Error('ASSET_NOT_SUPPORTED', `NAVI does not support ${asset}`);\n return { asset: normalized, saveApy: r.saveApy, borrowApy: r.borrowApy };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const result = await naviProtocol.getPositions(this.client, address);\n return {\n supplies: result.positions\n .filter(p => p.type === 'save')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\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; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean; skipOracle?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, {\n asset: normalized,\n sponsored: options?.sponsored,\n skipOracle: options?.skipOracle,\n });\n return { tx };\n }\n\n async maxWithdraw(address: string, _asset: string) {\n return naviProtocol.maxWithdrawAmount(this.client, address);\n }\n\n async maxBorrow(address: string, _asset: string) {\n return naviProtocol.maxBorrowAmount(this.client, address);\n }\n\n async addWithdrawToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n ): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addWithdrawToTx(tx, this.client, address, amount, { asset: normalized });\n }\n\n async addSaveToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addSaveToTx(tx, this.client, address, coin, { ...options, asset: normalized });\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addRepayToTx(tx, this.client, address, coin, { asset: normalized });\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n return naviProtocol.getPendingRewards(this.client, address);\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n return naviProtocol.addClaimRewardsToTx(tx, this.client, address);\n }\n}\n","import type { ProtocolDescriptor } from './types.js';\n\nexport type { ProtocolDescriptor } from './types.js';\n\nexport const naviDescriptor: ProtocolDescriptor = {\n id: 'navi',\n name: 'NAVI Protocol',\n packages: [],\n dynamicPackageId: true,\n actionMap: {\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","import { createHash } from 'node:crypto';\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n\n return true;\n}\n\nexport function solveHashcash(challenge: string): string {\n const bits = parseInt(challenge.split(':')[1], 10);\n let counter = 0;\n while (true) {\n const stamp = `${challenge}${counter.toString(16)}`;\n const hash = createHash('sha256').update(stamp).digest();\n if (hasLeadingZeroBits(hash, bits)) return stamp;\n counter++;\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error, isMoveAbort, parseMoveAbortMessage } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport type { SafeguardEnforcer } from '../safeguards/enforcer.js';\nimport type { TxMetadata } from '../safeguards/types.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n balanceChanges?: unknown[];\n gasMethod: GasMethod;\n gasCostSui: number;\n /** Pre-TX SUI balance in MIST — used internally for proactive gas maintenance. */\n preTxSuiMist?: bigint;\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\nasync function getSuiBalance(client: SuiJsonRpcClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function assertTxSuccess(effects: unknown, digest: string): Promise<void> {\n const eff = effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n const errMsg = eff.status.error ?? 'unknown on-chain error';\n if (isMoveAbort(errMsg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(errMsg));\n }\n throw new T2000Error('TRANSACTION_FAILED', `Transaction ${digest} failed on-chain: ${errMsg}`);\n }\n}\n\nasync function trySelfFunded(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiBalance,\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, signer);\n\n // Rebuild the transaction with fresh object versions (auto-topup changed coin state)\n const tx = await buildTx();\n tx.setSender(address);\n\n const suiAfterTopUp = await getSuiBalance(client, address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiAfterTopUp,\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n tx.setSender(address);\n\n // Use serialize() for pure v2 transactions, fall back to build() for\n // mixed v1/v2 transactions (e.g. Cetus aggregator adds v1 commands).\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = tx.serialize();\n } catch {\n const bcsBytes = await tx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = fromBase64(sponsoredResult.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n preTxSuiMist: suiBalance,\n };\n}\n\n/**\n * Best-effort indexer readiness check after transaction finalization.\n * Verifies the TX effects are queryable. Note: aggregate indices\n * (getBalance, getDynamicFields) may still lag — callers that need\n * consistent reads should poll their expected state separately.\n */\nasync function waitForIndexer(client: SuiJsonRpcClient, digest: string): Promise<void> {\n for (let i = 0; i < 3; i++) {\n try {\n await client.getTransactionBlock({ digest, options: { showObjectChanges: true } });\n return;\n } catch {\n await new Promise(r => setTimeout(r, 500));\n }\n }\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n *\n * After every successful transaction, proactively tops up SUI if it\n * dropped below threshold — so the user never hits a \"no gas\" wall.\n */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n options?: { metadata?: TxMetadata; enforcer?: SafeguardEnforcer },\n): Promise<GasExecutionResult> {\n if (options?.enforcer && options?.metadata) {\n options.enforcer.check(options.metadata);\n }\n\n const result = await resolveGas(client, signer, buildTx);\n\n // Proactive gas maintenance — compute remaining SUI from the TX result\n // instead of querying the indexer (which may still show stale balances).\n try {\n if (result.preTxSuiMist !== undefined) {\n const gasCostMist = result.gasMethod === 'sponsored'\n ? 0n\n : BigInt(Math.round(result.gasCostSui * 1e9));\n const estimatedRemaining = result.preTxSuiMist - gasCostMist;\n if (estimatedRemaining < GAS_RESERVE_TARGET) {\n const address = signer.getAddress();\n const usdcBal = await client.getBalance({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n if (BigInt(usdcBal.totalBalance) >= AUTO_TOPUP_MIN_USDC) {\n await executeAutoTopUp(client, signer);\n }\n }\n }\n } catch { /* best-effort — don't fail the main operation */ }\n\n return result;\n}\n\nconst GAS_RESOLUTION_CODES: Set<string> = new Set([\n 'INSUFFICIENT_GAS',\n 'GAS_STATION_UNAVAILABLE',\n 'GAS_FEE_EXCEEDED',\n 'AUTO_TOPUP_FAILED',\n 'SPONSOR_UNAVAILABLE',\n]);\n\nfunction isBuildError(err: unknown): err is T2000Error {\n return err instanceof T2000Error && !GAS_RESOLUTION_CODES.has(err.code);\n}\n\nasync function resolveGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n let lastBuildError: T2000Error | undefined;\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (swap USDC→SUI) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, signer, buildTx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2.5: Retry self-funded — auto-topup may have deposited SUI\n // even if the combined operation failed\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded-retry: ${msg}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('sponsored: returned null');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n if (lastBuildError) throw lastBuildError;\n\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and sponsorship unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SUPPORTED_ASSETS,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n} from '../constants.js';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n // Auto top-up requires a DEX swap (USDC→SUI) which is not available\n // without a swap adapter. Gas station sponsorship is the fallback.\n if (suiRaw < GAS_RESERVE_TARGET && usdcRaw >= AUTO_TOPUP_MIN_USDC) {\n return false;\n }\n return false;\n}\n\nexport async function executeAutoTopUp(\n _client: SuiJsonRpcClient,\n _signer: TransactionSigner,\n): Promise<AutoTopUpResult> {\n // Auto top-up requires USDC→SUI swap via DEX. Currently unavailable —\n // gas station sponsorship handles gas funding instead.\n return { success: false, tx: '', usdcSpent: 0, suiReceived: 0 };\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { toBase64 } from '../utils/base64.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\n/**\n * Request gas sponsorship from the gas station.\n *\n * Sends `txJson` (preferred) or `txBcsBytes` (base64-encoded BCS from tx.build(),\n * used when serialize() fails due to v1/v2 SDK mismatch with aggregator).\n */\nexport async function requestGasSponsorship(\n txJson: string,\n sender: string,\n type?: GasRequestType,\n txBcsBytes?: string,\n): Promise<GasSponsorResponse> {\n const payload: Record<string, unknown> = { sender, type };\n if (txBcsBytes) {\n payload.txBcsBytes = txBcsBytes;\n } else {\n payload.txJson = txJson;\n payload.txBytes = toBase64(new TextEncoder().encode(txJson));\n }\n\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED' || errorCode === 'PRICE_STALE') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter, reason: errorCode },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n { reason: errorCode },\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","/** Cross-platform (Node + browser) base64 helpers. */\n\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nexport function fromBase64(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","export interface SafeguardConfig {\n locked: boolean;\n maxPerTx: number;\n maxDailySend: number;\n dailyUsed: number;\n dailyResetDate: string;\n maxLeverage?: number;\n maxPositionSize?: number;\n}\n\nexport interface TxMetadata {\n operation:\n | 'send'\n | 'save'\n | 'withdraw'\n | 'borrow'\n | 'repay'\n | 'pay';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n]);\n\nexport const DEFAULT_SAFEGUARD_CONFIG: SafeguardConfig = {\n locked: false,\n maxPerTx: 0,\n maxDailySend: 0,\n dailyUsed: 0,\n dailyResetDate: '',\n};\n","import { T2000Error } from '../errors.js';\n\nexport type SafeguardRule = 'locked' | 'maxPerTx' | 'maxDailySend';\n\nexport interface SafeguardErrorDetails {\n attempted?: number;\n limit?: number;\n current?: number;\n}\n\nexport class SafeguardError extends T2000Error {\n readonly rule: SafeguardRule;\n readonly details: SafeguardErrorDetails;\n\n constructor(rule: SafeguardRule, details: SafeguardErrorDetails, message?: string) {\n const msg = message ?? buildMessage(rule, details);\n super('SAFEGUARD_BLOCKED' as any, msg, { rule, ...details });\n this.name = 'SafeguardError';\n this.rule = rule;\n this.details = details;\n }\n\n override toJSON() {\n return {\n error: 'SAFEGUARD_BLOCKED' as const,\n message: this.message,\n retryable: this.retryable,\n data: { rule: this.rule, ...this.details },\n };\n }\n}\n\nfunction buildMessage(rule: SafeguardRule, details: SafeguardErrorDetails): string {\n switch (rule) {\n case 'locked':\n return 'Agent is locked. All operations are frozen.';\n case 'maxPerTx':\n return `Amount $${(details.attempted ?? 0).toFixed(2)} exceeds per-transaction limit ($${(details.limit ?? 0).toFixed(2)})`;\n case 'maxDailySend':\n return `Daily send limit reached ($${(details.current ?? 0).toFixed(2)}/$${(details.limit ?? 0).toFixed(2)} used today)`;\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SafeguardConfig, TxMetadata } from './types.js';\nimport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './types.js';\nimport { SafeguardError } from './errors.js';\n\nexport class SafeguardEnforcer {\n private config: SafeguardConfig;\n private readonly configPath: string | null;\n\n constructor(configDir?: string) {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n this.configPath = configDir ? join(configDir, 'config.json') : null;\n }\n\n load(): void {\n if (!this.configPath) return;\n try {\n const raw = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n this.config = {\n ...DEFAULT_SAFEGUARD_CONFIG,\n locked: raw.locked ?? false,\n maxPerTx: raw.maxPerTx ?? 0,\n maxDailySend: raw.maxDailySend ?? 0,\n dailyUsed: raw.dailyUsed ?? 0,\n dailyResetDate: raw.dailyResetDate ?? '',\n };\n } catch {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n }\n }\n\n assertNotLocked(): void {\n this.load();\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n }\n\n check(metadata: TxMetadata): void {\n this.load();\n\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n\n if (!OUTBOUND_OPS.has(metadata.operation)) return;\n\n const amount = metadata.amount ?? 0;\n\n if (this.config.maxPerTx > 0 && amount > this.config.maxPerTx) {\n throw new SafeguardError('maxPerTx', {\n attempted: amount,\n limit: this.config.maxPerTx,\n });\n }\n\n this.resetDailyIfNewDay();\n\n if (this.config.maxDailySend > 0 && this.config.dailyUsed + amount > this.config.maxDailySend) {\n throw new SafeguardError('maxDailySend', {\n attempted: amount,\n limit: this.config.maxDailySend,\n current: this.config.dailyUsed,\n });\n }\n }\n\n recordUsage(amount: number): void {\n this.resetDailyIfNewDay();\n this.config.dailyUsed += amount;\n this.save();\n }\n\n lock(): void {\n this.config.locked = true;\n this.save();\n }\n\n unlock(): void {\n this.config.locked = false;\n this.save();\n }\n\n set(key: string, value: unknown): void {\n if (key === 'locked' && typeof value === 'boolean') {\n this.config.locked = value;\n } else if (key === 'maxPerTx' && typeof value === 'number') {\n this.config.maxPerTx = value;\n } else if (key === 'maxDailySend' && typeof value === 'number') {\n this.config.maxDailySend = value;\n }\n this.save();\n }\n\n getConfig(): SafeguardConfig {\n this.load();\n this.resetDailyIfNewDay();\n return { ...this.config };\n }\n\n isConfigured(): boolean {\n return this.config.maxPerTx > 0 || this.config.maxDailySend > 0;\n }\n\n private resetDailyIfNewDay(): void {\n const today = new Date().toISOString().slice(0, 10);\n if (this.config.dailyResetDate !== today) {\n this.config.dailyUsed = 0;\n this.config.dailyResetDate = today;\n this.save();\n }\n }\n\n private save(): void {\n if (!this.configPath) return;\n try {\n let existing: Record<string, unknown> = {};\n try {\n existing = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n } catch {\n // no existing config\n }\n\n const merged = {\n ...existing,\n locked: this.config.locked,\n maxPerTx: this.config.maxPerTx,\n maxDailySend: this.config.maxDailySend,\n dailyUsed: this.config.dailyUsed,\n dailyResetDate: this.config.dailyResetDate,\n };\n\n const dir = this.configPath.replace(/[/\\\\][^/\\\\]+$/, '');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.configPath, JSON.stringify(merged, null, 2) + '\\n');\n } catch {\n // Best-effort persistence\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { validateAddress } from './utils/sui.js';\nimport { T2000Error } from './errors.js';\n\nexport interface Contact {\n name: string;\n address: string;\n}\n\nexport type ContactMap = Record<string, Contact>;\n\nconst RESERVED_NAMES = new Set(['to', 'all', 'address']);\n\nexport class ContactManager {\n private contacts: ContactMap = {};\n private readonly filePath: string;\n private readonly dir: string;\n\n constructor(configDir?: string) {\n this.dir = configDir ?? join(homedir(), '.t2000');\n this.filePath = join(this.dir, 'contacts.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.contacts = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.contacts = {};\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.contacts, null, 2));\n }\n\n add(name: string, address: string): { action: 'added' | 'updated' } {\n this.validateName(name);\n const normalized = validateAddress(address);\n const key = name.toLowerCase();\n const existed = key in this.contacts;\n this.contacts[key] = { name, address: normalized };\n this.save();\n return { action: existed ? 'updated' : 'added' };\n }\n\n remove(name: string): boolean {\n const key = name.toLowerCase();\n if (!(key in this.contacts)) return false;\n delete this.contacts[key];\n this.save();\n return true;\n }\n\n get(name: string): Contact | undefined {\n this.load();\n return this.contacts[name.toLowerCase()];\n }\n\n list(): Contact[] {\n this.load();\n return Object.values(this.contacts);\n }\n\n resolve(nameOrAddress: string): { address: string; contactName?: string } {\n this.load();\n\n if (nameOrAddress.startsWith('0x') && nameOrAddress.length >= 42) {\n return { address: validateAddress(nameOrAddress) };\n }\n\n const contact = this.contacts[nameOrAddress.toLowerCase()];\n if (contact) {\n return { address: contact.address, contactName: contact.name };\n }\n\n throw new T2000Error(\n 'CONTACT_NOT_FOUND',\n `\"${nameOrAddress}\" is not a valid Sui address or saved contact.\\n` +\n ` Add it: t2000 contacts add ${nameOrAddress} 0x...`,\n );\n }\n\n private validateName(name: string): void {\n if (name.startsWith('0x')) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names cannot start with 0x');\n }\n if (!/^[a-zA-Z0-9_]+$/.test(name)) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names can only contain letters, numbers, and underscores');\n }\n if (name.length > 32) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names must be 32 characters or fewer');\n }\n if (RESERVED_NAMES.has(name.toLowerCase())) {\n throw new T2000Error('INVALID_CONTACT_NAME', `\"${name}\" is a reserved name and cannot be used as a contact`);\n }\n }\n}\n","export { T2000 } from './t2000.js';\nexport type { TransactionSigner } from './signer.js';\nexport { KeypairSigner } from './wallet/keypairSigner.js';\nexport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nexport { ContactManager } from './contacts.js';\nexport { T2000Error, mapWalletError, mapMoveAbortCode } from './errors.js';\nexport type { T2000ErrorCode, T2000ErrorData } from './errors.js';\nexport type {\n T2000Options,\n BalanceResponse,\n GasReserve,\n GasMethod,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n AssetRates,\n RatesResult,\n PositionEntry,\n PositionsResult,\n EarningsResult,\n FundStatusResult,\n DepositInfo,\n PaymentRequest,\n TransactionRecord,\n PendingReward,\n ClaimRewardsResult,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n AllowanceInfo,\n AllowanceCreateResult,\n AllowanceDepositResult,\n AllowanceWithdrawResult,\n AllowanceDeductResult,\n FinancialSummary,\n HFAlertLevel,\n} from './types.js';\nexport {\n MIST_PER_SUI,\n SUI_DECIMALS,\n USDC_DECIMALS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n CLOCK_ID,\n DEFAULT_NETWORK,\n} from './constants.js';\nexport type { SupportedAsset, StableAsset } from './constants.js';\nexport {\n STABLE_ASSETS,\n ALL_NAVI_ASSETS,\n GAS_RESERVE_MIN,\n CETUS_USDC_SUI_POOL,\n OPERATION_ASSETS,\n ALLOWANCE_FEATURES,\n isAllowedAsset,\n assertAllowedAsset,\n} from './constants.js';\nexport type { Operation, AllowanceFeature } from './constants.js';\nexport { validateAddress, truncateAddress } from './utils/sui.js';\nexport {\n mistToSui,\n suiToMist,\n usdcToRaw,\n rawToUsdc,\n stableToRaw,\n rawToStable,\n getDecimals,\n formatUsd,\n formatSui,\n formatAssetAmount,\n} from './utils/format.js';\nexport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nexport { solveHashcash } from './utils/hashcash.js';\nexport { calculateFee, addCollectFeeToTx } from './protocols/protocolFee.js';\nexport type { ProtocolFeeInfo, FeeOperation } from './protocols/protocolFee.js';\nexport {\n buildCreateAllowanceTx,\n addDepositAllowanceTx,\n buildDepositAllowanceTx,\n buildAdminDepositAllowanceTx,\n buildDeductAllowanceTx,\n buildWithdrawAllowanceTx,\n buildWithdrawAmountAllowanceTx,\n getAllowance,\n getAllowanceBalance,\n} from './protocols/allowance.js';\nexport {\n getFinancialSummary,\n HF_WARN_THRESHOLD,\n HF_CRITICAL_THRESHOLD,\n} from './protocols/financialSummary.js';\nexport type { FinancialSummaryOptions } from './protocols/financialSummary.js';\nexport { simulateTransaction, throwIfSimulationFailed } from './utils/simulate.js';\nexport type { SimulationResult } from './utils/simulate.js';\nexport { getRates } from './protocols/navi.js';\nexport { getSwapQuote } from './swap-quote.js';\nexport {\n findSwapRoute,\n buildSwapTx,\n} from './protocols/cetus-swap.js';\nexport type { SwapRouteResult } from './protocols/cetus-swap.js';\nexport {\n COIN_REGISTRY,\n TOKEN_MAP,\n resolveTokenType,\n resolveSymbol,\n getDecimalsForCoinType,\n isTier1,\n isTier2,\n isSupported,\n getTier,\n SUI_TYPE,\n USDC_TYPE,\n USDT_TYPE,\n USDSUI_TYPE,\n USDE_TYPE,\n ETH_TYPE,\n WBTC_TYPE,\n WAL_TYPE,\n NAVX_TYPE,\n IKA_TYPE,\n LOFI_TYPE,\n MANIFEST_TYPE,\n} from './token-registry.js';\nexport type { CoinMeta } from './token-registry.js';\nexport {\n buildStakeVSuiTx,\n buildUnstakeVSuiTx,\n getVoloStats,\n VSUI_TYPE,\n VOLO_PKG,\n VOLO_POOL,\n VOLO_METADATA,\n} from './protocols/volo.js';\nexport type { VoloStats } from './protocols/volo.js';\nexport * from './adapters/index.js';\nexport { SafeguardEnforcer, SafeguardError } from './safeguards/index.js';\nexport type { SafeguardConfig, TxMetadata, SafeguardRule, SafeguardErrorDetails } from './safeguards/index.js';\nexport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './safeguards/index.js';\nexport type { ScopedIntent, ScopedIntentPayload } from './types/scoped-intent.js';\nexport { buildScopedIntent, verifyScopedIntent } from './auth/intent-builder.js';\nexport type { BuildIntentParams } from './auth/intent-builder.js';\nexport {\n executeWithGas,\n shouldAutoTopUp,\n executeAutoTopUp,\n getGasStatus,\n} from './gas/index.js';\nexport type {\n GasExecutionResult,\n AutoTopUpResult,\n GasSponsorResponse,\n GasStatusResponse,\n GasRequestType,\n} from './gas/index.js';\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n T2000_PACKAGE_ID,\n T2000_CONFIG_ID,\n T2000_ADMIN_CAP_ID,\n SUPPORTED_ASSETS,\n CLOCK_ID,\n ALLOWANCE_FEATURES,\n FEATURES_ALL,\n} from '../constants.js';\nimport type { AllowanceFeature } from '../constants.js';\nimport type { AllowanceInfo } from '../types.js';\n\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\n\n// ---------------------------------------------------------------------------\n// Transaction builders\n// ---------------------------------------------------------------------------\n\nexport interface CreateAllowanceOptions {\n permittedFeatures?: bigint;\n expiresAt?: bigint;\n dailyLimit?: bigint;\n}\n\n/**\n * Build a PTB that creates a new shared Allowance<USDC> for the signer.\n */\nexport function buildCreateAllowanceTx(options: CreateAllowanceOptions = {}): Transaction {\n const tx = new Transaction();\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::allowance::create`,\n typeArguments: [USDC_TYPE],\n arguments: [\n tx.pure.u64(options.permittedFeatures ?? BigInt(FEATURES_ALL)),\n tx.pure.u64(options.expiresAt ?? 0n),\n tx.pure.u64(options.dailyLimit ?? 0n),\n tx.object(CLOCK_ID),\n ],\n });\n return tx;\n}\n\n/**\n * Add an owner deposit call to an existing PTB.\n * The caller must provide a coin reference (e.g. from `tx.splitCoins`).\n */\nexport function addDepositAllowanceTx(\n tx: Transaction,\n allowanceId: string,\n paymentCoin: TransactionObjectArgument,\n): void {\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::allowance::deposit`,\n typeArguments: [USDC_TYPE],\n arguments: [tx.object(allowanceId), paymentCoin],\n });\n}\n\n/**\n * Build a standalone deposit PTB that splits `amount` (raw USDC) from\n * the given USDC coin and deposits into the allowance.\n */\nexport function buildDepositAllowanceTx(\n allowanceId: string,\n usdcCoin: string,\n amount: bigint,\n): Transaction {\n const tx = new Transaction();\n const [split] = tx.splitCoins(tx.object(usdcCoin), [tx.pure.u64(amount)]);\n addDepositAllowanceTx(tx, allowanceId, split);\n return tx;\n}\n\n/**\n * Build an admin-sponsored deposit PTB. Requires AdminCap in the signer's wallet.\n */\nexport function buildAdminDepositAllowanceTx(\n allowanceId: string,\n usdcCoin: string,\n amount: bigint,\n): Transaction {\n const tx = new Transaction();\n const [split] = tx.splitCoins(tx.object(usdcCoin), [tx.pure.u64(amount)]);\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::allowance::admin_deposit`,\n typeArguments: [USDC_TYPE],\n arguments: [\n tx.object(allowanceId),\n tx.object(T2000_ADMIN_CAP_ID),\n split,\n ],\n });\n return tx;\n}\n\n/**\n * Build a deduct PTB. Only callable by the AdminCap holder (server/cron).\n * Enforces on-chain: feature permission, expiry, daily limit.\n */\nexport function buildDeductAllowanceTx(\n allowanceId: string,\n amount: bigint,\n feature: AllowanceFeature,\n): Transaction {\n const tx = new Transaction();\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::allowance::deduct`,\n typeArguments: [USDC_TYPE],\n arguments: [\n tx.object(allowanceId),\n tx.object(T2000_CONFIG_ID),\n tx.object(T2000_ADMIN_CAP_ID),\n tx.pure.u64(amount),\n tx.pure.u8(feature),\n tx.object(CLOCK_ID),\n ],\n });\n return tx;\n}\n\n/**\n * Build an update_scope PTB. Owner updates permitted features, expiry, and daily limit.\n */\nexport function buildUpdateScopeTx(\n allowanceId: string,\n permittedFeatures: bigint,\n expiresAt: bigint,\n dailyLimit: bigint,\n): Transaction {\n const tx = new Transaction();\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::allowance::update_scope`,\n typeArguments: [USDC_TYPE],\n arguments: [\n tx.object(allowanceId),\n tx.pure.u64(permittedFeatures),\n tx.pure.u64(expiresAt),\n tx.pure.u64(dailyLimit),\n tx.object(CLOCK_ID),\n ],\n });\n return tx;\n}\n\n/**\n * Build a full-withdrawal PTB. Returns entire remaining balance to the owner.\n */\nexport function buildWithdrawAllowanceTx(allowanceId: string): Transaction {\n const tx = new Transaction();\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::allowance::withdraw`,\n typeArguments: [USDC_TYPE],\n arguments: [tx.object(allowanceId)],\n });\n return tx;\n}\n\n/**\n * Build a partial-withdrawal PTB. Returns `amount` (raw USDC) to the owner.\n */\nexport function buildWithdrawAmountAllowanceTx(\n allowanceId: string,\n amount: bigint,\n): Transaction {\n const tx = new Transaction();\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::allowance::withdraw_amount`,\n typeArguments: [USDC_TYPE],\n arguments: [tx.object(allowanceId), tx.pure.u64(amount)],\n });\n return tx;\n}\n\n// ---------------------------------------------------------------------------\n// Read helpers (on-chain queries)\n// ---------------------------------------------------------------------------\n\ninterface AllowanceFields {\n id: { id: string };\n owner: string;\n balance: string;\n total_deposited: string;\n total_spent: string;\n created_at: string;\n permitted_features: string;\n expires_at: string;\n daily_limit: string;\n daily_spent: string;\n window_start: string;\n}\n\n/**\n * Fetch the full allowance state from an on-chain Allowance<T> shared object.\n */\nexport async function getAllowance(\n client: SuiJsonRpcClient,\n allowanceId: string,\n): Promise<AllowanceInfo> {\n const obj = await client.getObject({\n id: allowanceId,\n options: { showContent: true, showType: true },\n });\n\n if (!obj.data?.content || obj.data.content.dataType !== 'moveObject') {\n throw new Error(`Allowance ${allowanceId} not found or is not a Move object`);\n }\n\n const fields = obj.data.content.fields as unknown as AllowanceFields;\n const coinType = extractCoinType(obj.data.content.type);\n\n return {\n id: allowanceId,\n owner: fields.owner,\n balance: parseU64Field(fields.balance),\n totalDeposited: parseU64Field(fields.total_deposited),\n totalSpent: parseU64Field(fields.total_spent),\n createdAt: Number(fields.created_at),\n coinType,\n permittedFeatures: parseU64Field(fields.permitted_features),\n expiresAt: Number(fields.expires_at),\n dailyLimit: parseU64Field(fields.daily_limit),\n dailySpent: parseU64Field(fields.daily_spent),\n windowStart: Number(fields.window_start),\n };\n}\n\n/**\n * Shorthand: get just the USDC balance of an allowance.\n */\nexport async function getAllowanceBalance(\n client: SuiJsonRpcClient,\n allowanceId: string,\n): Promise<bigint> {\n const info = await getAllowance(client, allowanceId);\n return info.balance;\n}\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\n/**\n * Sui RPC usually flattens Balance<T> to its inner u64 string, but some\n * edge cases return `{ value: \"...\" }`. Handle both.\n */\nfunction parseU64Field(raw: unknown): bigint {\n if (typeof raw === 'string' || typeof raw === 'number') return BigInt(raw);\n if (typeof raw === 'object' && raw !== null && 'value' in raw) {\n return BigInt((raw as { value: string }).value);\n }\n return 0n;\n}\n\nfunction extractCoinType(objectType: string): string {\n const match = objectType.match(/<(.+)>/);\n return match ? match[1] : 'unknown';\n}\n\nexport { ALLOWANCE_FEATURES, FEATURES_ALL };\nexport type { AllowanceFeature };\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { FinancialSummary, HFAlertLevel, HealthFactorResult } from '../types.js';\nimport { getHealthFactor, getRates } from './navi.js';\nimport { getAllowanceBalance } from './allowance.js';\n\nconst HF_WARN_THRESHOLD = 1.8;\nconst HF_CRITICAL_THRESHOLD = 1.3;\n\nconst HF_FALLBACK: HealthFactorResult = {\n healthFactor: Infinity,\n supplied: 0,\n borrowed: 0,\n maxBorrow: 0,\n liquidationThreshold: 0.75,\n};\n\nfunction classifyHF(hf: number, hasBorrow: boolean): HFAlertLevel {\n if (!hasBorrow || !Number.isFinite(hf)) return 'none';\n if (hf <= HF_CRITICAL_THRESHOLD) return 'critical';\n if (hf <= HF_WARN_THRESHOLD) return 'warn';\n return 'none';\n}\n\nasync function fetchSuiPriceUsd(client: SuiJsonRpcClient): Promise<number> {\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const sqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n if (sqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtFloat = Number(sqrtPrice) / Number(Q64);\n const price = 1000 / (sqrtFloat * sqrtFloat);\n if (price > 0.01 && price < 1000) return price;\n }\n }\n } catch { /* fallback */ }\n return 1.0;\n}\n\nexport interface FinancialSummaryOptions {\n allowanceId?: string;\n}\n\n/**\n * Fetch a complete financial snapshot for one wallet in parallel.\n * Designed for the notification cron — one call returns everything\n * a briefing, HF alert, or rate alert needs.\n *\n * Every sub-call has a fallback so a single RPC failure doesn't\n * crash the entire batch. Callers can check individual zero values\n * to detect degraded data.\n */\nexport async function getFinancialSummary(\n client: SuiJsonRpcClient,\n walletAddress: string,\n options: FinancialSummaryOptions = {},\n): Promise<FinancialSummary> {\n const [usdcBal, suiBal, hf, rates, suiPrice, allowance] = await Promise.all([\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.USDC.type })\n .catch(() => ({ totalBalance: '0' })),\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.SUI.type })\n .catch(() => ({ totalBalance: '0' })),\n getHealthFactor(client, walletAddress)\n .catch(() => HF_FALLBACK),\n getRates(client),\n fetchSuiPriceUsd(client),\n options.allowanceId\n ? getAllowanceBalance(client, options.allowanceId).catch(() => null)\n : Promise.resolve(null),\n ]);\n\n const usdcAvailable = Number(usdcBal.totalBalance) / 10 ** SUPPORTED_ASSETS.USDC.decimals;\n const gasReserveSui = Number(suiBal.totalBalance) / Number(MIST_PER_SUI);\n const saveApy = rates.USDC?.saveApy ?? 0;\n const borrowApy = rates.USDC?.borrowApy ?? 0;\n const dailyYield = hf.supplied * (saveApy / 365);\n\n return {\n walletAddress,\n usdcAvailable,\n savingsBalance: hf.supplied,\n debtBalance: hf.borrowed,\n idleUsdc: Math.max(0, usdcAvailable),\n healthFactor: hf.healthFactor,\n hfAlertLevel: classifyHF(hf.healthFactor, hf.borrowed > 0),\n saveApy,\n borrowApy,\n dailyYield,\n gasReserveSui,\n gasReserveUsd: gasReserveSui * suiPrice,\n allowanceBalance: allowance,\n fetchedAt: Date.now(),\n };\n}\n\nexport { HF_WARN_THRESHOLD, HF_CRITICAL_THRESHOLD };\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\nimport { mapMoveAbortCode } from '../errors.js';\n\nexport interface SimulationResult {\n success: boolean;\n gasEstimateSui: number;\n error?: {\n moveAbortCode?: number;\n moveModule?: string;\n reason: string;\n rawError: string;\n };\n}\n\nexport async function simulateTransaction(\n client: SuiJsonRpcClient,\n tx: Transaction,\n sender: string,\n): Promise<SimulationResult> {\n tx.setSender(sender);\n\n try {\n const txBytes = await tx.build({ client });\n const dryRun = await client.dryRunTransactionBlock({\n transactionBlock: Buffer.from(txBytes).toString('base64'),\n });\n\n const status = dryRun.effects?.status;\n const gasUsed = dryRun.effects?.gasUsed;\n\n const gasEstimateSui = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) / 1e9\n : 0;\n\n if (status?.status === 'failure') {\n const rawError = status.error ?? 'Unknown simulation error';\n const parsed = parseMoveAbort(rawError);\n\n return {\n success: false,\n gasEstimateSui,\n error: {\n moveAbortCode: parsed.abortCode,\n moveModule: parsed.module,\n reason: parsed.reason,\n rawError,\n },\n };\n }\n\n return { success: true, gasEstimateSui };\n } catch (err) {\n const rawError = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n gasEstimateSui: 0,\n error: {\n reason: 'Simulation failed: ' + rawError,\n rawError,\n },\n };\n }\n}\n\nexport function throwIfSimulationFailed(sim: SimulationResult): void {\n if (sim.success) return;\n\n throw new T2000Error(\n 'SIMULATION_FAILED',\n sim.error?.reason ?? 'Transaction simulation failed',\n {\n moveAbortCode: sim.error?.moveAbortCode,\n moveModule: sim.error?.moveModule,\n reason: sim.error?.reason,\n rawError: sim.error?.rawError,\n },\n );\n}\n\nfunction parseMoveAbort(errorStr: string): {\n abortCode?: number;\n module?: string;\n reason: string;\n} {\n // Pattern: MoveAbort(MoveLocation { module: ModuleId { ... name: \"module\" }, ... }, code)\n const abortMatch = errorStr.match(/MoveAbort\\([^,]*,\\s*(\\d+)\\)/);\n const moduleMatch = errorStr.match(/name:\\s*Identifier\\(\"([^\"]+)\"\\)/);\n\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n const module = moduleMatch?.[1];\n const reason = mapMoveAbortCode(code);\n return { abortCode: code, module, reason };\n }\n\n // Pattern: MovePrimitiveRuntimeError\n if (errorStr.includes('MovePrimitiveRuntimeError')) {\n const module = moduleMatch?.[1];\n return {\n module,\n reason: `Move runtime error in ${module ?? 'unknown'} module`,\n };\n }\n\n return { reason: errorStr };\n}\n","/**\n * Standalone swap quote — no T2000 agent instance required.\n * Only needs a wallet address for Cetus Aggregator routing.\n */\nimport { getDecimalsForCoinType } from './token-registry.js';\nimport type { SwapQuoteResult } from './types.js';\n\nexport async function getSwapQuote(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n}): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType, TOKEN_MAP } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new Error(`Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new Error(`Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: params.walletAddress,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new Error(`No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new Error(`Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p: { provider?: string }) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport type { AllowanceFeature } from '../constants.js';\nimport type { ScopedIntent, ScopedIntentPayload } from '../types/scoped-intent.js';\n\nconst DEFAULT_TTL_MS = 60_000; // 60 seconds\n\nexport interface BuildIntentParams {\n userId: string;\n walletAddress: string;\n allowanceObjectId: string;\n featureCode: AllowanceFeature;\n maxAmount: number;\n ttlMs?: number;\n}\n\n/**\n * Build a ScopedIntent signed by the admin keypair.\n * Generates a cryptographically random 32-byte nonce and signs the canonical payload.\n */\nexport async function buildScopedIntent(\n adminKeypair: Ed25519Keypair,\n params: BuildIntentParams,\n): Promise<ScopedIntent> {\n const now = Date.now();\n const nonceBytes = new Uint8Array(32);\n crypto.getRandomValues(nonceBytes);\n const nonce = Buffer.from(nonceBytes).toString('hex');\n\n const payload: ScopedIntentPayload = {\n version: 1,\n userId: params.userId,\n walletAddress: params.walletAddress,\n allowanceObjectId: params.allowanceObjectId,\n featureCode: params.featureCode,\n maxAmount: params.maxAmount,\n issuedAt: now,\n expiresAt: now + (params.ttlMs ?? DEFAULT_TTL_MS),\n nonce,\n };\n\n const message = canonicalIntentBytes(payload);\n const signature = await adminKeypair.sign(message);\n\n return {\n ...payload,\n signature: Buffer.from(signature).toString('hex'),\n };\n}\n\n/**\n * Verify a ScopedIntent:\n * 1. Check TTL — reject expired intents immediately (fast path)\n * 2. Verify Ed25519 signature over canonical payload\n */\nexport async function verifyScopedIntent(\n intent: ScopedIntent,\n adminPublicKeyBytes: Uint8Array,\n): Promise<boolean> {\n if (Date.now() > intent.expiresAt) return false;\n\n const payload: ScopedIntentPayload = {\n version: intent.version,\n userId: intent.userId,\n walletAddress: intent.walletAddress,\n allowanceObjectId: intent.allowanceObjectId,\n featureCode: intent.featureCode,\n maxAmount: intent.maxAmount,\n issuedAt: intent.issuedAt,\n expiresAt: intent.expiresAt,\n nonce: intent.nonce,\n };\n\n const message = canonicalIntentBytes(payload);\n const signatureBytes = Buffer.from(intent.signature, 'hex');\n\n try {\n const publicKey = new Ed25519PublicKey(adminPublicKeyBytes);\n return await publicKey.verify(message, signatureBytes);\n } catch {\n return false;\n }\n}\n\n/**\n * Deterministic serialization: sorted keys, no whitespace.\n * Guarantees signature verification is independent of property insertion order.\n */\nfunction canonicalIntentBytes(payload: ScopedIntentPayload): Uint8Array {\n const sorted = Object.fromEntries(\n Object.entries(payload).sort(([a], [b]) => a.localeCompare(b)),\n );\n return new TextEncoder().encode(JSON.stringify(sorted));\n}\n"]}
|