@t2000/sdk 0.18.10 → 0.18.11
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 +17 -2
- package/dist/adapters/index.cjs +458 -1196
- 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 +458 -1196
- package/dist/adapters/index.js.map +1 -1
- package/dist/{index-Co0lp99l.d.cts → index-YBZIJANR.d.cts} +6 -20
- package/dist/{index-Co0lp99l.d.ts → index-YBZIJANR.d.ts} +6 -20
- package/dist/index.cjs +463 -1202
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +463 -1202
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/utils/format.ts","../src/wallet/send.ts","../src/wallet/balance.ts","../src/wallet/history.ts","../src/protocols/protocolFee.ts","../src/protocols/navi.ts","../src/protocols/yieldTracker.ts","../src/protocols/sentinel.ts","../src/adapters/registry.ts","../src/adapters/navi.ts","../src/protocols/cetus.ts","../src/adapters/cetus.ts","../src/adapters/suilend.ts","../src/utils/hashcash.ts","../src/gas/autoTopUp.ts","../src/gas/gasStation.ts","../src/gas/manager.ts","../src/safeguards/types.ts","../src/safeguards/errors.ts","../src/safeguards/enforcer.ts","../src/contacts.ts","../src/portfolio.ts","../src/strategy.ts","../src/auto-invest.ts","../src/t2000.ts","../src/utils/simulate.ts","../src/adapters/index.ts"],"names":["SuiJsonRpcClient","normalizeSuiAddress","isValidSuiAddress","resolve","homedir","scryptSync","randomBytes","createCipheriv","createDecipheriv","Ed25519Keypair","decodeSuiPrivateKey","access","mkdir","dirname","writeFile","readFile","Transaction","bcs","f","coin","attack","descriptor","AggregatorClient","Env","MIN_HEALTH_FACTOR","CLOCK","SUI_SYSTEM_STATE","normalizeStructTag","createHash","join","readFileSync","existsSync","mkdirSync","writeFileSync","emptyData","randomUUID","EventEmitter","keypair","tx","currentApy","swapAdapter","adapters"],"mappings":"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","file":"index.cjs","sourcesContent":["export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const SWAP_FEE_BPS = 0n; // Free — Cetus already charges pool fees\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n 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 BTC: {\n type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC',\n decimals: 8,\n symbol: 'BTC',\n displayName: 'Bitcoin',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'Ethereum',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 9,\n symbol: 'GOLD',\n displayName: 'Gold',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = Exclude<SupportedAsset, 'SUI' | 'BTC' | 'ETH' | 'GOLD'>;\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC', 'USDT', 'USDe', 'USDsui'] as const;\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\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\nexport const CETUS_GLOBAL_CONFIG = '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f';\nexport const CETUS_PACKAGE = '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb';\n\n// --- Investment ---\n\nexport const INVESTMENT_ASSETS = {\n SUI: SUPPORTED_ASSETS.SUI,\n BTC: SUPPORTED_ASSETS.BTC,\n ETH: SUPPORTED_ASSETS.ETH,\n GOLD: SUPPORTED_ASSETS.GOLD,\n} as const;\n\nexport type InvestmentAsset = keyof typeof INVESTMENT_ASSETS;\n\nexport const DEFAULT_STRATEGIES = {\n bluechip: {\n name: 'Bluechip / Large-Cap',\n allocations: { BTC: 50, ETH: 30, SUI: 20 },\n description: 'Large-cap crypto index',\n custom: false,\n },\n layer1: {\n name: 'Smart Contract Platforms',\n allocations: { ETH: 50, SUI: 50 },\n description: 'Smart contract platforms',\n custom: false,\n },\n 'sui-heavy': {\n name: 'Sui-Weighted Portfolio',\n allocations: { BTC: 20, ETH: 20, SUI: 60 },\n description: 'Sui-weighted portfolio',\n custom: false,\n },\n 'all-weather': {\n name: 'All-Weather Portfolio',\n allocations: { BTC: 30, ETH: 20, SUI: 20, GOLD: 30 },\n description: 'Crypto and commodities',\n custom: false,\n },\n 'safe-haven': {\n name: 'Safe Haven',\n allocations: { BTC: 50, GOLD: 50 },\n description: 'Store-of-value assets',\n custom: false,\n },\n} as const;\n\nexport const PERPS_MARKETS = ['SUI-PERP'] as const;\nexport type PerpsMarket = (typeof PERPS_MARKETS)[number];\n\nexport const DEFAULT_MAX_LEVERAGE = 5;\nexport const DEFAULT_MAX_POSITION_SIZE = 1000;\nexport const INVEST_FEE_BPS = 0n;\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n\nexport const SENTINEL = {\n PACKAGE: '0x88b83f36dafcd5f6dcdcf1d2cb5889b03f61264ab3cee9cae35db7aa940a21b7',\n AGENT_REGISTRY: '0xc47564f5f14c12b31e0dfa1a3dc99a6380a1edf8929c28cb0eaa3359c8db36ac',\n ENCLAVE: '0xfb1261aeb9583514cb1341a548a5ec12d1231bd96af22215f1792617a93e1213',\n PROTOCOL_CONFIG: '0x2fa4fa4a1dd0498612304635ff9334e1b922e78af325000e9d9c0e88adea459f',\n TEE_API: 'https://app.suisentinel.xyz/api/consume-prompt',\n SENTINELS_API: 'https://api.suisentinel.xyz/agents/mainnet',\n RANDOM: '0x8',\n MIN_FEE_MIST: 100_000_000n, // 0.1 SUI\n MAX_PROMPT_TOKENS: 600,\n} as const;\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'SWAP_FAILED'\n | 'SLIPPAGE_EXCEEDED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SENTINEL_API_ERROR'\n | 'SENTINEL_NOT_FOUND'\n | 'SENTINEL_TX_FAILED'\n | 'SENTINEL_TEE_ERROR'\n | 'SAFEGUARD_BLOCKED'\n | 'INSUFFICIENT_INVESTMENT'\n | 'INVESTMENT_LOCKED'\n | 'INVEST_ALREADY_EARNING'\n | 'INVEST_NOT_EARNING'\n | 'BORROW_GUARD_INVESTMENT'\n | 'STRATEGY_NOT_FOUND'\n | 'STRATEGY_INVALID_ALLOCATIONS'\n | 'STRATEGY_HAS_POSITIONS'\n | 'STRATEGY_BUILTIN'\n | 'STRATEGY_MIN_AMOUNT'\n | 'AUTO_INVEST_NOT_FOUND'\n | 'AUTO_INVEST_INSUFFICIENT'\n | 'MARKET_NOT_SUPPORTED'\n | 'LEVERAGE_EXCEEDED'\n | 'POSITION_SIZE_EXCEEDED'\n | 'BLUEFIN_AUTH_FAILED'\n | 'BLUEFIN_API_ERROR'\n | 'POSITION_NOT_FOUND'\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 // Cetus DEX abort codes\n 46001: 'Swap failed — the DEX pool rejected the trade (liquidity or routing issue). Try again.',\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 `Swap slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import { 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 { 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 { Transaction } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\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 interface SendParams {\n client: SuiJsonRpcClient;\n keypair: Ed25519Keypair;\n to: string;\n amount: number;\n asset?: SupportedAsset;\n}\n\nexport interface SendTxResult {\n digest: string;\n gasCost: number;\n}\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\nexport async function buildAndExecuteSend({\n client,\n keypair,\n to,\n amount,\n asset = 'USDC',\n}: SendParams): Promise<SendTxResult> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n if (amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n }\n\n const senderAddress = keypair.getPublicKey().toSuiAddress();\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n\n const tx = new Transaction();\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({\n owner: senderAddress,\n coinType: assetInfo.type,\n });\n\n if (coins.data.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n }\n\n const totalBalance = coins.data.reduce(\n (sum, c) => sum + BigInt(c.balance),\n 0n,\n );\n\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals,\n required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n\n if (coins.data.length > 1) {\n tx.mergeCoins(\n primaryCoin,\n coins.data.slice(1).map((c) => tx.object(c.coinObjectId)),\n );\n }\n\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const gasUsed = result.effects?.gasUsed;\n const gasCost = gasUsed\n ? Math.abs(\n (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n )\n : 0;\n\n return {\n digest: result.digest,\n gasCost,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, INVESTMENT_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { StableAsset, InvestmentAsset } 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 nonSuiInvestmentAssets = (Object.keys(INVESTMENT_ASSETS) as InvestmentAsset[]).filter(a => a !== 'SUI');\n const investBalancePromises = nonSuiInvestmentAssets.map((asset) =>\n client.getBalance({ owner: address, coinType: INVESTMENT_ASSETS[asset].type })\n .then((b) => ({ asset, amount: Number(b.totalBalance) / 10 ** INVESTMENT_ASSETS[asset].decimals }))\n .catch(() => ({ asset, amount: 0 })),\n );\n\n const [suiBalance, suiPriceUsd, ...rest] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ...stableBalancePromises,\n ...investBalancePromises,\n ]);\n\n const stableResults = rest.slice(0, STABLE_ASSETS.length) as Array<{ asset: StableAsset; amount: number }>;\n const investResults = rest.slice(STABLE_ASSETS.length) as Array<{ asset: string; amount: number }>;\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 const assets: Record<string, number> = {\n USDC: stables.USDC ?? 0,\n SUI: suiAmount,\n };\n for (const { asset, amount } of investResults) {\n assets[asset] = amount;\n }\n\n return {\n available: totalStables,\n savings,\n debt: 0,\n investment: 0,\n investmentPnL: 0,\n pendingRewards: 0,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n stables,\n assets,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { TransactionRecord } from '../types.js';\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => {\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 return {\n digest: tx.digest,\n action: inferAction(tx.transaction),\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n });\n}\n\nfunction inferAction(txBlock: unknown): string {\n if (!txBlock || typeof txBlock !== 'object') return 'unknown';\n const data = 'data' in txBlock ? (txBlock as { data?: unknown }).data : undefined;\n if (!data || typeof data !== 'object') return 'unknown';\n const inner = 'transaction' in data ? (data as { transaction?: unknown }).transaction : undefined;\n if (!inner || typeof inner !== 'object') return 'unknown';\n\n const kind = 'kind' in inner ? (inner as { kind: string }).kind : undefined;\n if (kind === 'ProgrammableTransaction') return 'transaction';\n return kind ?? 'unknown';\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n SWAP_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'swap' | 'borrow';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n swap: SWAP_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n swap: 1,\n borrow: 2,\n};\n\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { bcs } from '@mysten/sui/bcs';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS } from '../constants.js';\nimport type { StableAsset, SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw, usdcToRaw } from '../utils/format.js';\nimport { addCollectFeeToTx } from './protocolFee.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n GasMethod,\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst RATE_DECIMALS = 27;\nconst LTV_DECIMALS = 27;\nconst MIN_HEALTH_FACTOR = 1.5;\nfunction withdrawDustBuffer(decimals: number): number {\n return 1000 / 10 ** decimals;\n}\nconst CLOCK = '0x06';\nconst SUI_SYSTEM_STATE = '0x05';\nconst NAVI_BALANCE_DECIMALS = 9;\nconst CONFIG_API = 'https://open-api.naviprotocol.io/api/navi/config?env=prod';\nconst POOLS_API = 'https://open-api.naviprotocol.io/api/navi/pools?env=prod';\n\nconst PACKAGE_API = 'https://open-api.naviprotocol.io/api/package';\nlet packageCache: { id: string; ts: number } | null = null;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface OracleFeed {\n oracleId: number;\n assetId: number;\n feedId: string;\n pythPriceFeedId: string;\n pythPriceInfoObject: string;\n}\n\ninterface NaviConfig {\n package: string;\n storage: string;\n incentiveV2: string;\n incentiveV3: string;\n uiGetter: string;\n oracle: {\n packageId: string;\n priceOracle: string;\n oracleConfig: string;\n supraOracleHolder: string;\n switchboardAggregator: string;\n pythStateId: string;\n wormholeStateId: string;\n feeds: OracleFeed[];\n };\n}\n\n// Oracle package ID comes from config.oracle.packageId (not hardcoded)\n\ninterface NaviIncentiveApy {\n vaultApr: string;\n boostedApr: string;\n apy: string;\n rewardCoin?: string[];\n}\n\ninterface NaviPool {\n id: number;\n coinType: string;\n suiCoinType: string;\n currentSupplyRate: string;\n currentBorrowRate: string;\n currentSupplyIndex: string;\n currentBorrowIndex: string;\n ltv: string;\n liquidationFactor: { bonus: string; ratio: string; threshold: string };\n contract: { reserveId: string; pool: string };\n token: { symbol: string; decimals: number; price: number };\n supplyIncentiveApyInfo?: NaviIncentiveApy;\n borrowIncentiveApyInfo?: NaviIncentiveApy;\n}\n\ninterface UserState {\n assetId: number;\n supplyBalance: bigint;\n borrowBalance: bigint;\n}\n\nfunction toBigInt(v: unknown): bigint {\n if (typeof v === 'bigint') return v;\n return BigInt(String(v));\n}\n\n// ---------------------------------------------------------------------------\n// BCS\n// ---------------------------------------------------------------------------\n\nconst UserStateInfo = bcs.struct('UserStateInfo', {\n asset_id: bcs.u8(),\n borrow_balance: bcs.u256(),\n supply_balance: bcs.u256(),\n});\n\nfunction decodeDevInspect<T>(\n result: { results?: Array<{ returnValues?: Array<[number[], string]> }> | null; error?: string | null },\n schema: { parse: (data: Uint8Array) => T },\n): T | undefined {\n const rv = result.results?.[0]?.returnValues?.[0];\n if (result.error || !rv) return undefined;\n const bytes = Uint8Array.from(rv[0]);\n return schema.parse(bytes);\n}\n\n// ---------------------------------------------------------------------------\n// Config + Pool cache\n// ---------------------------------------------------------------------------\n\nlet configCache: { data: NaviConfig; ts: number } | null = null;\nlet poolsCache: { data: NaviPool[]; ts: number } | null = null;\nconst CACHE_TTL = 5 * 60_000;\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI API error: ${res.status}`);\n const json = (await res.json()) as { data?: T; code?: number };\n return (json.data ?? json) as T;\n}\n\nasync function getLatestPackageId(): Promise<string> {\n if (packageCache && Date.now() - packageCache.ts < CACHE_TTL) return packageCache.id;\n const res = await fetch(PACKAGE_API);\n if (!res.ok) throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI package API error: ${res.status}`);\n const json = (await res.json()) as { packageId?: string };\n if (!json.packageId) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'NAVI package API returned no packageId');\n packageCache = { id: json.packageId, ts: Date.now() };\n return json.packageId;\n}\n\nasync function getConfig(fresh = false): Promise<NaviConfig> {\n if (configCache && !fresh && Date.now() - configCache.ts < CACHE_TTL) return configCache.data;\n const [data, latestPkg] = await Promise.all([\n fetchJson<NaviConfig>(CONFIG_API),\n getLatestPackageId(),\n ]);\n data.package = latestPkg;\n configCache = { data, ts: Date.now() };\n return data;\n}\n\nasync function getPools(fresh = false): Promise<NaviPool[]> {\n if (poolsCache && !fresh && Date.now() - poolsCache.ts < CACHE_TTL) return poolsCache.data;\n const data = await fetchJson<NaviPool[]>(POOLS_API);\n poolsCache = { data, ts: Date.now() };\n return data;\n}\n\nfunction matchesCoinType(poolType: string, targetType: string): boolean {\n const poolSuffix = poolType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n}\n\nfunction resolvePoolSymbol(pool: NaviPool): string {\n const coinType = pool.suiCoinType || pool.coinType || '';\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n if (matchesCoinType(coinType, info.type)) return key;\n }\n return pool.token?.symbol ?? 'UNKNOWN';\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\nasync function getPool(asset: string = 'USDC'): Promise<NaviPool> {\n const pools = await getPools();\n const { type: targetType, displayName } = resolveAssetInfo(asset);\n\n const pool = pools.find(\n (p) => matchesCoinType(p.suiCoinType || p.coinType || '', targetType),\n );\n if (!pool) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `${displayName} pool not found on NAVI`,\n );\n }\n return pool;\n}\n\nasync function getUsdcPool(): Promise<NaviPool> {\n return getPool('USDC');\n}\n\n// ---------------------------------------------------------------------------\n// Oracle price update (required before withdraw/borrow)\n// ---------------------------------------------------------------------------\n\nfunction addOracleUpdate(tx: Transaction, config: NaviConfig, pool: NaviPool): void {\n const feed = config.oracle.feeds?.find((f) => f.assetId === pool.id);\n if (!feed) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Oracle feed not found for asset ${pool.token?.symbol ?? pool.id}`);\n }\n\n tx.moveCall({\n target: `${config.oracle.packageId}::oracle_pro::update_single_price_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.oracleConfig),\n tx.object(config.oracle.priceOracle),\n tx.object(config.oracle.supraOracleHolder),\n tx.object(feed.pythPriceInfoObject),\n tx.object(config.oracle.switchboardAggregator),\n tx.pure.address(feed.feedId),\n ],\n });\n}\n\n/**\n * Updates NAVI oracles for all supported assets that have active positions.\n * Adds on-chain oracle refresh commands to the PTB so NAVI reads fresh\n * price data maintained by keeper bots.\n *\n * For stablecoin-only operations, pass `assetFilter` to limit to stables.\n * For investment assets (SUI/ETH), the full set is refreshed.\n */\nfunction refreshOracles(\n tx: Transaction,\n config: NaviConfig,\n pools: NaviPool[],\n opts?: { assetsToRefresh?: readonly string[] },\n): void {\n const assetsToRefresh = opts?.assetsToRefresh ?? NAVI_SUPPORTED_ASSETS;\n const targetTypes = assetsToRefresh.map((a) => SUPPORTED_ASSETS[a as keyof typeof SUPPORTED_ASSETS].type);\n\n const matchedPools = pools.filter((p) => {\n const ct = p.suiCoinType || p.coinType || '';\n return targetTypes.some((t) => matchesCoinType(ct, t));\n });\n\n for (const pool of matchedPools) {\n addOracleUpdate(tx, config, pool);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractGasCost(effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null): number {\n if (!effects?.gasUsed) return 0;\n return Math.abs(\n (Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)) / 1e9,\n );\n}\n\nfunction rateToApy(rawRate: string): number {\n if (!rawRate || rawRate === '0') return 0;\n return Number(BigInt(rawRate)) / 10 ** RATE_DECIMALS * 100;\n}\n\nfunction poolSaveApy(pool: NaviPool): number {\n const incentive = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0');\n if (incentive > 0) return incentive;\n return rateToApy(pool.currentSupplyRate);\n}\n\nfunction poolBorrowApy(pool: NaviPool): number {\n const incentive = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0');\n if (incentive > 0) return incentive;\n return rateToApy(pool.currentBorrowRate);\n}\n\nfunction parseLtv(rawLtv: string): number {\n if (!rawLtv || rawLtv === '0') return 0.75;\n return Number(BigInt(rawLtv)) / 10 ** LTV_DECIMALS;\n}\n\nfunction parseLiqThreshold(val: string | number): number {\n if (typeof val === 'number') return val;\n const n = Number(val);\n if (n > 1) return Number(BigInt(val)) / 10 ** LTV_DECIMALS;\n return n;\n}\n\nfunction normalizeHealthFactor(raw: number): number {\n const v = raw / 10 ** RATE_DECIMALS;\n return v > 1e5 ? Infinity : v;\n}\n\nfunction naviStorageDecimals(poolId: number, tokenDecimals: number): number {\n // Original NAVI pools (id 0-10) normalize all balances to 9 decimals.\n // Newer pools (id >= 11, e.g. suiETH, suiUSDT) use native token decimals.\n if (poolId <= 10) return NAVI_BALANCE_DECIMALS;\n return tokenDecimals;\n}\n\nfunction compoundBalance(rawBalance: bigint, currentIndex: string, pool?: NaviPool): number {\n if (!rawBalance || !currentIndex || currentIndex === '0') return 0;\n const scale = BigInt('1' + '0'.repeat(RATE_DECIMALS));\n const half = scale / 2n;\n const result = (rawBalance * BigInt(currentIndex) + half) / scale;\n const decimals = pool ? naviStorageDecimals(pool.id, pool.token.decimals) : NAVI_BALANCE_DECIMALS;\n return Number(result) / 10 ** decimals;\n}\n\n// ---------------------------------------------------------------------------\n// On-chain reads\n// ---------------------------------------------------------------------------\n\nasync function getUserState(client: SuiJsonRpcClient, address: string): Promise<UserState[]> {\n const config = await getConfig();\n const tx = new Transaction();\n tx.moveCall({\n target: `${config.uiGetter}::getter_unchecked::get_user_state`,\n arguments: [tx.object(config.storage), tx.pure.address(address)],\n });\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address,\n });\n\n const decoded = decodeDevInspect(result, bcs.vector(UserStateInfo));\n if (!decoded) return [];\n\n const mapped = (decoded as Array<{ asset_id: number; supply_balance: unknown; borrow_balance: unknown }>)\n .map((s) => ({\n assetId: s.asset_id,\n supplyBalance: toBigInt(s.supply_balance),\n borrowBalance: toBigInt(s.borrow_balance),\n }));\n\n return mapped.filter((s) => s.supplyBalance !== 0n || s.borrowBalance !== 0n);\n}\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; 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 const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n const [config, pool] = await Promise.all([getConfig(), getPool(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 tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coinObj, 'save');\n }\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coinObj,\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n return tx;\n}\n\nexport async function save(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<SaveResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildSaveTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const rates = await getRates(client);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n apy: rates.USDC.saveApy,\n fee: 0,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n savingsBalance: amount,\n };\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const [config, pool, pools, states] = await Promise.all([\n getConfig(),\n getPool(asset),\n getPools(),\n getUserState(client, address),\n ]);\n\n const assetState = states.find((s) => s.assetId === pool.id);\n const deposited = assetState ? compoundBalance(assetState.supplyBalance, pool.currentSupplyIndex, pool) : 0;\n\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - withdrawDustBuffer(assetInfo.decimals)));\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 refreshOracles(tx, config, pools);\n\n const [balance] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object(SUI_SYSTEM_STATE),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n const [coin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [balance],\n typeArguments: [pool.suiCoinType],\n });\n\n tx.transferObjects([coin], address);\n\n return { tx, effectiveAmount };\n}\n\n/**\n * Composable variant: adds withdraw commands to an existing PTB and\n * returns the coin object for chaining (no transferObjects).\n */\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const [config, pool, pools, states] = await Promise.all([\n getConfig(),\n getPool(asset),\n getPools(),\n getUserState(client, address),\n ]);\n\n const assetState = states.find((s) => s.assetId === pool.id);\n const deposited = assetState ? compoundBalance(assetState.supplyBalance, pool.currentSupplyIndex, pool) : 0;\n\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - withdrawDustBuffer(assetInfo.decimals)));\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 // Dust position — create a zero-value coin instead of calling on-chain withdraw\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [pool.suiCoinType],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n refreshOracles(tx, config, pools);\n\n const [balance] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object(SUI_SYSTEM_STATE),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n const [coin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [balance],\n typeArguments: [pool.suiCoinType],\n });\n\n return { coin, effectiveAmount };\n}\n\n/**\n * Composable variant: adds deposit commands to an existing PTB\n * using a coin object from a prior step (withdraw/swap).\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 [config, pool] = await Promise.all([getConfig(), getPool(asset)]);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n const [coinValue] = tx.moveCall({\n target: '0x2::coin::value',\n typeArguments: [pool.suiCoinType],\n arguments: [coin],\n });\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coin,\n coinValue,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n}\n\n/**\n * Composable variant: adds repay commands to an existing PTB\n * using a coin object from a prior step (swap).\n */\nexport async function addRepayToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const [config, pool] = await Promise.all([getConfig(), getPool(asset)]);\n\n addOracleUpdate(tx, config, pool);\n\n const [coinValue] = tx.moveCall({\n target: '0x2::coin::value',\n typeArguments: [pool.suiCoinType],\n arguments: [coin],\n });\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coin,\n coinValue,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n}\n\nexport async function withdraw(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<WithdrawResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const { tx, effectiveAmount } = await buildWithdrawTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n success: true,\n tx: result.digest,\n amount: effectiveAmount,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\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 const [config, pool, pools] = await Promise.all([\n getConfig(), getPool(asset), getPools(),\n ]);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n refreshOracles(tx, config, pools);\n\n const [balance] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_v2`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object(SUI_SYSTEM_STATE),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n const [borrowedCoin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [balance],\n typeArguments: [pool.suiCoinType],\n });\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin], address);\n\n return tx;\n}\n\nexport async function borrow(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<BorrowResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildBorrowTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const hfResult = await getHealthFactor(client, address);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n fee: 0,\n healthFactor: hfResult.healthFactor,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\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 const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n const [config, pool] = await Promise.all([getConfig(), getPool(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`);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n addOracleUpdate(tx, config, pool);\n\n const coinObj = mergeCoins(tx, coins);\n\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.oracle.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n coinObj,\n tx.pure.u64(rawAmount),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n ],\n typeArguments: [pool.suiCoinType],\n });\n\n return tx;\n}\n\nexport async function repay(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<RepayResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildRepayTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const states = await getUserState(client, address);\n const pools = await getPools();\n let remainingDebt = 0;\n for (const state of states) {\n const pool = pools.find((p) => p.id === state.assetId);\n if (!pool) continue;\n remainingDebt += compoundBalance(state.borrowBalance, pool.currentBorrowIndex, pool);\n }\n\n return {\n success: true,\n tx: result.digest,\n amount,\n remainingDebt,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<HealthFactorResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\n\n const [config, pools, states] = await Promise.all([\n getConfig(),\n getPools(),\n getUserState(client, address),\n ]);\n\n let supplied = 0;\n let borrowed = 0;\n let weightedLtv = 0;\n let weightedLiqThreshold = 0;\n\n for (const state of states) {\n const pool = pools.find((p) => p.id === state.assetId);\n if (!pool) continue;\n\n const supplyBal = compoundBalance(state.supplyBalance, pool.currentSupplyIndex, pool);\n const borrowBal = compoundBalance(state.borrowBalance, pool.currentBorrowIndex, pool);\n const price = pool.token?.price ?? 1;\n\n supplied += supplyBal * price;\n borrowed += borrowBal * price;\n\n if (supplyBal > 0) {\n weightedLtv += supplyBal * price * parseLtv(pool.ltv);\n weightedLiqThreshold += supplyBal * price * parseLiqThreshold(pool.liquidationFactor.threshold);\n }\n }\n\n const ltv = supplied > 0 ? weightedLtv / supplied : 0.75;\n const liqThreshold = supplied > 0 ? weightedLiqThreshold / supplied : 0.75;\n const maxBorrowVal = Math.max(0, supplied * ltv - borrowed);\n\n const usdcPool = pools.find((p) => matchesCoinType(p.suiCoinType || p.coinType || '', SUPPORTED_ASSETS.USDC.type));\n\n let healthFactor: number;\n if (borrowed <= 0) {\n healthFactor = Infinity;\n } else if (usdcPool) {\n try {\n const tx = new Transaction();\n tx.moveCall({\n target: `${config.uiGetter}::calculator_unchecked::dynamic_health_factor`,\n arguments: [\n tx.object(CLOCK),\n tx.object(config.storage),\n tx.object(config.oracle.priceOracle),\n tx.pure.u8(usdcPool.id),\n tx.pure.address(address),\n tx.pure.u8(usdcPool.id),\n tx.pure.u64(0),\n tx.pure.u64(0),\n tx.pure.bool(false),\n ],\n typeArguments: [usdcPool.suiCoinType],\n });\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address,\n });\n\n const decoded = decodeDevInspect(result, bcs.u256());\n if (decoded !== undefined) {\n healthFactor = normalizeHealthFactor(Number(decoded));\n } else {\n healthFactor = (supplied * liqThreshold) / borrowed;\n }\n } catch {\n healthFactor = (supplied * liqThreshold) / borrowed;\n }\n } else {\n healthFactor = (supplied * liqThreshold) / borrowed;\n }\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow: maxBorrowVal,\n liquidationThreshold: liqThreshold,\n };\n}\n\nconst NAVI_SUPPORTED_ASSETS = [...STABLE_ASSETS, 'SUI', 'ETH', 'GOLD'] as const;\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await getPools();\n const result: RatesResult = {};\n\n for (const asset of NAVI_SUPPORTED_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p) => matchesCoinType(p.suiCoinType || p.coinType || '', targetType));\n if (!pool) continue;\n\n let saveApy = poolSaveApy(pool);\n let borrowApy = poolBorrowApy(pool);\n\n if (saveApy <= 0 || saveApy > 200) saveApy = 0;\n if (borrowApy <= 0 || borrowApy > 200) borrowApy = 0;\n\n result[asset] = { saveApy, borrowApy };\n }\n\n if (!result.USDC) result.USDC = { saveApy: 4.0, borrowApy: 6.0 };\n return result;\n } catch {\n return { USDC: { saveApy: 4.0, borrowApy: 6.0 } };\n }\n}\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<PositionsResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\n\n const [states, cachedPools] = await Promise.all([getUserState(client, address), getPools()]);\n\n let pools = cachedPools;\n const unmatchedIds = states.filter(s => !pools.find(p => p.id === s.assetId)).map(s => s.assetId);\n if (unmatchedIds.length > 0) {\n pools = await getPools(true);\n }\n\n const positions: PositionEntry[] = [];\n\n for (const state of states) {\n const pool = pools.find((p) => p.id === state.assetId);\n if (!pool) {\n console.warn(`[NAVI] No pool found for assetId=${state.assetId} (supply=${state.supplyBalance}, borrow=${state.borrowBalance}) — funds may be invisible`);\n continue;\n }\n\n const symbol = resolvePoolSymbol(pool);\n const supplyBal = compoundBalance(state.supplyBalance, pool.currentSupplyIndex, pool);\n const borrowBal = compoundBalance(state.borrowBalance, pool.currentBorrowIndex, pool);\n\n if (supplyBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'save',\n amount: supplyBal,\n apy: poolSaveApy(pool),\n });\n }\n\n if (borrowBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'borrow',\n amount: borrowBal,\n apy: poolBorrowApy(pool),\n });\n }\n }\n\n return { positions };\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Claim Rewards\n// ---------------------------------------------------------------------------\n\nconst CERT_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\nconst DEEP_TYPE = '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP';\n\nconst REWARD_FUNDS: Record<string, string> = {\n [CERT_TYPE]: '0x7093cf7549d5e5b35bfde2177223d1050f71655c7f676a5e610ee70eb4d93b5c',\n [DEEP_TYPE]: '0xc889d78b634f954979e80e622a2ae0fece824c0f6d9590044378a2563035f32f',\n};\n\nconst REWARD_SYMBOLS: Record<string, string> = {\n [CERT_TYPE]: 'vSUI',\n [DEEP_TYPE]: 'DEEP',\n};\n\nconst REWARD_DECIMALS: Record<string, number> = {\n [CERT_TYPE]: 9,\n [DEEP_TYPE]: 6,\n};\n\ninterface IncentiveRuleData {\n ruleIds: string[];\n rewardCoinType: string | null;\n}\n\nlet incentiveRulesCache: { data: Map<string, IncentiveRuleData>; ts: number } | null = null;\n\nasync function getIncentiveRules(client: SuiJsonRpcClient): Promise<Map<string, IncentiveRuleData>> {\n if (incentiveRulesCache && Date.now() - incentiveRulesCache.ts < CACHE_TTL) {\n return incentiveRulesCache.data;\n }\n\n const [pools, obj] = await Promise.all([\n getPools(),\n client.getObject({\n id: '0x62982dad27fb10bb314b3384d5de8d2ac2d72ab2dbeae5d801dbdb9efa816c80',\n options: { showContent: true },\n }),\n ]);\n\n const rewardCoinMap = new Map<string, string>();\n for (const pool of pools) {\n const ct = (pool.suiCoinType || pool.coinType || '').toLowerCase();\n const suffix = ct.split('::').slice(1).join('::');\n const coins = pool.supplyIncentiveApyInfo?.rewardCoin;\n if (Array.isArray(coins) && coins.length > 0) {\n rewardCoinMap.set(suffix, coins[0]);\n }\n }\n\n const result = new Map<string, IncentiveRuleData>();\n\n if (obj.data?.content?.dataType !== 'moveObject') {\n incentiveRulesCache = { data: result, ts: Date.now() };\n return result;\n }\n\n const fields = obj.data.content.fields as Record<string, unknown>;\n const poolsObj = fields.pools as { fields?: { contents?: unknown[] } } | undefined;\n const entries = poolsObj?.fields?.contents;\n if (!Array.isArray(entries)) {\n incentiveRulesCache = { data: result, ts: Date.now() };\n return result;\n }\n\n for (const entry of entries) {\n const ef = (entry as { fields?: Record<string, unknown> })?.fields;\n if (!ef) continue;\n const key = String(ef.key ?? '');\n const value = ef.value as { fields?: Record<string, unknown> } | undefined;\n const rules = value?.fields?.rules as { fields?: { contents?: unknown[] } } | undefined;\n const ruleEntries = rules?.fields?.contents;\n if (!Array.isArray(ruleEntries)) continue;\n\n const ruleIds = ruleEntries.map((re) => {\n const rf = (re as { fields?: Record<string, unknown> })?.fields;\n return String(rf?.key ?? '');\n }).filter(Boolean);\n\n const suffix = key.split('::').slice(1).join('::').toLowerCase();\n const full = key.toLowerCase();\n const rewardCoin = rewardCoinMap.get(suffix) ?? rewardCoinMap.get(full) ?? null;\n\n result.set(key, { ruleIds, rewardCoinType: rewardCoin });\n }\n\n incentiveRulesCache = { data: result, ts: Date.now() };\n return result;\n}\n\nfunction stripPrefix(coinType: string): string {\n return coinType.replace(/^0x0*/, '');\n}\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n const [pools, states] = await Promise.all([\n getPools(),\n getUserState(client, address),\n ]);\n\n const rewards: PendingReward[] = [];\n const deposited = states.filter((s) => s.supplyBalance > 0n);\n if (deposited.length === 0) return rewards;\n\n for (const state of deposited) {\n const pool = pools.find((p) => p.id === state.assetId);\n if (!pool) continue;\n\n const boostedApr = parseFloat(pool.supplyIncentiveApyInfo?.boostedApr ?? '0');\n if (boostedApr <= 0) continue;\n\n const rewardCoins = pool.supplyIncentiveApyInfo?.rewardCoin;\n if (!Array.isArray(rewardCoins) || rewardCoins.length === 0) continue;\n\n const rewardType = rewardCoins[0];\n const assetSymbol = resolvePoolSymbol(pool);\n\n rewards.push({\n protocol: 'navi',\n asset: assetSymbol,\n coinType: rewardType,\n symbol: REWARD_SYMBOLS[rewardType] ?? rewardType.split('::').pop() ?? 'UNKNOWN',\n amount: 0,\n estimatedValueUsd: 0,\n });\n }\n\n return rewards;\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n const [config, pools, states, rules] = await Promise.all([\n getConfig(),\n getPools(),\n getUserState(client, address),\n getIncentiveRules(client),\n ]);\n\n const deposited = states.filter((s) => s.supplyBalance > 0n);\n if (deposited.length === 0) return [];\n\n const claimGroups = new Map<string, { assets: string[]; ruleIds: string[] }>();\n\n for (const state of deposited) {\n const pool = pools.find((p) => p.id === state.assetId);\n if (!pool) continue;\n\n const boostedApr = parseFloat(pool.supplyIncentiveApyInfo?.boostedApr ?? '0');\n if (boostedApr <= 0) continue;\n\n const rewardCoins = pool.supplyIncentiveApyInfo?.rewardCoin;\n if (!Array.isArray(rewardCoins) || rewardCoins.length === 0) continue;\n\n const rewardType = rewardCoins[0];\n const fundId = REWARD_FUNDS[rewardType];\n if (!fundId) continue;\n\n const coinType = pool.suiCoinType || pool.coinType || '';\n const strippedType = stripPrefix(coinType);\n\n const ruleData = Array.from(rules.entries()).find(([key]) =>\n stripPrefix(key) === strippedType ||\n key.split('::').slice(1).join('::').toLowerCase() ===\n coinType.split('::').slice(1).join('::').toLowerCase()\n );\n\n if (!ruleData || ruleData[1].ruleIds.length === 0) continue;\n\n const group = claimGroups.get(rewardType) ?? { assets: [], ruleIds: [] };\n for (const ruleId of ruleData[1].ruleIds) {\n group.assets.push(strippedType);\n group.ruleIds.push(ruleId);\n }\n claimGroups.set(rewardType, group);\n }\n\n const claimed: PendingReward[] = [];\n\n for (const [rewardType, { assets, ruleIds }] of claimGroups) {\n const fundId = REWARD_FUNDS[rewardType]!;\n\n const [balance] = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward`,\n typeArguments: [rewardType],\n arguments: [\n tx.object(CLOCK),\n tx.object(config.incentiveV3),\n tx.object(config.storage),\n tx.object(fundId),\n tx.pure(bcs.vector(bcs.string()).serialize(assets)),\n tx.pure(bcs.vector(bcs.Address).serialize(ruleIds)),\n ],\n });\n\n const [coin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n typeArguments: [rewardType],\n arguments: [balance],\n });\n\n tx.transferObjects([coin], address);\n\n claimed.push({\n protocol: 'navi',\n asset: assets.join(', '),\n coinType: rewardType,\n symbol: REWARD_SYMBOLS[rewardType] ?? 'UNKNOWN',\n amount: 0,\n estimatedValueUsd: 0,\n });\n }\n\n return claimed;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, keypair);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy / 100;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n // Estimate total yield earned based on position age\n // For MVP, use a simple approximation\n const totalYieldEarned = dailyEarning * 30; // rough monthly estimate\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 keypair: Ed25519Keypair,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, keypair);\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 { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { bcs } from '@mysten/sui/bcs';\nimport { SENTINEL, CLOCK_ID, MIST_PER_SUI } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { SentinelAgent, SentinelVerdict, SentinelAttackResult } from '../types.js';\nimport type { ProtocolDescriptor } from '../adapters/types.js';\n\nexport const descriptor: ProtocolDescriptor = {\n id: 'sentinel',\n name: 'Sui Sentinel',\n packages: [SENTINEL.PACKAGE],\n actionMap: {\n 'sentinel::request_attack': 'sentinel_attack',\n 'sentinel::consume_prompt': 'sentinel_settle',\n },\n};\n\ninterface RawSentinelAgent {\n agent_id: string;\n agent_object_id: string;\n agent_name: string;\n cost_per_message: string;\n total_balance: string;\n total_attacks: number;\n successful_breaches?: number;\n state: string;\n prompt: string;\n model?: string;\n}\n\nfunction mapAgent(raw: RawSentinelAgent): SentinelAgent {\n return {\n id: raw.agent_id,\n objectId: raw.agent_object_id,\n name: raw.agent_name,\n model: raw.model ?? 'unknown',\n systemPrompt: raw.prompt,\n attackFee: BigInt(raw.cost_per_message),\n prizePool: BigInt(raw.total_balance),\n totalAttacks: raw.total_attacks,\n successfulBreaches: raw.successful_breaches ?? 0,\n state: raw.state,\n };\n}\n\nexport async function listSentinels(): Promise<SentinelAgent[]> {\n const res = await fetch(SENTINEL.SENTINELS_API);\n if (!res.ok) {\n throw new T2000Error('SENTINEL_API_ERROR', `Sentinel API returned ${res.status}`);\n }\n\n const data = (await res.json()) as { agents: RawSentinelAgent[] };\n if (!Array.isArray(data.agents)) {\n throw new T2000Error('SENTINEL_API_ERROR', 'Unexpected API response shape');\n }\n\n return data.agents\n .filter((a) => a.state === 'active')\n .map(mapAgent);\n}\n\nexport async function getSentinelInfo(\n client: SuiJsonRpcClient,\n sentinelObjectId: string,\n): Promise<SentinelAgent> {\n const agents = await listSentinels();\n const match = agents.find((a) => a.objectId === sentinelObjectId || a.id === sentinelObjectId);\n\n if (match) return match;\n\n const obj = await client.getObject({\n id: sentinelObjectId,\n options: { showContent: true, showType: true },\n });\n\n if (!obj.data) {\n throw new T2000Error('SENTINEL_NOT_FOUND', `Sentinel ${sentinelObjectId} not found on-chain`);\n }\n\n const content = obj.data.content;\n if (!content || content.dataType !== 'moveObject') {\n throw new T2000Error('SENTINEL_NOT_FOUND', `Object ${sentinelObjectId} is not a Move object`);\n }\n\n const fields = content.fields as Record<string, unknown>;\n\n return {\n id: (fields.id as { id: string })?.id ?? sentinelObjectId,\n objectId: sentinelObjectId,\n name: (fields.name as string) ?? 'Unknown',\n model: (fields.model as string) ?? 'unknown',\n systemPrompt: (fields.system_prompt as string) ?? '',\n attackFee: BigInt((fields.cost_per_message as string) ?? '0'),\n prizePool: BigInt((fields.balance as string) ?? '0'),\n totalAttacks: Number((fields.total_attacks as string) ?? '0'),\n successfulBreaches: Number((fields.successful_breaches as string) ?? '0'),\n state: (fields.state as string) ?? 'unknown',\n };\n}\n\nexport async function requestAttack(\n client: SuiJsonRpcClient,\n signer: Ed25519Keypair,\n sentinelObjectId: string,\n feeMist: bigint,\n): Promise<{ attackObjectId: string; digest: string }> {\n if (feeMist < SENTINEL.MIN_FEE_MIST) {\n throw new T2000Error('INVALID_AMOUNT', `Attack fee must be at least 0.1 SUI (${SENTINEL.MIN_FEE_MIST} MIST)`);\n }\n\n const tx = new Transaction();\n const [coin] = tx.splitCoins(tx.gas, [Number(feeMist)]);\n\n const [attack] = tx.moveCall({\n target: `${SENTINEL.PACKAGE}::sentinel::request_attack`,\n arguments: [\n tx.object(SENTINEL.AGENT_REGISTRY),\n tx.object(sentinelObjectId),\n tx.object(SENTINEL.PROTOCOL_CONFIG),\n coin,\n tx.object(SENTINEL.RANDOM),\n tx.object(CLOCK_ID),\n ],\n });\n\n const address = signer.toSuiAddress();\n tx.transferObjects([attack], address);\n\n const result = await client.signAndExecuteTransaction({\n signer,\n transaction: tx,\n options: { showObjectChanges: true, showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const attackObj = result.objectChanges?.find(\n (c) => c.type === 'created' && c.objectType?.includes('::sentinel::Attack'),\n );\n\n const attackObjectId = attackObj && 'objectId' in attackObj ? attackObj.objectId : undefined;\n\n if (!attackObjectId) {\n throw new T2000Error('SENTINEL_TX_FAILED', 'Attack object was not created — transaction may have failed');\n }\n\n return { attackObjectId, digest: result.digest };\n}\n\nexport async function submitPrompt(\n agentId: string,\n attackObjectId: string,\n prompt: string,\n): Promise<SentinelVerdict> {\n const res = await fetch(SENTINEL.TEE_API, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agent_id: agentId,\n attack_object_id: attackObjectId,\n message: prompt,\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n throw new T2000Error('SENTINEL_TEE_ERROR', `TEE returned ${res.status}: ${body.slice(0, 200)}`);\n }\n\n const raw = await res.json() as Record<string, unknown>;\n\n // TEE wraps: { response: { intent, timestamp_ms, data: { ... } }, signature }\n const envelope = (raw.response ?? raw) as Record<string, unknown>;\n const data = (envelope.data ?? envelope) as Record<string, unknown>;\n const signature = (raw.signature ?? data.signature) as string;\n const timestampMs = (envelope.timestamp_ms ?? data.timestamp_ms) as number;\n\n if (typeof signature !== 'string') {\n throw new T2000Error('SENTINEL_TEE_ERROR', 'TEE response missing signature');\n }\n\n return {\n success: (data.success ?? data.is_success) as boolean,\n score: data.score as number,\n agentResponse: data.agent_response as string,\n juryResponse: data.jury_response as string,\n funResponse: (data.fun_response as string) ?? '',\n signature,\n timestampMs,\n };\n}\n\nexport async function settleAttack(\n client: SuiJsonRpcClient,\n signer: Ed25519Keypair,\n sentinelObjectId: string,\n attackObjectId: string,\n prompt: string,\n verdict: SentinelVerdict,\n): Promise<{ digest: string; success: boolean }> {\n const sigBytes = Array.from(Buffer.from(verdict.signature.replace(/^0x/, ''), 'hex'));\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${SENTINEL.PACKAGE}::sentinel::consume_prompt`,\n arguments: [\n tx.object(SENTINEL.AGENT_REGISTRY),\n tx.object(SENTINEL.PROTOCOL_CONFIG),\n tx.object(sentinelObjectId),\n tx.pure.bool(verdict.success),\n tx.pure.string(verdict.agentResponse),\n tx.pure.string(verdict.juryResponse),\n tx.pure.string(verdict.funResponse),\n tx.pure.string(prompt),\n tx.pure.u8(verdict.score),\n tx.pure.u64(verdict.timestampMs),\n tx.pure(bcs.vector(bcs.u8()).serialize(sigBytes)),\n tx.object(SENTINEL.ENCLAVE),\n tx.object(attackObjectId),\n tx.object(CLOCK_ID),\n ],\n });\n\n const result = await client.signAndExecuteTransaction({\n signer,\n transaction: tx,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const txSuccess = result.effects?.status?.status === 'success';\n\n return { digest: result.digest, success: txSuccess };\n}\n\nexport async function attack(\n client: SuiJsonRpcClient,\n signer: Ed25519Keypair,\n sentinelId: string,\n prompt: string,\n feeMist?: bigint,\n): Promise<SentinelAttackResult> {\n const sentinel = await getSentinelInfo(client, sentinelId);\n const fee = feeMist ?? sentinel.attackFee;\n\n if (fee < SENTINEL.MIN_FEE_MIST) {\n throw new T2000Error('INVALID_AMOUNT', `Attack fee must be at least 0.1 SUI`);\n }\n\n const { attackObjectId, digest: requestTx } = await requestAttack(\n client,\n signer,\n sentinel.objectId,\n fee,\n );\n\n const verdict = await submitPrompt(sentinel.id, attackObjectId, prompt);\n\n const { digest: settleTx } = await settleAttack(\n client,\n signer,\n sentinel.objectId,\n attackObjectId,\n prompt,\n verdict,\n );\n\n const won = verdict.success && verdict.score >= 70;\n\n return {\n attackObjectId,\n sentinelId: sentinel.id,\n prompt,\n verdict,\n requestTx,\n settleTx,\n won,\n feePaid: Number(fee) / Number(MIST_PER_SUI),\n };\n}\n","import type {\n LendingAdapter,\n SwapAdapter,\n LendingRates,\n SwapQuote,\n AdapterPositions,\n AdapterCapability,\n} from './types.js';\nimport { STABLE_ASSETS, INVESTMENT_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n private swap: Map<string, SwapAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n registerSwap(adapter: SwapAdapter): void {\n this.swap.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new 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 bestSwapQuote(from: string, to: string, amount: number): Promise<{ adapter: SwapAdapter; quote: SwapQuote }> {\n const candidates: Array<{ adapter: SwapAdapter; quote: SwapQuote }> = [];\n\n for (const adapter of this.swap.values()) {\n const pairs = adapter.getSupportedPairs();\n if (!pairs.some(p => p.from === from && p.to === to)) continue;\n try {\n const quote = await adapter.getQuote(from, to, amount);\n candidates.push({ adapter, quote });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No swap adapter supports ${from} → ${to}`);\n }\n\n candidates.sort((a, b) => b.quote.expectedOutput - a.quote.expectedOutput);\n return candidates[0];\n }\n\n async 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 allAssets = [...STABLE_ASSETS, ...Object.keys(INVESTMENT_ASSETS)];\n const seen = new Set<string>();\n for (const asset of allAssets) {\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 getSwap(id: string): SwapAdapter | undefined {\n return this.swap.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n\n listSwap(): SwapAdapter[] {\n return [...this.swap.values()];\n }\n\n}\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 ProtocolDescriptor,\n PendingReward,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport const descriptor: 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 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[] = [...STABLE_ASSETS, 'SUI', 'ETH', 'GOLD'];\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, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const 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 ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const 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 ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, { asset: normalized });\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 { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk';\nimport { SUPPORTED_ASSETS, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { GasMethod } from '../types.js';\n\nconst DEFAULT_SLIPPAGE_BPS = 300; // 3%\n\nexport interface SwapParams {\n client: SuiJsonRpcClient;\n keypair: Ed25519Keypair;\n fromAsset: string;\n toAsset: string;\n amount: number;\n maxSlippageBps?: number;\n}\n\nexport interface SwapTxResult {\n digest: string;\n fromAmount: number;\n fromAsset: string;\n toAmount: number;\n toAsset: string;\n priceImpact: number;\n gasCost: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nexport interface SwapBuildResult {\n tx: Transaction;\n estimatedOut: number;\n toDecimals: number;\n}\n\nfunction createAggregatorClient(client: SuiJsonRpcClient, signer?: string): AggregatorClient {\n // Cetus SDK bundles @mysten/sui v1 internally — the runtime API is\n // identical to SuiJsonRpcClient, so the cast is safe.\n return new AggregatorClient({\n client: client as never,\n signer,\n env: Env.Mainnet,\n });\n}\n\nexport async function buildSwapTx(params: {\n client: SuiJsonRpcClient;\n address: string;\n fromAsset: string;\n toAsset: string;\n amount: number;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const fromInfo = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS];\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n if (!fromInfo || !toInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const aggClient = createAggregatorClient(client, address);\n\n const _origLog = console.log;\n console.log = () => {};\n let result;\n try {\n result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n } finally {\n console.log = _origLog;\n }\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `No swap route found for ${fromAsset} → ${toAsset}`,\n );\n }\n\n const tx = new Transaction();\n const slippage = maxSlippageBps / 10000;\n\n console.log = () => {};\n try {\n await aggClient.fastRouterSwap({\n router: result,\n txb: tx as never,\n slippage,\n });\n } finally {\n console.log = _origLog;\n }\n\n const estimatedOut = Number(result.amountOut.toString());\n\n return {\n tx,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\n/**\n * Composable variant: adds swap commands to an existing PTB using\n * routerSwap (accepts inputCoin, returns targetCoin).\n */\nexport async function addSwapToTx(params: {\n tx: Transaction;\n client: SuiJsonRpcClient;\n address: string;\n inputCoin: TransactionObjectArgument;\n fromAsset: string;\n toAsset: string;\n amount: number;\n maxSlippageBps?: number;\n}): Promise<{ outputCoin: TransactionObjectArgument; estimatedOut: number; toDecimals: number }> {\n const { tx, client, address, inputCoin, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const fromInfo = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS];\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n if (!fromInfo || !toInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const aggClient = createAggregatorClient(client, address);\n\n const _origLog = console.log;\n console.log = () => {};\n let result;\n try {\n result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n } finally {\n console.log = _origLog;\n }\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `No swap route found for ${fromAsset} → ${toAsset}`,\n );\n }\n\n const slippage = maxSlippageBps / 10000;\n\n console.log = () => {};\n let outputCoin;\n try {\n outputCoin = await aggClient.routerSwap({\n router: result,\n txb: tx as never,\n inputCoin: inputCoin as never,\n slippage,\n });\n } finally {\n console.log = _origLog;\n }\n\n const estimatedOut = Number(result.amountOut.toString());\n\n return {\n outputCoin: outputCoin as unknown as TransactionObjectArgument,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\nexport async function executeSwap(params: SwapParams): Promise<SwapTxResult> {\n const { client, keypair, fromAsset, toAsset, amount, maxSlippageBps } = params;\n const address = keypair.getPublicKey().toSuiAddress();\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n const { tx, estimatedOut, toDecimals } = await buildSwapTx({\n client,\n address,\n fromAsset,\n toAsset,\n amount,\n maxSlippageBps,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let actualReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = estimatedOut / 10 ** toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n return {\n digest: result.digest,\n fromAmount: amount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n gasCost: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\n/**\n * Build a swap TX from an arbitrary coin type to USDC (or another\n * SUPPORTED_ASSET). Used for converting reward tokens after claiming.\n */\nexport async function buildRawSwapTx(params: {\n client: SuiJsonRpcClient;\n address: string;\n fromCoinType: string;\n fromDecimals: number;\n toCoinType: string;\n toDecimals: number;\n amount: bigint;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromCoinType, toCoinType, amount, toDecimals, maxSlippageBps = 500 } = params;\n\n const aggClient = createAggregatorClient(client, address);\n\n const _origLog = console.log;\n console.log = () => {};\n let result;\n try {\n result = await aggClient.findRouters({\n from: fromCoinType,\n target: toCoinType,\n amount,\n byAmountIn: true,\n });\n } finally {\n console.log = _origLog;\n }\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No swap route for reward token → USDC`);\n }\n\n const tx = new Transaction();\n const slippage = maxSlippageBps / 10000;\n\n console.log = () => {};\n try {\n await aggClient.fastRouterSwap({\n router: result,\n txb: tx as never,\n slippage,\n });\n } finally {\n console.log = _origLog;\n }\n\n return {\n tx,\n estimatedOut: Number(result.amountOut.toString()),\n toDecimals,\n };\n}\n\nexport async function getPoolPrice(client: SuiJsonRpcClient): Promise<number> {\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const currentSqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n\n if (currentSqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtPriceFloat = Number(currentSqrtPrice) / Number(Q64);\n const rawPrice = sqrtPriceFloat * sqrtPriceFloat;\n const suiPriceUsd = 1e3 / rawPrice;\n if (suiPriceUsd > 0.01 && suiPriceUsd < 1000) return suiPriceUsd;\n }\n }\n } catch {\n // Fallback\n }\n\n return 3.5;\n}\n\nexport async function getSwapQuote(\n client: SuiJsonRpcClient,\n fromAsset: string,\n toAsset: string,\n amount: number,\n): Promise<{ expectedOutput: number; priceImpact: number; poolPrice: number }> {\n const fromInfo = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS];\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n if (!fromInfo || !toInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const poolPrice = await getPoolPrice(client);\n\n try {\n const aggClient = createAggregatorClient(client);\n\n const result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!result || result.insufficientLiquidity) {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n\n const expectedOutput = Number(result.amountOut.toString()) / 10 ** toInfo.decimals;\n const priceImpact = result.deviationRatio ?? 0;\n\n return { expectedOutput, priceImpact, poolPrice };\n } catch {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n}\n\nfunction fallbackQuote(\n fromAsset: string,\n amount: number,\n poolPrice: number,\n): { expectedOutput: number; priceImpact: number; poolPrice: number } {\n const expectedOutput = fromAsset === 'USDC'\n ? amount / poolPrice\n : amount * poolPrice;\n return { expectedOutput, priceImpact: 0, poolPrice };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n SwapAdapter,\n SwapQuote,\n AdapterTxResult,\n AdapterCapability,\n ProtocolDescriptor,\n} from './types.js';\nimport * as cetusProtocol from '../protocols/cetus.js';\nimport { CETUS_PACKAGE, STABLE_ASSETS, INVESTMENT_ASSETS } from '../constants.js';\n\nexport const descriptor: ProtocolDescriptor = {\n id: 'cetus',\n name: 'Cetus DEX',\n packages: [CETUS_PACKAGE],\n actionMap: {\n 'router::swap': 'swap',\n 'router::swap_ab_bc': 'swap',\n 'router::swap_ab_cb': 'swap',\n 'router::swap_ba_bc': 'swap',\n 'router::swap_ba_cb': 'swap',\n },\n};\n\nexport class CetusAdapter implements SwapAdapter {\n readonly id = 'cetus';\n readonly name = 'Cetus';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['swap'];\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getQuote(from: string, to: string, amount: number): Promise<SwapQuote> {\n return cetusProtocol.getSwapQuote(this.client, from, to, amount);\n }\n\n async buildSwapTx(\n address: string,\n from: string,\n to: string,\n amount: number,\n maxSlippageBps?: number,\n ): Promise<AdapterTxResult & { estimatedOut: number; toDecimals: number }> {\n const result = await cetusProtocol.buildSwapTx({\n client: this.client,\n address,\n fromAsset: from,\n toAsset: to,\n amount,\n maxSlippageBps,\n });\n return {\n tx: result.tx,\n estimatedOut: result.estimatedOut,\n toDecimals: result.toDecimals,\n };\n }\n\n getSupportedPairs(): Array<{ from: string; to: string }> {\n const pairs: Array<{ from: string; to: string }> = [];\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n pairs.push({ from: 'USDC', to: asset }, { from: asset, to: 'USDC' });\n }\n for (const a of STABLE_ASSETS) {\n for (const b of STABLE_ASSETS) {\n if (a !== b) pairs.push({ from: a, to: b });\n }\n }\n return pairs;\n }\n\n async getPoolPrice(): Promise<number> {\n return cetusProtocol.getPoolPrice(this.client);\n }\n\n async addSwapToTx(\n tx: Transaction,\n address: string,\n inputCoin: TransactionObjectArgument,\n from: string,\n to: string,\n amount: number,\n maxSlippageBps?: number,\n ): Promise<{ outputCoin: TransactionObjectArgument; estimatedOut: number; toDecimals: number }> {\n return cetusProtocol.addSwapToTx({\n tx,\n client: this.client,\n address,\n inputCoin,\n fromAsset: from,\n toAsset: to,\n amount,\n maxSlippageBps,\n });\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n ProtocolDescriptor,\n PendingReward,\n} from './types.js';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS } from '../constants.js';\nimport { stableToRaw, usdcToRaw } from '../utils/format.js';\nimport { T2000Error } from '../errors.js';\nimport { addCollectFeeToTx } from '../protocols/protocolFee.js';\nimport type { TransactionObjectArgument } from '@mysten/sui/transactions';\n\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst WAD = 1e18;\nconst MIN_HEALTH_FACTOR = 1.5;\nconst CLOCK = '0x6';\nconst SUI_SYSTEM_STATE = '0x5';\n\nconst LENDING_MARKET_ID = '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1';\nconst LENDING_MARKET_TYPE = '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL';\nconst SUILEND_PACKAGE = '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf';\nconst UPGRADE_CAP_ID = '0x3d4ef1859c3ee9fc72858f588b56a09da5466e64f8cc4e90a7b3b909fba8a7ae';\nconst FALLBACK_PUBLISHED_AT = '0x3d4353f3bd3565329655e6b77bc2abfd31e558b86662ebd078ae453d416bc10f';\n\nexport const descriptor: ProtocolDescriptor = {\n id: 'suilend',\n name: 'Suilend',\n packages: [SUILEND_PACKAGE],\n actionMap: {\n 'lending_market::deposit_liquidity_and_mint_ctokens': 'save',\n 'lending_market::deposit_ctokens_into_obligation': 'save',\n 'lending_market::create_obligation': 'save',\n 'lending_market::withdraw_ctokens': 'withdraw',\n 'lending_market::redeem_ctokens_and_withdraw_liquidity': 'withdraw',\n 'lending_market::redeem_ctokens_and_withdraw_liquidity_request': 'withdraw',\n 'lending_market::fulfill_liquidity_request': 'withdraw',\n 'lending_market::unstake_sui_from_staker': 'withdraw',\n 'lending_market::borrow': 'borrow',\n 'lending_market::repay': 'repay',\n },\n};\n\ninterface PoolReward {\n coinType: string;\n totalRewards: number;\n startTimeMs: number;\n endTimeMs: number;\n rewardIndex: number;\n}\n\ninterface Reserve {\n coinType: string;\n mintDecimals: number;\n availableAmount: number;\n borrowedAmountWad: number;\n ctokenSupply: number;\n unclaimedSpreadFeesWad: number;\n cumulativeBorrowRateWad: number;\n openLtvPct: number;\n closeLtvPct: number;\n spreadFeeBps: number;\n interestRateUtils: number[];\n interestRateAprs: number[];\n arrayIndex: number;\n price: number;\n depositTotalShares: number;\n depositPoolRewards: PoolReward[];\n}\n\ninterface ObligationCap {\n id: string;\n obligationId: string;\n}\n\ninterface Obligation {\n deposits: Array<{ coinType: string; ctokenAmount: number; reserveIdx: number }>;\n borrows: Array<{ coinType: string; borrowedWad: number; cumBorrowRateWad: number; reserveIdx: number }>;\n}\n\n// ---------------------------------------------------------------------------\n// Rate math (unchanged from SDK-based version)\n// ---------------------------------------------------------------------------\n\nfunction interpolateRate(\n utilBreakpoints: number[],\n aprBreakpoints: number[],\n utilizationPct: number,\n): number {\n if (utilBreakpoints.length === 0) return 0;\n if (utilizationPct <= utilBreakpoints[0]) return aprBreakpoints[0];\n if (utilizationPct >= utilBreakpoints[utilBreakpoints.length - 1]) {\n return aprBreakpoints[aprBreakpoints.length - 1];\n }\n\n for (let i = 1; i < utilBreakpoints.length; i++) {\n if (utilizationPct <= utilBreakpoints[i]) {\n const t =\n (utilizationPct - utilBreakpoints[i - 1]) /\n (utilBreakpoints[i] - utilBreakpoints[i - 1]);\n return aprBreakpoints[i - 1] + t * (aprBreakpoints[i] - aprBreakpoints[i - 1]);\n }\n }\n return aprBreakpoints[aprBreakpoints.length - 1];\n}\n\nfunction computeRates(reserve: Reserve): { borrowAprPct: number; depositAprPct: number } {\n const available = reserve.availableAmount / 10 ** reserve.mintDecimals;\n const borrowed = reserve.borrowedAmountWad / WAD / 10 ** reserve.mintDecimals;\n const totalDeposited = available + borrowed;\n const utilizationPct = totalDeposited > 0 ? (borrowed / totalDeposited) * 100 : 0;\n\n if (reserve.interestRateUtils.length === 0) return { borrowAprPct: 0, depositAprPct: 0 };\n\n const aprs = reserve.interestRateAprs.map((a) => a / 100);\n const borrowAprPct = interpolateRate(reserve.interestRateUtils, aprs, utilizationPct);\n const depositAprPct =\n (utilizationPct / 100) *\n (borrowAprPct / 100) *\n (1 - reserve.spreadFeeBps / 10000) *\n 100;\n\n return { borrowAprPct, depositAprPct };\n}\n\nconst MS_PER_YEAR = 365.25 * 24 * 3600 * 1000;\n\nfunction computeDepositRewardApr(reserve: Reserve, allReserves: Reserve[]): number {\n if (reserve.depositTotalShares <= 0 || reserve.price <= 0) return 0;\n const totalDepositValue =\n (reserve.depositTotalShares / 10 ** reserve.mintDecimals) * reserve.price;\n if (totalDepositValue <= 0) return 0;\n\n const priceMap = new Map<string, { price: number; decimals: number }>();\n for (const r of allReserves) {\n if (r.price > 0) priceMap.set(r.coinType, { price: r.price, decimals: r.mintDecimals });\n }\n\n let rewardApr = 0;\n for (const rw of reserve.depositPoolRewards) {\n const info = priceMap.get(rw.coinType);\n if (!info || info.price <= 0) continue;\n const durationMs = rw.endTimeMs - rw.startTimeMs;\n if (durationMs <= 0) continue;\n const annualTokens =\n (rw.totalRewards / 10 ** info.decimals) * (MS_PER_YEAR / durationMs);\n rewardApr += (annualTokens * info.price) / totalDepositValue * 100;\n }\n return rewardApr;\n}\n\nfunction cTokenRatio(reserve: Reserve): number {\n if (reserve.ctokenSupply === 0) return 1;\n const totalSupply =\n reserve.availableAmount +\n reserve.borrowedAmountWad / WAD -\n reserve.unclaimedSpreadFeesWad / WAD;\n return totalSupply / reserve.ctokenSupply;\n}\n\n// ---------------------------------------------------------------------------\n// JSON-RPC response helpers\n// ---------------------------------------------------------------------------\n\ntype Fields = Record<string, unknown>;\n\nfunction f(obj: unknown): Fields {\n if (obj && typeof obj === 'object' && 'fields' in obj) return (obj as { fields: Fields }).fields;\n return obj as Fields;\n}\n\nfunction str(v: unknown): string { return String(v ?? '0'); }\nfunction num(v: unknown): number { return Number(str(v)); }\n\nfunction parseReserve(raw: unknown, index: number): Reserve {\n const r = f(raw);\n const coinTypeField = f(r.coin_type);\n const config = f(f(r.config)?.element);\n\n const dMgr = f(r.deposits_pool_reward_manager);\n const rawRewards = Array.isArray(dMgr?.pool_rewards) ? (dMgr.pool_rewards as unknown[]) : [];\n const now = Date.now();\n const depositPoolRewards: PoolReward[] = rawRewards\n .map((rw, idx): PoolReward | null => {\n if (rw === null) return null;\n const rwf = f(rw as Record<string, unknown>);\n return {\n coinType: str(f(rwf.coin_type)?.name),\n totalRewards: num(rwf.total_rewards),\n startTimeMs: num(rwf.start_time_ms),\n endTimeMs: num(rwf.end_time_ms),\n rewardIndex: idx,\n };\n })\n .filter((rw): rw is PoolReward => rw !== null && rw.endTimeMs > now && rw.totalRewards > 0);\n\n return {\n coinType: str(coinTypeField?.name),\n mintDecimals: num(r.mint_decimals),\n availableAmount: num(r.available_amount),\n borrowedAmountWad: num(f(r.borrowed_amount)?.value),\n ctokenSupply: num(r.ctoken_supply),\n unclaimedSpreadFeesWad: num(f(r.unclaimed_spread_fees)?.value),\n cumulativeBorrowRateWad: num(f(r.cumulative_borrow_rate)?.value),\n openLtvPct: num(config?.open_ltv_pct),\n closeLtvPct: num(config?.close_ltv_pct),\n spreadFeeBps: num(config?.spread_fee_bps),\n interestRateUtils: Array.isArray(config?.interest_rate_utils) ? (config.interest_rate_utils as unknown[]).map(num) : [],\n interestRateAprs: Array.isArray(config?.interest_rate_aprs) ? (config.interest_rate_aprs as unknown[]).map(num) : [],\n arrayIndex: index,\n price: num(f(r.price)?.value) / WAD,\n depositTotalShares: num(dMgr?.total_shares),\n depositPoolRewards,\n };\n}\n\nfunction parseObligation(raw: Fields): Obligation {\n const deposits = Array.isArray(raw.deposits)\n ? (raw.deposits as unknown[]).map((d) => {\n const df = f(d);\n return {\n coinType: str(f(df.coin_type)?.name),\n ctokenAmount: num(df.deposited_ctoken_amount),\n reserveIdx: num(df.reserve_array_index),\n };\n })\n : [];\n\n const borrows = Array.isArray(raw.borrows)\n ? (raw.borrows as unknown[]).map((b) => {\n const bf = f(b);\n return {\n coinType: str(f(bf.coin_type)?.name),\n borrowedWad: num(f(bf.borrowed_amount)?.value),\n cumBorrowRateWad: num(f(bf.cumulative_borrow_rate)?.value),\n reserveIdx: num(bf.reserve_array_index),\n };\n })\n : [];\n\n return { deposits, borrows };\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Suilend adapter — contract-first, no SDK dependency.\n * Interacts directly with Suilend Move contracts via RPC + PTB moveCall.\n */\nexport class SuilendAdapter implements LendingAdapter {\n readonly id = 'suilend';\n readonly name = 'Suilend';\n readonly version = '2.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...STABLE_ASSETS, 'SUI', 'ETH', 'BTC', 'GOLD'];\n readonly supportsSameAssetBorrow = false;\n\n private client!: SuiJsonRpcClient;\n private publishedAt: string | null = null;\n private reserveCache: Reserve[] | null = null;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n // -- On-chain reads -------------------------------------------------------\n\n private async resolvePackage(): Promise<string> {\n if (this.publishedAt) return this.publishedAt;\n try {\n const cap = await this.client.getObject({ id: UPGRADE_CAP_ID, options: { showContent: true } });\n if (cap.data?.content?.dataType === 'moveObject') {\n const fields = cap.data.content.fields as Fields;\n this.publishedAt = str(fields.package);\n return this.publishedAt;\n }\n } catch { /* use fallback */ }\n this.publishedAt = FALLBACK_PUBLISHED_AT;\n return this.publishedAt;\n }\n\n private async loadReserves(fresh = false): Promise<Reserve[]> {\n if (this.reserveCache && !fresh) return this.reserveCache;\n\n const market = await this.client.getObject({\n id: LENDING_MARKET_ID,\n options: { showContent: true },\n });\n\n if (market.data?.content?.dataType !== 'moveObject') {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to read Suilend lending market');\n }\n\n const fields = market.data.content.fields as Fields;\n const reservesRaw = fields.reserves as unknown[];\n\n if (!Array.isArray(reservesRaw)) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to parse Suilend reserves');\n }\n\n this.reserveCache = reservesRaw.map((r, i) => parseReserve(r, i));\n return this.reserveCache;\n }\n\n private findReserve(reserves: Reserve[], asset: string): Reserve | undefined {\n let coinType: string;\n if (asset in SUPPORTED_ASSETS) {\n coinType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n } else if (asset.includes('::')) {\n coinType = asset;\n } else {\n return undefined;\n }\n\n try {\n const normalized = normalizeStructTag(coinType);\n return reserves.find((r) => {\n try { return normalizeStructTag(r.coinType) === normalized; } catch { return false; }\n });\n } catch { return undefined; }\n }\n\n private async fetchObligationCaps(address: string): Promise<ObligationCap[]> {\n const capType = `${SUILEND_PACKAGE}::lending_market::ObligationOwnerCap<${LENDING_MARKET_TYPE}>`;\n const caps: ObligationCap[] = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n\n while (hasNext) {\n const page = await this.client.getOwnedObjects({\n owner: address,\n filter: { StructType: capType },\n options: { showContent: true },\n cursor: cursor ?? undefined,\n });\n\n for (const item of page.data) {\n if (item.data?.content?.dataType !== 'moveObject') continue;\n const fields = item.data.content.fields as Fields;\n caps.push({\n id: item.data.objectId,\n obligationId: str(fields.obligation_id),\n });\n }\n\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n return caps;\n }\n\n private async fetchObligation(obligationId: string): Promise<Obligation> {\n const obj = await this.client.getObject({ id: obligationId, options: { showContent: true } });\n if (obj.data?.content?.dataType !== 'moveObject') {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Failed to read Suilend obligation');\n }\n return parseObligation(obj.data.content.fields as Fields);\n }\n\n private resolveSymbol(coinType: string): string {\n try {\n const normalized = normalizeStructTag(coinType);\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n try {\n if (normalizeStructTag(info.type) === normalized) return key;\n } catch { /* skip */ }\n }\n } catch { /* fall through */ }\n const parts = coinType.split('::');\n return parts[parts.length - 1] || 'UNKNOWN';\n }\n\n // -- Adapter interface ----------------------------------------------------\n\n async getRates(asset: string): Promise<LendingRates> {\n const reserves = await this.loadReserves();\n const reserve = this.findReserve(reserves, asset);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `Suilend does not support ${asset}`);\n\n const { borrowAprPct, depositAprPct } = computeRates(reserve);\n const rewardApr = computeDepositRewardApr(reserve, reserves);\n return { asset, saveApy: depositAprPct + rewardApr, borrowApy: borrowAprPct };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const supplies: Array<{ asset: string; amount: number; apy: number }> = [];\n const borrows: Array<{ asset: string; amount: number; apy: number }> = [];\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) return { supplies, borrows };\n\n const [reserves, obligation] = await Promise.all([\n this.loadReserves(),\n this.fetchObligation(caps[0].obligationId),\n ]);\n\n for (const dep of obligation.deposits) {\n const reserve = reserves[dep.reserveIdx];\n if (!reserve) continue;\n const ratio = cTokenRatio(reserve);\n const amount = (dep.ctokenAmount * ratio) / 10 ** reserve.mintDecimals;\n const { depositAprPct } = computeRates(reserve);\n const rewardApr = computeDepositRewardApr(reserve, reserves);\n supplies.push({ asset: this.resolveSymbol(dep.coinType), amount, apy: depositAprPct + rewardApr });\n }\n\n for (const bor of obligation.borrows) {\n const reserve = reserves[bor.reserveIdx];\n if (!reserve) continue;\n const rawAmount = bor.borrowedWad / WAD / 10 ** reserve.mintDecimals;\n const reserveRate = reserve.cumulativeBorrowRateWad / WAD;\n const posRate = bor.cumBorrowRateWad / WAD;\n const compounded = posRate > 0 ? rawAmount * (reserveRate / posRate) : rawAmount;\n const { borrowAprPct } = computeRates(reserve);\n borrows.push({ asset: this.resolveSymbol(bor.coinType), amount: compounded, apy: borrowAprPct });\n }\n\n return { supplies, borrows };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) {\n return { healthFactor: Infinity, supplied: 0, borrowed: 0, maxBorrow: 0, liquidationThreshold: 0 };\n }\n\n const [reserves, obligation] = await Promise.all([\n this.loadReserves(),\n this.fetchObligation(caps[0].obligationId),\n ]);\n\n let supplied = 0;\n let borrowed = 0;\n let weightedCloseLtv = 0;\n let weightedOpenLtv = 0;\n\n for (const dep of obligation.deposits) {\n const reserve = reserves[dep.reserveIdx];\n if (!reserve) continue;\n const ratio = cTokenRatio(reserve);\n const amount = (dep.ctokenAmount * ratio) / 10 ** reserve.mintDecimals;\n supplied += amount;\n weightedCloseLtv += amount * (reserve.closeLtvPct / 100);\n weightedOpenLtv += amount * (reserve.openLtvPct / 100);\n }\n\n for (const bor of obligation.borrows) {\n const reserve = reserves[bor.reserveIdx];\n if (!reserve) continue;\n const rawAmount = bor.borrowedWad / WAD / 10 ** reserve.mintDecimals;\n const reserveRate = reserve.cumulativeBorrowRateWad / WAD;\n const posRate = bor.cumBorrowRateWad / WAD;\n borrowed += posRate > 0 ? rawAmount * (reserveRate / posRate) : rawAmount;\n }\n\n const liqThreshold = supplied > 0 ? weightedCloseLtv / supplied : 0.75;\n const openLtv = supplied > 0 ? weightedOpenLtv / supplied : 0.70;\n\n const healthFactor = borrowed > 0 ? (supplied * liqThreshold) / borrowed : Infinity;\n const maxBorrow = Math.max(0, supplied * openLtv - borrowed);\n\n return { healthFactor, supplied, borrowed, maxBorrow, liquidationThreshold: liqThreshold };\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves()]);\n const reserve = this.findReserve(reserves, assetKey);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `${assetInfo.displayName} reserve not found on Suilend. Try: NAVI or a different asset.`);\n\n const caps = await this.fetchObligationCaps(address);\n const tx = new Transaction();\n tx.setSender(address);\n\n let capRef: TransactionObjectArgument | string;\n if (caps.length === 0) {\n const [newCap] = tx.moveCall({\n target: `${pkg}::lending_market::create_obligation`,\n typeArguments: [LENDING_MARKET_TYPE],\n arguments: [tx.object(LENDING_MARKET_ID)],\n });\n capRef = newCap;\n } else {\n capRef = caps[0].id;\n }\n\n const allCoins = await this.fetchAllCoins(address, assetInfo.type);\n if (allCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const primaryCoinId = allCoins[0].coinObjectId;\n if (allCoins.length > 1) {\n tx.mergeCoins(tx.object(primaryCoinId), allCoins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n const rawAmount = stableToRaw(amount, assetInfo.decimals).toString();\n const [depositCoin] = tx.splitCoins(tx.object(primaryCoinId), [rawAmount]);\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, depositCoin as TransactionObjectArgument, 'save');\n }\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::deposit_liquidity_and_mint_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(CLOCK),\n depositCoin,\n ],\n });\n\n tx.moveCall({\n target: `${pkg}::lending_market::deposit_ctokens_into_obligation`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n typeof capRef === 'string' ? tx.object(capRef) : capRef,\n tx.object(CLOCK),\n ctokens,\n ],\n });\n\n if (typeof capRef !== 'string') {\n tx.transferObjects([capRef], address);\n }\n\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves(true)]);\n const reserve = this.findReserve(reserves, assetKey);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `${assetInfo.displayName} reserve not found on Suilend`);\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found');\n\n const obligation = await this.fetchObligation(caps[0].obligationId);\n const dep = obligation.deposits.find(d => d.reserveIdx === reserve.arrayIndex);\n const ratio = cTokenRatio(reserve);\n const deposited = dep ? (dep.ctokenAmount * ratio) / 10 ** reserve.mintDecimals : 0;\n const effectiveAmount = Math.min(amount, deposited);\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on Suilend`);\n\n const U64_MAX = '18446744073709551615';\n const isFullWithdraw = dep && effectiveAmount >= deposited * 0.999;\n const withdrawArg = isFullWithdraw\n ? U64_MAX\n : String(Math.floor(effectiveAmount * 10 ** reserve.mintDecimals / ratio));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::withdraw_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n tx.pure('u64', BigInt(withdrawArg)),\n ],\n });\n\n const coin = this.redeemCtokens(tx, pkg, reserve, assetInfo.type, assetKey, ctokens);\n tx.transferObjects([coin], address);\n\n return { tx, effectiveAmount };\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 assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves(true)]);\n const reserve = this.findReserve(reserves, assetKey);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `${assetInfo.displayName} reserve not found on Suilend`);\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found');\n\n const obligation = await this.fetchObligation(caps[0].obligationId);\n const dep = obligation.deposits.find(d => d.reserveIdx === reserve.arrayIndex);\n const ratio = cTokenRatio(reserve);\n const deposited = dep ? (dep.ctokenAmount * ratio) / 10 ** reserve.mintDecimals : 0;\n const effectiveAmount = Math.min(amount, deposited);\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on Suilend`);\n\n const ctokenAmount = (dep && effectiveAmount >= deposited * 0.999)\n ? dep.ctokenAmount\n : Math.floor(effectiveAmount * 10 ** reserve.mintDecimals / ratio);\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::withdraw_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n tx.pure.u64(ctokenAmount),\n ],\n });\n\n const coin = this.redeemCtokens(tx, pkg, reserve, assetInfo.type, assetKey, ctokens);\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n }\n\n /**\n * 3-step cToken redemption matching the official Suilend SDK flow:\n * 1. redeem_ctokens_and_withdraw_liquidity_request — creates a LiquidityRequest\n * 2. unstake_sui_from_staker — (SUI only) unstakes from validators to replenish available_liquidity\n * 3. fulfill_liquidity_request — splits underlying tokens from the reserve\n */\n private redeemCtokens(\n tx: Transaction,\n pkg: string,\n reserve: Reserve,\n coinType: string,\n assetKey: string,\n ctokens: TransactionObjectArgument,\n ): TransactionObjectArgument {\n const exemptionType = `${SUILEND_PACKAGE}::lending_market::RateLimiterExemption<${LENDING_MARKET_TYPE}, ${coinType}>`;\n const [none] = tx.moveCall({\n target: '0x1::option::none',\n typeArguments: [exemptionType],\n });\n\n const [liquidityRequest] = tx.moveCall({\n target: `${pkg}::lending_market::redeem_ctokens_and_withdraw_liquidity_request`,\n typeArguments: [LENDING_MARKET_TYPE, coinType],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(CLOCK),\n ctokens,\n none,\n ],\n });\n\n if (assetKey === 'SUI') {\n tx.moveCall({\n target: `${pkg}::lending_market::unstake_sui_from_staker`,\n typeArguments: [LENDING_MARKET_TYPE],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n liquidityRequest,\n tx.object(SUI_SYSTEM_STATE),\n ],\n });\n }\n\n const [coin] = tx.moveCall({\n target: `${pkg}::lending_market::fulfill_liquidity_request`,\n typeArguments: [LENDING_MARKET_TYPE, coinType],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n liquidityRequest,\n ],\n });\n\n return coin;\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 assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves()]);\n const reserve = this.findReserve(reserves, assetKey);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `${assetInfo.displayName} reserve not found on Suilend`);\n\n const caps = await this.fetchObligationCaps(address);\n\n let capRef: TransactionObjectArgument | string;\n if (caps.length === 0) {\n const [newCap] = tx.moveCall({\n target: `${pkg}::lending_market::create_obligation`,\n typeArguments: [LENDING_MARKET_TYPE],\n arguments: [tx.object(LENDING_MARKET_ID)],\n });\n capRef = newCap;\n } else {\n capRef = caps[0].id;\n }\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n const [ctokens] = tx.moveCall({\n target: `${pkg}::lending_market::deposit_liquidity_and_mint_ctokens`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(CLOCK),\n coin,\n ],\n });\n\n tx.moveCall({\n target: `${pkg}::lending_market::deposit_ctokens_into_obligation`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n typeof capRef === 'string' ? tx.object(capRef) : capRef,\n tx.object(CLOCK),\n ctokens,\n ],\n });\n\n if (typeof capRef !== 'string') {\n tx.transferObjects([capRef], address);\n }\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves()]);\n const reserve = this.findReserve(reserves, assetKey);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `${assetInfo.displayName} reserve not found on Suilend. Try: NAVI or a different asset.`);\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found. Deposit collateral first with: t2000 save <amount>');\n\n const rawAmount = stableToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n const [coin] = tx.moveCall({\n target: `${pkg}::lending_market::borrow`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n tx.pure.u64(rawAmount),\n ],\n });\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, coin as TransactionObjectArgument, 'borrow');\n }\n\n tx.transferObjects([coin], address);\n\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n ): Promise<AdapterTxResult> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves()]);\n const reserve = this.findReserve(reserves, assetKey);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `${assetInfo.displayName} reserve not found on Suilend`);\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend obligation found');\n\n const allCoins = await this.fetchAllCoins(address, assetInfo.type);\n if (allCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with`);\n\n const rawAmount = stableToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n const primaryCoinId = allCoins[0].coinObjectId;\n if (allCoins.length > 1) {\n tx.mergeCoins(tx.object(primaryCoinId), allCoins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n const [repayCoin] = tx.splitCoins(tx.object(primaryCoinId), [rawAmount.toString()]);\n\n tx.moveCall({\n target: `${pkg}::lending_market::repay`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n repayCoin,\n ],\n });\n\n return { tx };\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n const [pkg, reserves] = await Promise.all([this.resolvePackage(), this.loadReserves()]);\n const reserve = this.findReserve(reserves, assetKey);\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `${assetInfo.displayName} reserve not found on Suilend`);\n\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend obligation found');\n\n tx.moveCall({\n target: `${pkg}::lending_market::repay`,\n typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.pure.u64(reserve.arrayIndex),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n coin,\n ],\n });\n }\n\n async maxWithdraw(\n address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n const health = await this.getHealth(address);\n\n let maxAmount: number;\n if (health.borrowed === 0) {\n maxAmount = health.supplied;\n } else {\n maxAmount = Math.max(0, health.supplied - (health.borrowed * MIN_HEALTH_FACTOR) / health.liquidationThreshold);\n }\n\n const remainingSupply = health.supplied - maxAmount;\n const hfAfter = health.borrowed > 0\n ? (remainingSupply * health.liquidationThreshold) / health.borrowed\n : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: health.healthFactor };\n }\n\n async maxBorrow(\n address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n const health = await this.getHealth(address);\n const maxAmount = health.maxBorrow;\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: health.healthFactor };\n }\n\n private async fetchAllCoins(\n owner: string,\n coinType: string,\n ): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined = null;\n let hasNext = true;\n\n while (hasNext) {\n const page = await this.client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n return all;\n }\n\n // -- Claim Rewards --------------------------------------------------------\n\n private isClaimableReward(coinType: string): boolean {\n const ct = coinType.toLowerCase();\n return ct.includes('spring_sui') || ct.includes('deep::deep') || ct.includes('cert::cert');\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) return [];\n\n const [reserves, obligation] = await Promise.all([\n this.loadReserves(true),\n this.fetchObligation(caps[0].obligationId),\n ]);\n\n const rewards: PendingReward[] = [];\n\n for (const dep of obligation.deposits) {\n const reserve = reserves[dep.reserveIdx];\n if (!reserve) continue;\n\n for (const rw of reserve.depositPoolRewards) {\n if (!this.isClaimableReward(rw.coinType)) continue;\n\n const durationMs = rw.endTimeMs - rw.startTimeMs;\n if (durationMs <= 0) continue;\n\n const assetSymbol = this.resolveSymbol(dep.coinType);\n if (!(assetSymbol in SUPPORTED_ASSETS)) continue;\n\n rewards.push({\n protocol: 'suilend',\n asset: assetSymbol,\n coinType: rw.coinType,\n symbol: rw.coinType.includes('spring_sui') ? 'sSUI'\n : rw.coinType.includes('deep::') ? 'DEEP'\n : rw.coinType.split('::').pop() ?? 'UNKNOWN',\n amount: 0,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return rewards;\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n const caps = await this.fetchObligationCaps(address);\n if (caps.length === 0) return [];\n\n const [pkg, reserves, obligation] = await Promise.all([\n this.resolvePackage(),\n this.loadReserves(true),\n this.fetchObligation(caps[0].obligationId),\n ]);\n\n const claimsByToken = new Map<string, TransactionObjectArgument[]>();\n const claimed: PendingReward[] = [];\n\n for (const dep of obligation.deposits) {\n const reserve = reserves[dep.reserveIdx];\n if (!reserve) continue;\n\n for (const rw of reserve.depositPoolRewards) {\n if (!this.isClaimableReward(rw.coinType)) continue;\n\n const [coin] = tx.moveCall({\n target: `${pkg}::lending_market::claim_rewards`,\n typeArguments: [LENDING_MARKET_TYPE, rw.coinType],\n arguments: [\n tx.object(LENDING_MARKET_ID),\n tx.object(caps[0].id),\n tx.object(CLOCK),\n tx.pure.u64(reserve.arrayIndex),\n tx.pure.u64(rw.rewardIndex),\n tx.pure.bool(true),\n ],\n });\n\n const existing = claimsByToken.get(rw.coinType) ?? [];\n existing.push(coin);\n claimsByToken.set(rw.coinType, existing);\n }\n }\n\n for (const [coinType, coins] of claimsByToken) {\n if (coins.length > 1) {\n tx.mergeCoins(coins[0], coins.slice(1));\n }\n tx.transferObjects([coins[0]], address);\n\n const symbol = coinType.includes('spring_sui') ? 'SPRING_SUI'\n : coinType.includes('deep::') ? 'DEEP'\n : coinType.split('::').pop() ?? 'UNKNOWN';\n\n claimed.push({\n protocol: 'suilend',\n asset: '',\n coinType,\n symbol,\n amount: 0,\n estimatedValueUsd: 0,\n });\n }\n\n return claimed;\n }\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 type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n AUTO_TOPUP_AMOUNT,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport { buildSwapTx } from '../protocols/cetus.js';\n\nconst AUTO_TOPUP_MIN_SUI_FOR_GAS = 5_000_000n; // 0.005 SUI — minimum to self-fund the swap\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 return suiRaw < AUTO_TOPUP_THRESHOLD && suiRaw >= AUTO_TOPUP_MIN_SUI_FOR_GAS && usdcRaw >= AUTO_TOPUP_MIN_USDC;\n}\n\n/**\n * Self-fund a USDC→SUI swap to replenish gas.\n *\n * Uses the agent's remaining SUI to pay for the swap gas (~0.007 SUI).\n * This avoids the chicken-and-egg problem of needing gas station sponsorship\n * to get gas, and works even when the gas station is down.\n */\nexport async function executeAutoTopUp(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n): Promise<AutoTopUpResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const topupAmountHuman = Number(AUTO_TOPUP_AMOUNT) / 1e6; // $1 USDC\n\n const { tx } = await buildSwapTx({\n client,\n address,\n fromAsset: 'USDC',\n toAsset: 'SUI',\n amount: topupAmountHuman,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let suiReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === SUPPORTED_ASSETS.SUI.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n suiReceived += Number(change.amount) / Number(MIST_PER_SUI);\n }\n }\n }\n\n return {\n success: true,\n tx: result.digest,\n usdcSpent: topupAmountHuman,\n suiReceived: Math.abs(suiReceived),\n };\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.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 = Buffer.from(txJson).toString('base64');\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') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter },\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 undefined,\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\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';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n gasMethod: GasMethod;\n gasCostSui: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\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 trySelfFunded(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n // Need at least 0.05 SUI for gas\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, keypair);\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 result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\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 = Buffer.from(bcsBytes).toString('base64');\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = Buffer.from(sponsoredResult.txBytes, 'base64');\n const { signature: agentSig } = await keypair.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n // Report gas usage (best-effort)\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 gasMethod: 'sponsored',\n gasCostSui: gasCost,\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 */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\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 errors: string[] = [];\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, keypair, tx);\n if (result) return result;\n errors.push('self-funded: SUI below threshold');\n } catch (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 errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (self-fund swap for gas) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, keypair, buildTx);\n if (result) return result;\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, keypair, tx);\n if (result) return result;\n errors.push('sponsored: returned null');\n } catch (err) {\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and Gas Station unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\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 | 'exchange'\n | 'rebalance'\n | 'pay'\n | 'sentinel'\n | 'invest'\n | 'trade';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n 'sentinel',\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","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from './errors.js';\nimport type { InvestmentTrade } from './types.js';\n\ninterface StoredPosition {\n totalAmount: number;\n costBasis: number;\n avgPrice: number;\n trades: InvestmentTrade[];\n earning?: boolean;\n earningProtocol?: string;\n earningApy?: number;\n}\n\ninterface PortfolioData {\n positions: Record<string, StoredPosition>;\n strategies: Record<string, Record<string, StoredPosition>>;\n realizedPnL: number;\n}\n\nfunction emptyData(): PortfolioData {\n return { positions: {}, strategies: {}, realizedPnL: 0 };\n}\n\nexport class PortfolioManager {\n private data: PortfolioData = emptyData();\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, 'portfolio.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.data = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n if (!this.data.strategies) this.data.strategies = {};\n }\n } catch {\n this.data = emptyData();\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));\n }\n\n recordBuy(trade: InvestmentTrade): void {\n this.load();\n const pos = this.data.positions[trade.asset] ?? { totalAmount: 0, costBasis: 0, avgPrice: 0, trades: [] };\n\n pos.totalAmount += trade.amount;\n pos.costBasis += trade.usdValue;\n pos.avgPrice = pos.costBasis / pos.totalAmount;\n pos.trades.push(trade);\n\n this.data.positions[trade.asset] = pos;\n this.save();\n }\n\n recordSell(trade: InvestmentTrade): number {\n this.load();\n const pos = this.data.positions[trade.asset];\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${trade.asset} position to sell`);\n }\n\n const sellAmount = Math.min(trade.amount, pos.totalAmount);\n const effectiveUsdValue = trade.amount > 0 && sellAmount < trade.amount\n ? trade.usdValue * (sellAmount / trade.amount)\n : trade.usdValue;\n const costOfSold = pos.avgPrice * sellAmount;\n const realizedPnL = effectiveUsdValue - costOfSold;\n\n pos.totalAmount -= sellAmount;\n pos.costBasis -= costOfSold;\n if (pos.totalAmount < 0.000001) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n }\n\n pos.trades.push(trade);\n this.data.realizedPnL += realizedPnL;\n\n this.data.positions[trade.asset] = pos;\n this.save();\n return realizedPnL;\n }\n\n getPosition(asset: string): StoredPosition | undefined {\n this.load();\n return this.data.positions[asset];\n }\n\n getPositions(): Array<{ asset: string } & StoredPosition> {\n this.load();\n return Object.entries(this.data.positions)\n .filter(([, pos]) => pos.totalAmount > 0)\n .map(([asset, pos]) => ({ asset, ...pos }));\n }\n\n recordEarn(asset: string, protocol: string, apy: number): void {\n this.load();\n const pos = this.data.positions[asset];\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${asset} position to earn on`);\n }\n pos.earning = true;\n pos.earningProtocol = protocol;\n pos.earningApy = apy;\n this.data.positions[asset] = pos;\n this.save();\n }\n\n recordUnearn(asset: string): void {\n this.load();\n const pos = this.data.positions[asset];\n if (!pos || !pos.earning) {\n throw new T2000Error('INVEST_NOT_EARNING', `${asset} is not currently earning`);\n }\n pos.earning = false;\n pos.earningProtocol = undefined;\n pos.earningApy = undefined;\n this.data.positions[asset] = pos;\n this.save();\n }\n\n closePosition(asset: string): void {\n this.load();\n const pos = this.data.positions[asset];\n if (pos) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n pos.earning = false;\n pos.earningProtocol = undefined;\n pos.earningApy = undefined;\n this.data.positions[asset] = pos;\n this.save();\n }\n }\n\n isEarning(asset: string): boolean {\n this.load();\n const pos = this.data.positions[asset];\n return pos?.earning === true;\n }\n\n getRealizedPnL(): number {\n this.load();\n return this.data.realizedPnL;\n }\n\n // --- Strategy position tracking ---\n\n recordStrategyBuy(strategyKey: string, trade: InvestmentTrade): void {\n this.load();\n if (!this.data.strategies[strategyKey]) {\n this.data.strategies[strategyKey] = {};\n }\n const bucket = this.data.strategies[strategyKey];\n const pos = bucket[trade.asset] ?? { totalAmount: 0, costBasis: 0, avgPrice: 0, trades: [] };\n\n pos.totalAmount += trade.amount;\n pos.costBasis += trade.usdValue;\n pos.avgPrice = pos.costBasis / pos.totalAmount;\n pos.trades.push(trade);\n\n bucket[trade.asset] = pos;\n this.save();\n }\n\n recordStrategySell(strategyKey: string, trade: InvestmentTrade): number {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket) {\n throw new T2000Error('STRATEGY_NOT_FOUND', `No positions for strategy '${strategyKey}'`);\n }\n const pos = bucket[trade.asset];\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${trade.asset} position in strategy '${strategyKey}'`);\n }\n\n const sellAmount = Math.min(trade.amount, pos.totalAmount);\n const effectiveUsdValue = trade.amount > 0 && sellAmount < trade.amount\n ? trade.usdValue * (sellAmount / trade.amount)\n : trade.usdValue;\n const costOfSold = pos.avgPrice * sellAmount;\n const realizedPnL = effectiveUsdValue - costOfSold;\n\n pos.totalAmount -= sellAmount;\n pos.costBasis -= costOfSold;\n if (pos.totalAmount < 0.000001) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n }\n\n pos.trades.push(trade);\n // P&L is NOT added to global realizedPnL here — investSell already\n // recorded it via recordSell to avoid double-counting.\n\n bucket[trade.asset] = pos;\n\n const hasPositions = Object.values(bucket).some((p) => p.totalAmount > 0);\n if (!hasPositions) {\n delete this.data.strategies[strategyKey];\n }\n\n this.save();\n return realizedPnL;\n }\n\n getStrategyPositions(strategyKey: string): Array<{ asset: string } & StoredPosition> {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket) return [];\n return Object.entries(bucket)\n .filter(([, pos]) => pos.totalAmount > 0)\n .map(([asset, pos]) => ({ asset, ...pos }));\n }\n\n getAllStrategyKeys(): string[] {\n this.load();\n return Object.keys(this.data.strategies);\n }\n\n clearStrategy(strategyKey: string): void {\n this.load();\n delete this.data.strategies[strategyKey];\n this.save();\n }\n\n hasStrategyPositions(strategyKey: string): boolean {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket) return false;\n return Object.values(bucket).some((p) => p.totalAmount > 0);\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from './errors.js';\nimport { DEFAULT_STRATEGIES, INVESTMENT_ASSETS } from './constants.js';\nimport type { StrategyDefinition } from './types.js';\n\ninterface StrategyData {\n strategies: Record<string, StrategyDefinition>;\n}\n\nfunction emptyData(): StrategyData {\n return { strategies: {} };\n}\n\nexport class StrategyManager {\n private data: StrategyData = emptyData();\n private readonly filePath: string;\n private readonly dir: string;\n private seeded = false;\n\n constructor(configDir?: string) {\n this.dir = configDir ?? join(homedir(), '.t2000');\n this.filePath = join(this.dir, 'strategies.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.data = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.data = emptyData();\n }\n if (!this.seeded) {\n this.seedDefaults();\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));\n }\n\n private seedDefaults(): void {\n this.seeded = true;\n let changed = false;\n for (const [key, def] of Object.entries(DEFAULT_STRATEGIES)) {\n if (!this.data.strategies[key]) {\n this.data.strategies[key] = { ...def, allocations: { ...def.allocations } };\n changed = true;\n }\n }\n if (changed) this.save();\n }\n\n getAll(): Record<string, StrategyDefinition> {\n this.load();\n return { ...this.data.strategies };\n }\n\n get(name: string): StrategyDefinition {\n this.load();\n const strategy = this.data.strategies[name];\n if (!strategy) {\n throw new T2000Error('STRATEGY_NOT_FOUND', `Strategy '${name}' not found`);\n }\n return strategy;\n }\n\n create(params: { name: string; allocations: Record<string, number>; description?: string }): StrategyDefinition {\n this.load();\n const key = params.name.toLowerCase().replace(/\\s+/g, '-');\n\n if (this.data.strategies[key]) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `Strategy '${key}' already exists`);\n }\n\n this.validateAllocations(params.allocations);\n\n const definition: StrategyDefinition = {\n name: params.name,\n allocations: { ...params.allocations },\n description: params.description ?? `Custom strategy: ${params.name}`,\n custom: true,\n };\n\n this.data.strategies[key] = definition;\n this.save();\n return definition;\n }\n\n delete(name: string): void {\n this.load();\n const strategy = this.data.strategies[name];\n if (!strategy) {\n throw new T2000Error('STRATEGY_NOT_FOUND', `Strategy '${name}' not found`);\n }\n if (!strategy.custom) {\n throw new T2000Error('STRATEGY_BUILTIN', `Cannot delete built-in strategy '${name}'`);\n }\n delete this.data.strategies[name];\n this.save();\n }\n\n validateAllocations(allocations: Record<string, number>): void {\n const total = Object.values(allocations).reduce((sum, pct) => sum + pct, 0);\n if (Math.abs(total - 100) > 0.01) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `Allocations must sum to 100 (got ${total})`);\n }\n\n for (const asset of Object.keys(allocations)) {\n if (!(asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `${asset} is not an investment asset`);\n }\n if (allocations[asset] <= 0) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `Allocation for ${asset} must be > 0`);\n }\n }\n }\n\n validateMinAmount(allocations: Record<string, number>, totalUsd: number): void {\n const smallestPct = Math.min(...Object.values(allocations));\n const minRequired = Math.ceil(100 / smallestPct);\n if (totalUsd < minRequired) {\n const smallestAsset = Object.entries(allocations).find(([, p]) => p === smallestPct)?.[0] ?? '?';\n throw new T2000Error(\n 'STRATEGY_MIN_AMOUNT',\n `Minimum $${minRequired} for this strategy (${smallestAsset} at ${smallestPct}% needs at least $1)`,\n );\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport { T2000Error } from './errors.js';\nimport type { AutoInvestSchedule, AutoInvestStatus } from './types.js';\n\ninterface AutoInvestData {\n schedules: AutoInvestSchedule[];\n}\n\nfunction emptyData(): AutoInvestData {\n return { schedules: [] };\n}\n\nfunction computeNextRun(\n frequency: 'daily' | 'weekly' | 'monthly',\n dayOfWeek?: number,\n dayOfMonth?: number,\n from?: Date,\n): string {\n const base = from ?? new Date();\n const next = new Date(base);\n\n switch (frequency) {\n case 'daily':\n next.setDate(next.getDate() + 1);\n next.setHours(0, 0, 0, 0);\n break;\n case 'weekly': {\n const dow = dayOfWeek ?? 1; // Monday default\n next.setDate(next.getDate() + ((7 - next.getDay() + dow) % 7 || 7));\n next.setHours(0, 0, 0, 0);\n break;\n }\n case 'monthly': {\n const dom = dayOfMonth ?? 1;\n next.setMonth(next.getMonth() + 1, dom);\n next.setHours(0, 0, 0, 0);\n break;\n }\n }\n\n return next.toISOString();\n}\n\nexport class AutoInvestManager {\n private data: AutoInvestData = emptyData();\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, 'auto-invest.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.data = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.data = emptyData();\n }\n if (!this.data.schedules) {\n this.data.schedules = [];\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));\n }\n\n setup(params: {\n amount: number;\n frequency: 'daily' | 'weekly' | 'monthly';\n strategy?: string;\n asset?: string;\n dayOfWeek?: number;\n dayOfMonth?: number;\n }): AutoInvestSchedule {\n this.load();\n\n if (!params.strategy && !params.asset) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', 'Either strategy or asset must be specified');\n }\n if (params.amount < 1) {\n throw new T2000Error('AUTO_INVEST_INSUFFICIENT', 'Auto-invest amount must be at least $1');\n }\n\n const schedule: AutoInvestSchedule = {\n id: randomUUID().slice(0, 8),\n strategy: params.strategy,\n asset: params.asset,\n amount: params.amount,\n frequency: params.frequency,\n dayOfWeek: params.dayOfWeek,\n dayOfMonth: params.dayOfMonth,\n nextRun: computeNextRun(params.frequency, params.dayOfWeek, params.dayOfMonth),\n enabled: true,\n totalInvested: 0,\n runCount: 0,\n };\n\n this.data.schedules.push(schedule);\n this.save();\n return schedule;\n }\n\n getStatus(): AutoInvestStatus {\n this.load();\n const now = new Date();\n const pending = this.data.schedules.filter(\n (s) => s.enabled && new Date(s.nextRun) <= now,\n );\n return {\n schedules: [...this.data.schedules],\n pendingRuns: pending,\n };\n }\n\n getSchedule(id: string): AutoInvestSchedule {\n this.load();\n const schedule = this.data.schedules.find((s) => s.id === id);\n if (!schedule) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);\n }\n return schedule;\n }\n\n recordRun(id: string, amountInvested: number): void {\n this.load();\n const schedule = this.data.schedules.find((s) => s.id === id);\n if (!schedule) return;\n\n schedule.lastRun = new Date().toISOString();\n schedule.nextRun = computeNextRun(schedule.frequency, schedule.dayOfWeek, schedule.dayOfMonth);\n schedule.totalInvested += amountInvested;\n schedule.runCount += 1;\n this.save();\n }\n\n stop(id: string): void {\n this.load();\n const schedule = this.data.schedules.find((s) => s.id === id);\n if (!schedule) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);\n }\n schedule.enabled = false;\n this.save();\n }\n\n remove(id: string): void {\n this.load();\n const idx = this.data.schedules.findIndex((s) => s.id === id);\n if (idx === -1) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);\n }\n this.data.schedules.splice(idx, 1);\n this.save();\n }\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 { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory } from './wallet/history.js';\nimport { calculateFee, reportFee } from './protocols/protocolFee.js';\nimport * as yieldTracker from './protocols/yieldTracker.js';\nimport * as sentinel from './protocols/sentinel.js';\nimport { ProtocolRegistry } from './adapters/registry.js';\nimport { NaviAdapter } from './adapters/navi.js';\nimport { CetusAdapter } from './adapters/cetus.js';\nimport { buildRawSwapTx } from './protocols/cetus.js';\nimport { SuilendAdapter } from './adapters/suilend.js';\nimport type { LendingAdapter, SwapAdapter } 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 SwapResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n RatesResult,\n PositionsResult,\n TransactionRecord,\n DepositInfo,\n EarningsResult,\n FundStatusResult,\n SentinelAgent,\n SentinelAttackResult,\n RebalanceResult,\n RebalanceStep,\n InvestResult,\n InvestmentPosition,\n PortfolioResult,\n StrategyBuyResult,\n StrategySellResult,\n StrategyRebalanceResult,\n StrategyStatusResult,\n AutoInvestSchedule,\n AutoInvestStatus,\n AutoInvestRunResult,\n ClaimRewardsResult,\n PendingReward,\n} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, DEFAULT_NETWORK, API_BASE_URL, INVESTMENT_ASSETS, GAS_RESERVE_MIN, DEFAULT_MAX_LEVERAGE, DEFAULT_MAX_POSITION_SIZE } from './constants.js';\nimport type { InvestmentAsset } from './constants.js';\n\nconst LOW_LIQUIDITY_ASSETS = new Set(['GOLD']);\n\nconst REWARD_TOKEN_DECIMALS: Record<string, number> = {\n '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT': 9,\n '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP': 6,\n '0x83556891f4a0f233ce7b05cfe7f957d4020492a34f5405b2cb9377d060bef4bf::spring_sui::SPRING_SUI': 9,\n};\nfunction defaultSlippage(asset: string): number {\n return LOW_LIQUIDITY_ASSETS.has(asset) ? 0.05 : 0.03;\n}\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 { PortfolioManager } from './portfolio.js';\nimport { StrategyManager } from './strategy.js';\nimport { AutoInvestManager } from './auto-invest.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 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 readonly portfolio: PortfolioManager;\n readonly strategies: StrategyManager;\n readonly autoInvest: AutoInvestManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string) {\n super();\n this.keypair = keypair;\n this.client = client;\n this._address = getAddress(keypair);\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n this.portfolio = new PortfolioManager(configDir);\n this.strategies = new StrategyManager(configDir);\n this.autoInvest = new AutoInvestManager(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 const cetusAdapter = new CetusAdapter();\n cetusAdapter.initSync(client);\n registry.registerSwap(cetusAdapter);\n const suilendAdapter = new SuilendAdapter();\n suilendAdapter.initSync(client);\n registry.registerLending(suilendAdapter);\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 }> {\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 if (options.sponsored !== false) {\n try {\n await callSponsorApi(address, options.name);\n sponsored = true;\n } catch {\n // Sponsor unavailable — agent can still be funded manually\n }\n }\n\n return { agent, address, sponsored };\n }\n\n // -- Gas --\n\n /** SuiJsonRpcClient used by this agent — exposed for x402 and other integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for x402 and other integrations. */\n get signer(): Ed25519Keypair {\n return this.keypair;\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 if (asset in INVESTMENT_ASSETS) {\n const free = await this.getFreeBalance(asset);\n if (params.amount > free) {\n const pos = this.portfolio.getPosition(asset);\n const invested = pos?.totalAmount ?? 0;\n throw new T2000Error('INVESTMENT_LOCKED',\n `Cannot send ${params.amount} ${asset} — ${invested.toFixed(4)} ${asset} is invested. Free ${asset}: ${free.toFixed(4)}\\nTo access invested funds: t2000 invest sell ${params.amount} ${asset}`,\n { free, invested, requested: params.amount },\n );\n }\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.keypair, () =>\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 const portfolioPositions = this.portfolio.getPositions();\n const earningAssets = new Set(\n portfolioPositions.filter(p => p.earning).map(p => p.asset),\n );\n\n // --- Phase 1: Fetch prices for all investment assets upfront ---\n const suiPrice = bal.gasReserve.sui > 0\n ? bal.gasReserve.usdEquiv / bal.gasReserve.sui\n : 0;\n const assetPrices: Record<string, number> = { SUI: suiPrice };\n const swapAdapter = this.registry.listSwap()[0];\n\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n if (asset === 'SUI') continue;\n try {\n if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', asset, 1);\n assetPrices[asset] = quote.expectedOutput > 0 ? 1 / quote.expectedOutput : 0;\n }\n } catch { assetPrices[asset] = 0; }\n }\n\n // --- Phase 2: Chain-derived total (wallet + protocol supplies - borrows) ---\n // Wallet value: stablecoins + SUI + investment assets (all in USD)\n let chainTotal = bal.available + bal.gasReserve.usdEquiv;\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n if (asset === 'SUI') continue;\n chainTotal += (bal.assets[asset] ?? 0) * (assetPrices[asset] ?? 0);\n }\n\n // Protocol positions: adapters return amounts in asset units.\n // Stablecoins are ~1:1 USD. Non-stablecoins are approximate until\n // adapters return proper USD values.\n try {\n const positions = await this.positions();\n for (const pos of positions.positions) {\n if (pos.type === 'save') {\n chainTotal += pos.amount;\n if (!earningAssets.has(pos.asset)) {\n bal.savings += pos.amount;\n }\n } else if (pos.type === 'borrow') {\n chainTotal -= pos.amount;\n bal.debt += pos.amount;\n }\n }\n } catch {\n // Protocol unavailable — chain total limited to wallet\n }\n\n // --- Phase 3: Investment P&L breakdown (display only, does not affect total) ---\n try {\n const trackedAmounts: Record<string, number> = {};\n const trackedCostBasis: Record<string, number> = {};\n const earningAssetSet = new Set<string>();\n\n for (const pos of portfolioPositions) {\n if (!(pos.asset in INVESTMENT_ASSETS)) continue;\n trackedAmounts[pos.asset] = (trackedAmounts[pos.asset] ?? 0) + pos.totalAmount;\n trackedCostBasis[pos.asset] = (trackedCostBasis[pos.asset] ?? 0) + pos.costBasis;\n if (pos.earning) earningAssetSet.add(pos.asset);\n }\n for (const key of this.portfolio.getAllStrategyKeys()) {\n for (const sp of this.portfolio.getStrategyPositions(key)) {\n if (!(sp.asset in INVESTMENT_ASSETS)) continue;\n trackedAmounts[sp.asset] = (trackedAmounts[sp.asset] ?? 0) + sp.totalAmount;\n trackedCostBasis[sp.asset] = (trackedCostBasis[sp.asset] ?? 0) + sp.costBasis;\n }\n }\n\n let investmentValue = 0;\n let investmentCostBasis = 0;\n let trackedValue = 0;\n\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n const price = assetPrices[asset] ?? 0;\n const tracked = trackedAmounts[asset] ?? 0;\n const costBasis = trackedCostBasis[asset] ?? 0;\n\n if (asset === 'SUI') {\n const actualSui = earningAssetSet.has('SUI') ? tracked : Math.min(tracked, bal.gasReserve.sui);\n investmentValue += actualSui * price;\n trackedValue += actualSui * price;\n if (actualSui < tracked && tracked > 0) {\n investmentCostBasis += costBasis * (actualSui / tracked);\n } else {\n investmentCostBasis += costBasis;\n }\n if (!earningAssetSet.has('SUI')) {\n const gasSui = Math.max(0, bal.gasReserve.sui - tracked);\n bal.gasReserve = { sui: gasSui, usdEquiv: gasSui * price };\n }\n } else {\n const onChainAmount = bal.assets[asset] ?? 0;\n const effectiveAmount = Math.max(tracked, onChainAmount);\n investmentValue += effectiveAmount * price;\n trackedValue += tracked * price;\n investmentCostBasis += costBasis;\n }\n }\n\n bal.investment = investmentValue;\n bal.investmentPnL = trackedValue - investmentCostBasis;\n } catch {\n bal.investment = 0;\n bal.investmentPnL = 0;\n }\n\n // --- Phase 4: Pending rewards ---\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 // Total is chain-derived — always accurate regardless of categorization\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 deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'Sui (mainnet)',\n supportedAssets: ['USDC'],\n instructions: [\n `Send USDC on Sui to: ${this._address}`,\n '',\n 'From a CEX (Coinbase, Binance):',\n ` 1. Withdraw USDC`,\n ` 2. Select \"Sui\" network`,\n ` 3. Paste address: ${truncateAddress(this._address)}`,\n '',\n 'From another Sui wallet:',\n ` Transfer USDC to ${truncateAddress(this._address)}`,\n ].join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n async registerAdapter(adapter: LendingAdapter | SwapAdapter): Promise<void> {\n await adapter.init(this.client);\n if ('buildSaveTx' in adapter) this.registry.registerLending(adapter as LendingAdapter);\n if ('buildSwapTx' in adapter) this.registry.registerSwap(adapter as SwapAdapter);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; protocol?: string }): Promise<SaveResult> {\n this.enforcer.assertNotLocked();\n const asset = 'USDC';\n const bal = await queryBalance(this.client, this._address);\n const usdcBalance = bal.stables.USDC ?? 0;\n\n const needsAutoConvert =\n params.amount === 'all'\n ? Object.entries(bal.stables).some(([k, v]) => k !== 'USDC' && v > 0.01)\n : typeof params.amount === 'number' && params.amount > usdcBalance;\n\n let amount: number;\n if (params.amount === 'all') {\n amount = (bal.available ?? 0) - 1.0;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'Balance too low to save after $1 gas reserve', {\n reason: 'gas_reserve_required', available: bal.available ?? 0,\n });\n }\n } else {\n amount = params.amount;\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 swapAdapter = this.registry.listSwap()[0];\n const canPTB = adapter.addSaveToTx && (!needsAutoConvert || swapAdapter?.addSwapToTx);\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB && needsAutoConvert) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const usdcCoins: TransactionObjectArgument[] = [];\n\n // Swap non-USDC stables → USDC within the same PTB\n for (const [stableAsset, stableAmount] of Object.entries(bal.stables)) {\n if (stableAsset === 'USDC' || stableAmount <= 0.01) continue;\n const assetInfo = SUPPORTED_ASSETS[stableAsset as keyof typeof SUPPORTED_ASSETS];\n if (!assetInfo) continue;\n\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) continue;\n\n const merged = this._mergeCoinsInTx(tx, coins);\n const { outputCoin } = await swapAdapter!.addSwapToTx!(\n tx, this._address, merged, stableAsset, 'USDC', stableAmount,\n );\n usdcCoins.push(outputCoin);\n }\n\n // Add existing wallet USDC\n const existingUsdc = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (existingUsdc.length > 0) {\n usdcCoins.push(this._mergeCoinsInTx(tx, existingUsdc));\n }\n\n // Merge all USDC into one coin\n if (usdcCoins.length > 1) {\n tx.mergeCoins(usdcCoins[0], usdcCoins.slice(1));\n }\n\n await adapter.addSaveToTx!(tx, this._address, usdcCoins[0], asset, { collectFee: true });\n return tx;\n }\n\n if (canPTB && !needsAutoConvert) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const existingUsdc = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (existingUsdc.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n\n const merged = this._mergeCoinsInTx(tx, existingUsdc);\n const rawAmount = BigInt(Math.floor(saveAmount * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n const [depositCoin] = tx.splitCoins(merged, [rawAmount]);\n await adapter.addSaveToTx!(tx, this._address, depositCoin, asset, { collectFee: true });\n return tx;\n }\n\n // Fallback: non-composable path\n if (needsAutoConvert) {\n await this._convertWalletStablesToUsdc(bal, params.amount === 'all' ? undefined : amount - usdcBalance);\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 try {\n const positions = await this.positions();\n savingsBalance = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n } catch {\n // query failed — fall back to deposit amount\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'; protocol?: string }): Promise<WithdrawResult> {\n this.enforcer.assertNotLocked();\n if (params.amount === 'all' && !params.protocol) {\n return this.withdrawAllProtocols();\n }\n\n // Find the actual position to withdraw from (may be non-USDC after rebalance).\n // Exclude assets tracked as earning in portfolio (managed via invest unearn).\n const allPositions = await this.registry.allPositions(this._address);\n const earningAssets = new Set(\n this.portfolio.getPositions().filter(p => p.earning).map(p => p.asset),\n );\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 && !earningAssets.has(s.asset)) {\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', 'No savings to withdraw');\n }\n\n // Prefer USDC positions to avoid unnecessary swaps, then lowest-APY first\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 swapAdapter = target.asset !== 'USDC' ? this.registry.listSwap()[0] : undefined;\n const canPTB = adapter.addWithdrawToTx && (!swapAdapter || swapAdapter.addSwapToTx);\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB) {\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\n if (target.asset !== 'USDC' && swapAdapter?.addSwapToTx) {\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx(\n tx, this._address, coin, target.asset, 'USDC', effectiveAmount, 500,\n );\n finalAmount = estimatedOut / 10 ** toDecimals;\n tx.transferObjects([outputCoin], this._address);\n } else {\n tx.transferObjects([coin], this._address);\n }\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('USDC', finalAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: finalAmount,\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 // Skip positions that are investment-earning (managed via invest sell/unearn)\n const earningAssets = new Set(\n this.portfolio.getPositions().filter(p => p.earning).map(p => p.asset),\n );\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 && !earningAssets.has(supply.asset)) {\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 // Pre-check maxWithdraw per protocol, then distribute across entries\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 const DUST_SWAP_THRESHOLD = 1.0;\n const swappableEntries = entries.filter(e => e.asset === 'USDC' || e.maxAmount >= DUST_SWAP_THRESHOLD);\n const dustEntries = entries.filter(e => e.asset !== 'USDC' && e.maxAmount < DUST_SWAP_THRESHOLD);\n const hasNonUsdc = swappableEntries.some(e => e.asset !== 'USDC');\n const swapAdapter = hasNonUsdc ? this.registry.listSwap()[0] : undefined;\n const canPTB = swappableEntries.every(e => e.adapter.addWithdrawToTx) && (!swapAdapter || swapAdapter.addSwapToTx);\n\n let totalUsdcReceived = 0;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const usdcCoins: TransactionObjectArgument[] = [];\n\n for (const entry of swappableEntries) {\n const { coin, effectiveAmount } = await entry.adapter.addWithdrawToTx!(\n tx, this._address, entry.maxAmount, entry.asset,\n );\n\n if (entry.asset === 'USDC') {\n totalUsdcReceived += effectiveAmount;\n usdcCoins.push(coin);\n } else if (swapAdapter?.addSwapToTx) {\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx(\n tx, this._address, coin, entry.asset, 'USDC', effectiveAmount, 500,\n );\n totalUsdcReceived += estimatedOut / 10 ** toDecimals;\n usdcCoins.push(outputCoin);\n } else {\n totalUsdcReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n }\n\n for (const dust of dustEntries) {\n if (dust.adapter.addWithdrawToTx) {\n const { coin, effectiveAmount } = await dust.adapter.addWithdrawToTx!(\n tx, this._address, dust.maxAmount, dust.asset,\n );\n totalUsdcReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n }\n\n if (usdcCoins.length > 1) {\n tx.mergeCoins(usdcCoins[0], usdcCoins.slice(1));\n }\n if (usdcCoins.length > 0) {\n tx.transferObjects([usdcCoins[0]], this._address);\n }\n return tx;\n }\n\n // Fallback: sequential withdraw + swap per entry\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 totalUsdcReceived += built.effectiveAmount;\n lastTx = built.tx;\n }\n if (hasNonUsdc && swapAdapter) {\n await this._convertWalletStablesToUsdc(await queryBalance(this.client, this._address));\n }\n return lastTx!;\n });\n\n if (totalUsdcReceived <= 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: totalUsdcReceived,\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 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 async _swapToUsdc(asset: string, amount: number): Promise<{ usdcReceived: number; digest: string; gasCost: number }> {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n\n let estimatedOut = 0;\n let toDecimals = 6;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await swapAdapter.buildSwapTx(this._address, asset, 'USDC', amount);\n estimatedOut = built.estimatedOut;\n toDecimals = built.toDecimals;\n return built.tx;\n });\n\n const usdcReceived = estimatedOut / 10 ** toDecimals;\n return { usdcReceived, digest: gasResult.digest, gasCost: gasResult.gasCostSui };\n }\n\n private async _swapFromUsdc(toAsset: string, amount: number): Promise<{ received: number; digest: string; gasCost: number }> {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n\n let estimatedOut = 0;\n let toDecimals = 6;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await swapAdapter.buildSwapTx(this._address, 'USDC', toAsset, amount);\n estimatedOut = built.estimatedOut;\n toDecimals = built.toDecimals;\n return built.tx;\n });\n\n const received = estimatedOut / 10 ** toDecimals;\n return { received, digest: gasResult.digest, gasCost: gasResult.gasCostSui };\n }\n\n private async _convertWalletStablesToUsdc(bal: BalanceResponse, amountNeeded?: number): Promise<void> {\n const nonUsdcStables: Array<{ asset: string; amount: number }> = [];\n for (const [asset, amount] of Object.entries(bal.stables)) {\n if (asset !== 'USDC' && amount > 0.01) {\n nonUsdcStables.push({ asset, amount });\n }\n }\n if (nonUsdcStables.length === 0) return;\n\n // Sort largest balance first for efficiency\n nonUsdcStables.sort((a, b) => b.amount - a.amount);\n\n let converted = 0;\n for (const entry of nonUsdcStables) {\n if (amountNeeded !== undefined && converted >= amountNeeded) break;\n try {\n await this._swapToUsdc(entry.asset, entry.amount);\n converted += entry.amount;\n } catch {\n // Skip this asset if swap fails, continue with others\n }\n }\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 private async adjustMaxBorrowForInvestments(\n adapter: import('./adapters/types.js').LendingAdapter,\n maxResult: MaxBorrowResult,\n ): Promise<MaxBorrowResult> {\n const earningPositions = this.portfolio.getPositions().filter(p => p.earning);\n if (earningPositions.length === 0) return maxResult;\n\n let investmentCollateralUsd = 0;\n const swapAdapter = this.registry.listSwap()[0];\n\n for (const pos of earningPositions) {\n if (pos.earningProtocol !== adapter.id) continue;\n try {\n let price = 0;\n if (pos.asset === 'SUI' && swapAdapter) {\n price = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', pos.asset, 1);\n price = quote.expectedOutput > 0 ? 1 / quote.expectedOutput : 0;\n }\n investmentCollateralUsd += pos.totalAmount * price;\n } catch { /* keep zero */ }\n }\n\n if (investmentCollateralUsd <= 0) return maxResult;\n\n const CONSERVATIVE_LTV = 0.60;\n const investmentBorrowCapacity = investmentCollateralUsd * CONSERVATIVE_LTV;\n const adjustedMax = Math.max(0, maxResult.maxAmount - investmentBorrowCapacity);\n\n return { ...maxResult, maxAmount: adjustedMax };\n }\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 rawMax = await adapter.maxBorrow(this._address, asset);\n const maxResult = await this.adjustMaxBorrowForInvestments(adapter, rawMax);\n if (maxResult.maxAmount <= 0) {\n const hasInvestmentEarning = this.portfolio.getPositions().some(p => p.earning && p.earningProtocol === adapter.id);\n if (hasInvestmentEarning) {\n throw new T2000Error('BORROW_GUARD_INVESTMENT',\n 'Max safe borrow: $0.00. Only savings deposits (stablecoins) count as borrowable collateral. Investment collateral (SUI, ETH, BTC) is excluded.');\n }\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.keypair, 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 // Find actual borrows (may be non-USDC from rebalance or legacy)\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 // Repay highest-interest borrow first\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 const swapAdapter = target.asset !== 'USDC' ? this.registry.listSwap()[0] : undefined;\n const canPTB = adapter.addRepayToTx && (!swapAdapter || swapAdapter.addSwapToTx);\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB && target.asset !== 'USDC' && swapAdapter?.addSwapToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const buffer = repayAmount * 1.005;\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (usdcCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins for swap');\n const merged = this._mergeCoinsInTx(tx, usdcCoins);\n const rawSwap = BigInt(Math.floor(buffer * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n const [splitCoin] = tx.splitCoins(merged, [rawSwap]);\n\n const { outputCoin } = await swapAdapter.addSwapToTx(\n tx, this._address, splitCoin, 'USDC', target.asset, buffer,\n );\n\n await adapter.addRepayToTx!(tx, this._address, outputCoin, target.asset);\n return tx;\n }\n\n if (canPTB && target.asset === 'USDC') {\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 // Fallback: multi-tx\n if (target.asset !== 'USDC') {\n await this._swapFromUsdc(target.asset, repayAmount * 1.005);\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 swapAdapter = this.registry.listSwap()[0];\n const canPTB = entries.every(e => e.adapter.addRepayToTx) &&\n (entries.every(e => e.borrow.asset === 'USDC') || swapAdapter?.addSwapToTx);\n\n let totalRepaid = 0;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n // Pre-fetch USDC coins for any swaps or direct repays\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 if (borrow.asset !== 'USDC' && swapAdapter?.addSwapToTx) {\n const buffer = borrow.amount * 1.005;\n const rawSwap = BigInt(Math.floor(buffer * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n if (!usdcMerged) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC for swap');\n const [splitCoin] = tx.splitCoins(usdcMerged, [rawSwap]);\n\n const { outputCoin } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoin, 'USDC', borrow.asset, buffer,\n );\n await adapter.addRepayToTx!(tx, this._address, outputCoin, borrow.asset);\n } else {\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 }\n totalRepaid += borrow.amount;\n }\n\n return tx;\n }\n\n // Fallback: multi-tx\n let lastTx: Transaction | undefined;\n for (const { borrow, adapter } of entries) {\n if (borrow.asset !== 'USDC') {\n await this._swapFromUsdc(borrow.asset, borrow.amount * 1.005);\n }\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 const rawMax = await adapter.maxBorrow(this._address, 'USDC');\n return this.adjustMaxBorrowForInvestments(adapter, rawMax);\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 // -- Exchange --\n\n async exchange(params: { from: string; to: string; amount: number; maxSlippage?: number; _bypassInvestmentGuard?: boolean }): Promise<SwapResult> {\n this.enforcer.assertNotLocked();\n const fromAsset = params.from as keyof typeof SUPPORTED_ASSETS;\n const toAsset = params.to as keyof typeof SUPPORTED_ASSETS;\n\n if (!(fromAsset in SUPPORTED_ASSETS) || !(toAsset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n if (fromAsset === toAsset) {\n throw new T2000Error('INVALID_AMOUNT', 'Cannot swap same asset');\n }\n\n if (!params._bypassInvestmentGuard && fromAsset in INVESTMENT_ASSETS) {\n const free = await this.getFreeBalance(fromAsset);\n if (params.amount > free) {\n const pos = this.portfolio.getPosition(fromAsset);\n const invested = pos?.totalAmount ?? 0;\n throw new T2000Error('INVESTMENT_LOCKED',\n `Cannot exchange ${params.amount} ${fromAsset} — ${invested.toFixed(4)} ${fromAsset} is invested. Free ${fromAsset}: ${free.toFixed(4)}\\nTo sell investment: t2000 invest sell ${params.amount} ${fromAsset}`,\n { free, invested, requested: params.amount },\n );\n }\n }\n\n const best = await this.registry.bestSwapQuote(fromAsset, toAsset, params.amount);\n const adapter = best.adapter;\n\n const fee = calculateFee('swap', params.amount);\n const swapAmount = params.amount;\n const slippageBps = params.maxSlippage ? params.maxSlippage * 100 : undefined;\n\n let swapMeta: { estimatedOut: number; toDecimals: number } = { estimatedOut: 0, toDecimals: 0 };\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await adapter.buildSwapTx(this._address, fromAsset, toAsset, swapAmount, slippageBps);\n swapMeta = { estimatedOut: built.estimatedOut, toDecimals: built.toDecimals };\n return built.tx;\n });\n\n const toInfo = SUPPORTED_ASSETS[toAsset];\n await this.client.waitForTransaction({ digest: gasResult.digest });\n const txDetail = await this.client.getTransactionBlock({\n digest: gasResult.digest,\n options: { showBalanceChanges: true },\n });\n\n let actualReceived = 0;\n if (txDetail.balanceChanges) {\n for (const change of txDetail.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === this._address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = swapMeta.estimatedOut / 10 ** swapMeta.toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n reportFee(this._address, 'swap', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(fromAsset, swapAmount, 'swap', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n fromAmount: swapAmount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async exchangeQuote(params: { from: string; to: string; amount: number }): Promise<{\n expectedOutput: number;\n priceImpact: number;\n poolPrice: number;\n fee: { amount: number; rate: number };\n }> {\n const fromAsset = params.from;\n const toAsset = params.to;\n const best = await this.registry.bestSwapQuote(fromAsset, toAsset, params.amount);\n const fee = calculateFee('swap', params.amount);\n return { ...best.quote, fee: { amount: fee.amount, rate: fee.rate } };\n }\n\n // -- Investment --\n\n async investBuy(params: { asset: InvestmentAsset; usdAmount: number; maxSlippage?: number }): Promise<InvestResult> {\n this.enforcer.assertNotLocked();\n\n if (!params.usdAmount || params.usdAmount <= 0 || !isFinite(params.usdAmount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Investment amount must be greater than $0');\n }\n\n this.enforcer.check({ operation: 'invest', amount: params.usdAmount });\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const bal = await queryBalance(this.client, this._address);\n if (bal.available < params.usdAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient checking balance. Available: $${bal.available.toFixed(2)}, requested: $${params.usdAmount.toFixed(2)}`);\n }\n\n let swapResult: Awaited<ReturnType<typeof this.exchange>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.exchange({\n from: 'USDC',\n to: params.asset,\n amount: params.usdAmount,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\n _bypassInvestmentGuard: true,\n });\n break;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const isSlippage = msg.includes('slippage') || msg.includes('amount_out_slippage');\n if (isSlippage && attempt < maxRetries) {\n await new Promise(r => setTimeout(r, 2000 * (attempt + 1)));\n continue;\n }\n throw err;\n }\n }\n\n if (swapResult.toAmount === 0) {\n throw new T2000Error('SWAP_FAILED', 'Swap returned zero tokens — try a different amount or check liquidity');\n }\n\n const price = params.usdAmount / swapResult.toAmount;\n\n this.portfolio.recordBuy({\n id: `inv_${Date.now()}`,\n type: 'buy',\n asset: params.asset,\n amount: swapResult.toAmount,\n price,\n usdValue: params.usdAmount,\n fee: swapResult.fee,\n tx: swapResult.tx,\n timestamp: new Date().toISOString(),\n });\n\n const pos = this.portfolio.getPosition(params.asset);\n const currentPrice = price;\n const position: InvestmentPosition = {\n asset: params.asset,\n totalAmount: pos?.totalAmount ?? swapResult.toAmount,\n costBasis: pos?.costBasis ?? params.usdAmount,\n avgPrice: pos?.avgPrice ?? price,\n currentPrice,\n currentValue: (pos?.totalAmount ?? swapResult.toAmount) * currentPrice,\n unrealizedPnL: 0,\n unrealizedPnLPct: 0,\n trades: pos?.trades ?? [],\n };\n\n return {\n success: true,\n tx: swapResult.tx,\n type: 'buy',\n asset: params.asset,\n amount: swapResult.toAmount,\n price,\n usdValue: params.usdAmount,\n fee: swapResult.fee,\n gasCost: swapResult.gasCost,\n gasMethod: swapResult.gasMethod,\n position,\n };\n }\n\n async investSell(params: { asset: InvestmentAsset; usdAmount: number | 'all'; maxSlippage?: number; _strategyOnly?: boolean }): Promise<InvestResult> {\n this.enforcer.assertNotLocked();\n\n if (params.usdAmount !== 'all') {\n if (!params.usdAmount || params.usdAmount <= 0 || !isFinite(params.usdAmount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Sell amount must be greater than $0');\n }\n }\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const pos = this.portfolio.getPosition(params.asset);\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${params.asset} position to sell`);\n }\n\n const didAutoWithdraw = !!(pos.earning && pos.earningProtocol);\n if (didAutoWithdraw) {\n const unearnResult = await this.investUnearn({ asset: params.asset });\n if (unearnResult.tx) {\n await this.client.waitForTransaction({ digest: unearnResult.tx, options: { showEffects: true } });\n }\n }\n\n const assetInfo = SUPPORTED_ASSETS[params.asset as keyof typeof SUPPORTED_ASSETS];\n const gasReserve = params.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n\n let walletAmount = 0;\n for (let attempt = 0; ; attempt++) {\n const assetBalance = await this.client.getBalance({\n owner: this._address,\n coinType: assetInfo.type,\n });\n walletAmount = Number(assetBalance.totalBalance) / (10 ** assetInfo.decimals);\n if (!didAutoWithdraw || walletAmount > gasReserve || attempt >= 5) break;\n await new Promise(r => setTimeout(r, 1500));\n }\n\n const maxSellable = Math.max(0, walletAmount - gasReserve);\n\n let sellAmountAsset: number;\n if (params.usdAmount === 'all') {\n sellAmountAsset = Math.min(pos.totalAmount, maxSellable);\n } else {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n const quote = await swapAdapter.getQuote('USDC', params.asset, 1);\n const assetPrice = 1 / quote.expectedOutput;\n sellAmountAsset = params.usdAmount / assetPrice;\n // For strategy sells, cap to wallet balance; for direct sells, cap to tracked position\n const maxPosition = params._strategyOnly ? maxSellable : pos.totalAmount;\n sellAmountAsset = Math.min(sellAmountAsset, maxPosition);\n if (sellAmountAsset > maxSellable) {\n throw new T2000Error(\n 'INSUFFICIENT_INVESTMENT',\n `Cannot sell $${params.usdAmount.toFixed(2)} — max sellable: $${(maxSellable * assetPrice).toFixed(2)} (gas reserve: ${gasReserve} ${params.asset})`,\n );\n }\n }\n\n if (sellAmountAsset <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', 'Nothing to sell after gas reserve');\n }\n\n let swapResult: Awaited<ReturnType<typeof this.exchange>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.exchange({\n from: params.asset,\n to: 'USDC',\n amount: sellAmountAsset,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\n _bypassInvestmentGuard: true,\n });\n break;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const isSlippage = msg.includes('slippage') || msg.includes('amount_out_slippage');\n if (isSlippage && attempt < maxRetries) {\n await new Promise(r => setTimeout(r, 2000 * (attempt + 1)));\n continue;\n }\n throw err;\n }\n }\n\n const price = swapResult.toAmount / sellAmountAsset;\n\n const realizedPnL = this.portfolio.recordSell({\n id: `inv_${Date.now()}`,\n type: 'sell',\n asset: params.asset,\n amount: sellAmountAsset,\n price,\n usdValue: swapResult.toAmount,\n fee: swapResult.fee,\n tx: swapResult.tx,\n timestamp: new Date().toISOString(),\n });\n\n if (params.usdAmount === 'all' && !params._strategyOnly) {\n this.portfolio.closePosition(params.asset);\n }\n\n const updatedPos = this.portfolio.getPosition(params.asset);\n const position: InvestmentPosition = {\n asset: params.asset,\n totalAmount: updatedPos?.totalAmount ?? 0,\n costBasis: updatedPos?.costBasis ?? 0,\n avgPrice: updatedPos?.avgPrice ?? 0,\n currentPrice: price,\n currentValue: (updatedPos?.totalAmount ?? 0) * price,\n unrealizedPnL: 0,\n unrealizedPnLPct: 0,\n trades: updatedPos?.trades ?? [],\n };\n\n return {\n success: true,\n tx: swapResult.tx,\n type: 'sell',\n asset: params.asset,\n amount: sellAmountAsset,\n price,\n usdValue: swapResult.toAmount,\n fee: swapResult.fee,\n gasCost: swapResult.gasCost,\n gasMethod: swapResult.gasMethod,\n realizedPnL,\n position,\n };\n }\n\n async investEarn(params: { asset: InvestmentAsset; protocol?: string }): Promise<import('./types.js').InvestEarnResult> {\n this.enforcer.assertNotLocked();\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const pos = this.portfolio.getPosition(params.asset);\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${params.asset} position to earn on`);\n }\n\n const assetInfo = SUPPORTED_ASSETS[params.asset as keyof typeof SUPPORTED_ASSETS];\n const assetBalance = await this.client.getBalance({\n owner: this._address,\n coinType: assetInfo.type,\n });\n const walletAmount = Number(assetBalance.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = params.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const depositAmount = Math.min(pos.totalAmount, Math.max(0, walletAmount - gasReserve));\n\n if (pos.earning && depositAmount <= 0) {\n return {\n success: true,\n tx: '',\n asset: params.asset,\n amount: 0,\n protocol: pos.earningProtocol ?? 'unknown',\n apy: pos.earningApy ?? 0,\n gasCost: 0,\n gasMethod: 'none',\n };\n }\n if (depositAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${params.asset} available to deposit (wallet: ${walletAmount}, gas reserve: ${gasReserve})`);\n }\n\n let adapter: import('./adapters/types.js').LendingAdapter;\n let rate: import('./adapters/types.js').LendingRates;\n\n if (params.protocol) {\n const specific = this.registry.getLending(params.protocol);\n if (!specific) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${params.protocol} not found`);\n adapter = specific;\n rate = await specific.getRates(params.asset);\n } else {\n ({ adapter, rate } = await this.registry.bestSaveRate(params.asset));\n }\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const { tx } = await adapter.buildSaveTx(this._address, depositAmount, params.asset);\n return tx;\n });\n\n this.portfolio.recordEarn(params.asset, adapter.id, rate.saveApy);\n\n return {\n success: true,\n tx: gasResult.digest,\n asset: params.asset,\n amount: depositAmount,\n protocol: adapter.name,\n apy: rate.saveApy,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async investUnearn(params: { asset: InvestmentAsset }): Promise<import('./types.js').InvestEarnResult> {\n this.enforcer.assertNotLocked();\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const pos = this.portfolio.getPosition(params.asset);\n if (!pos || !pos.earning || !pos.earningProtocol) {\n throw new T2000Error('INVEST_NOT_EARNING', `${params.asset} is not currently earning`);\n }\n\n const adapter = this.registry.getLending(pos.earningProtocol);\n if (!adapter) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Lending protocol ${pos.earningProtocol} not found`);\n }\n\n // Withdraw only the tracked investment amount, not the entire protocol position\n // (the protocol may hold more from regular savings or previous runs)\n const withdrawAmount = pos.totalAmount;\n\n const protocolName = adapter.name;\n let effectiveAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const result = await adapter.buildWithdrawTx(this._address, withdrawAmount, params.asset);\n effectiveAmount = result.effectiveAmount;\n return result.tx;\n });\n\n this.portfolio.recordUnearn(params.asset);\n\n return {\n success: true,\n tx: gasResult.digest,\n asset: params.asset,\n amount: effectiveAmount,\n protocol: protocolName,\n apy: 0,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n // -- Invest Rebalance --\n\n async investRebalance(opts: { dryRun?: boolean; minYieldDiff?: number } = {}): Promise<import('./types.js').InvestRebalanceResult> {\n this.enforcer.assertNotLocked();\n\n const minDiff = opts.minYieldDiff ?? 0.1;\n const positions = this.portfolio.getPositions().filter((p) => p.earning && p.earningProtocol);\n\n if (positions.length === 0) {\n return { executed: false, moves: [], totalGasCost: 0, skipped: [] };\n }\n\n const moves: import('./types.js').InvestRebalanceMove[] = [];\n const skipped: import('./types.js').InvestRebalanceResult['skipped'] = [];\n let totalGasCost = 0;\n\n for (const pos of positions) {\n const currentProtocol = pos.earningProtocol!;\n\n let best: { adapter: import('./adapters/types.js').LendingAdapter; rate: import('./adapters/types.js').LendingRates };\n try {\n best = await this.registry.bestSaveRate(pos.asset);\n } catch {\n const currentApy = pos.earningApy ?? 0;\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: currentApy, reason: 'no_rates' });\n continue;\n }\n\n // Use live rate for current protocol instead of stale stored rate\n let currentApy = pos.earningApy ?? 0;\n try {\n const currentAdapter = this.registry.getLending(currentProtocol);\n if (currentAdapter) {\n const liveRate = await currentAdapter.getRates(pos.asset);\n currentApy = liveRate.saveApy;\n }\n } catch { /* fall back to stored rate */ }\n\n const apyGain = best.rate.saveApy - currentApy;\n\n if (best.adapter.id === currentProtocol || apyGain <= 0) {\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: 'already_best' });\n continue;\n }\n\n if (apyGain < minDiff) {\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: 'below_threshold' });\n continue;\n }\n\n if (opts.dryRun) {\n moves.push({\n asset: pos.asset,\n fromProtocol: this.registry.getLending(currentProtocol)?.name ?? currentProtocol,\n toProtocol: best.adapter.name,\n amount: pos.totalAmount,\n oldApy: currentApy,\n newApy: best.rate.saveApy,\n txDigests: [],\n gasCost: 0,\n });\n continue;\n }\n\n const txDigests: string[] = [];\n let moveGasCost = 0;\n\n const fromAdapter = this.registry.getLending(currentProtocol);\n if (!fromAdapter) {\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: 'protocol_unavailable' });\n continue;\n }\n\n const withdrawResult = await executeWithGas(this.client, this.keypair, async () => {\n const result = await fromAdapter.buildWithdrawTx(this._address, pos.totalAmount, pos.asset);\n return result.tx;\n });\n txDigests.push(withdrawResult.digest);\n moveGasCost += withdrawResult.gasCostSui;\n\n const depositResult = await executeWithGas(this.client, this.keypair, async () => {\n const assetInfo = SUPPORTED_ASSETS[pos.asset as keyof typeof SUPPORTED_ASSETS];\n const balance = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const available = Number(balance.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = pos.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const depositAmount = Math.max(0, available - gasReserve);\n const { tx } = await best.adapter.buildSaveTx(this._address, depositAmount, pos.asset);\n return tx;\n });\n txDigests.push(depositResult.digest);\n moveGasCost += depositResult.gasCostSui;\n\n this.portfolio.recordUnearn(pos.asset);\n this.portfolio.recordEarn(pos.asset, best.adapter.id, best.rate.saveApy);\n\n moves.push({\n asset: pos.asset,\n fromProtocol: fromAdapter.name,\n toProtocol: best.adapter.name,\n amount: pos.totalAmount,\n oldApy: currentApy,\n newApy: best.rate.saveApy,\n txDigests,\n gasCost: moveGasCost,\n });\n totalGasCost += moveGasCost;\n }\n\n return { executed: !opts.dryRun && moves.length > 0, moves, totalGasCost, skipped };\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\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, usdcReceived: 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, usdcReceived: 0, gasCost: 0, gasMethod: 'none' };\n }\n\n const claimResult = await executeWithGas(this.client, this.keypair, async () => tx);\n await this.client.waitForTransaction({ digest: claimResult.digest });\n\n const usdcReceived = await this.swapRewardTokensToUsdc(allRewards);\n\n return {\n success: true,\n tx: claimResult.digest,\n rewards: allRewards,\n totalValueUsd: usdcReceived,\n usdcReceived,\n gasCost: claimResult.gasCostSui,\n gasMethod: claimResult.gasMethod,\n };\n }\n\n private async swapRewardTokensToUsdc(rewards: PendingReward[]): Promise<number> {\n const uniqueTokens = [...new Set(rewards.map(r => r.coinType))];\n const usdcType = SUPPORTED_ASSETS.USDC.type;\n const usdcDecimals = SUPPORTED_ASSETS.USDC.decimals;\n let totalUsdc = 0;\n\n for (const coinType of uniqueTokens) {\n try {\n const balResult = await this.client.getBalance({\n owner: this._address,\n coinType,\n });\n const rawBalance = BigInt(balResult.totalBalance);\n if (rawBalance <= 0n) continue;\n\n const decimals = REWARD_TOKEN_DECIMALS[coinType] ?? 9;\n\n const swapResult = await buildRawSwapTx({\n client: this.client,\n address: this._address,\n fromCoinType: coinType,\n fromDecimals: decimals,\n toCoinType: usdcType,\n toDecimals: usdcDecimals,\n amount: rawBalance,\n });\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => swapResult.tx);\n await this.client.waitForTransaction({ digest: gasResult.digest });\n\n totalUsdc += swapResult.estimatedOut / 10 ** usdcDecimals;\n } catch {\n // If swap fails for a token (e.g. no liquidity), skip it\n }\n }\n\n return totalUsdc;\n }\n\n // -- Strategies --\n\n async investStrategy(params: { strategy: string; usdAmount: number; dryRun?: boolean }): Promise<StrategyBuyResult> {\n this.enforcer.assertNotLocked();\n const definition = this.strategies.get(params.strategy);\n this.strategies.validateMinAmount(definition.allocations, params.usdAmount);\n\n if (!params.usdAmount || params.usdAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Strategy investment must be > $0');\n }\n\n this.enforcer.check({ operation: 'invest', amount: params.usdAmount });\n\n const bal = await queryBalance(this.client, this._address);\n if (bal.available < params.usdAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance. Available: $${bal.available.toFixed(2)}, requested: $${params.usdAmount.toFixed(2)}`);\n }\n\n const buys: StrategyBuyResult['buys'] = [];\n const allocEntries = Object.entries(definition.allocations);\n\n if (params.dryRun) {\n const swapAdapter = this.registry.listSwap()[0];\n for (const [asset, pct] of allocEntries) {\n const assetUsd = params.usdAmount * (pct / 100);\n let estAmount = 0;\n let estPrice = 0;\n try {\n if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', asset, assetUsd);\n estAmount = quote.expectedOutput;\n estPrice = assetUsd / estAmount;\n }\n } catch { /* price unavailable */ }\n buys.push({ asset, usdAmount: assetUsd, amount: estAmount, price: estPrice, tx: '' });\n }\n return { success: true, strategy: params.strategy, totalInvested: params.usdAmount, buys, gasCost: 0, gasMethod: 'self-funded' };\n }\n\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter?.addSwapToTx) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Swap adapter does not support composable PTB');\n }\n\n let swapMetas: Array<{ asset: string; usdAmount: number; estimatedOut: number; toDecimals: number }> = [];\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n swapMetas = [];\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (usdcCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n const mergedUsdc = this._mergeCoinsInTx(tx, usdcCoins);\n\n const splitAmounts = allocEntries.map(([, pct]) =>\n BigInt(Math.floor(params.usdAmount * (pct / 100) * 10 ** SUPPORTED_ASSETS.USDC.decimals)),\n );\n\n const splitCoins = tx.splitCoins(mergedUsdc, splitAmounts);\n const outputCoins: TransactionObjectArgument[] = [];\n\n for (let i = 0; i < allocEntries.length; i++) {\n const [asset] = allocEntries[i];\n const assetUsd = params.usdAmount * (allocEntries[i][1] / 100);\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoins[i], 'USDC', asset, assetUsd,\n );\n\n outputCoins.push(outputCoin);\n swapMetas.push({ asset, usdAmount: assetUsd, estimatedOut, toDecimals });\n }\n\n tx.transferObjects(outputCoins, this._address);\n return tx;\n });\n\n const digest = gasResult.digest;\n const now = new Date().toISOString();\n\n for (const meta of swapMetas) {\n const amount = meta.estimatedOut / (10 ** meta.toDecimals);\n const price = meta.usdAmount / amount;\n\n this.portfolio.recordBuy({\n id: `inv_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n this.portfolio.recordStrategyBuy(params.strategy, {\n id: `strat_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n buys.push({ asset: meta.asset, usdAmount: meta.usdAmount, amount, price, tx: digest });\n }\n\n return {\n success: true,\n strategy: params.strategy,\n totalInvested: params.usdAmount,\n buys,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async sellStrategy(params: { strategy: string }): Promise<StrategySellResult> {\n this.enforcer.assertNotLocked();\n this.strategies.get(params.strategy);\n\n const stratPositions = this.portfolio.getStrategyPositions(params.strategy);\n if (stratPositions.length === 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No positions in strategy '${params.strategy}'`);\n }\n\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter?.addSwapToTx) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Swap adapter does not support composable PTB');\n }\n\n // Phase 0: Unearn any earning assets so coins are in the wallet\n for (const pos of stratPositions) {\n const directPos = this.portfolio.getPosition(pos.asset);\n if (directPos?.earning && directPos.earningProtocol) {\n await this.investUnearn({ asset: pos.asset as InvestmentAsset });\n // Wait for coins to settle\n await new Promise(r => setTimeout(r, 1500));\n }\n }\n\n let swapMetas: Array<{ asset: string; amount: number; estimatedOut: number; toDecimals: number }> = [];\n\n const buildSellPtb = async () => {\n swapMetas = [];\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcOutputs: TransactionObjectArgument[] = [];\n\n for (const pos of stratPositions) {\n const assetInfo = SUPPORTED_ASSETS[pos.asset as keyof typeof SUPPORTED_ASSETS];\n\n const bal = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(bal.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = pos.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const sellAmount = Math.max(0, Math.min(pos.totalAmount, walletAmount) - gasReserve);\n\n if (sellAmount <= 0) continue;\n\n const rawAmount = BigInt(Math.floor(sellAmount * 10 ** assetInfo.decimals));\n\n let splitCoin: TransactionObjectArgument;\n if (pos.asset === 'SUI') {\n [splitCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) continue;\n const merged = this._mergeCoinsInTx(tx, coins);\n [splitCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n\n const slippageBps = LOW_LIQUIDITY_ASSETS.has(pos.asset) ? 500 : 300;\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoin, pos.asset, 'USDC', sellAmount, slippageBps,\n );\n\n usdcOutputs.push(outputCoin);\n swapMetas.push({ asset: pos.asset, amount: sellAmount, estimatedOut, toDecimals });\n }\n\n if (usdcOutputs.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No assets available to sell');\n }\n\n if (usdcOutputs.length > 1) {\n tx.mergeCoins(usdcOutputs[0], usdcOutputs.slice(1));\n }\n tx.transferObjects([usdcOutputs[0]], this._address);\n\n return tx;\n };\n\n let gasResult: import('./gas/index.js').GasExecutionResult;\n const MAX_RETRIES = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n gasResult = await executeWithGas(this.client, this.keypair, buildSellPtb);\n break;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const isSlippage = msg.includes('slippage') || msg.includes('amount_out_slippage');\n if (isSlippage && attempt < MAX_RETRIES) {\n await new Promise(r => setTimeout(r, 2000 * (attempt + 1)));\n continue;\n }\n throw err;\n }\n }\n\n const digest = gasResult.digest;\n const now = new Date().toISOString();\n const sells: StrategySellResult['sells'] = [];\n let totalProceeds = 0;\n let totalPnL = 0;\n\n for (const meta of swapMetas) {\n const usdValue = meta.estimatedOut / (10 ** meta.toDecimals);\n const price = meta.amount > 0 ? usdValue / meta.amount : 0;\n\n const pnl = this.portfolio.recordStrategySell(params.strategy, {\n id: `strat_sell_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: meta.amount,\n price,\n usdValue,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n this.portfolio.recordSell({\n id: `inv_sell_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: meta.amount,\n price,\n usdValue,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n sells.push({ asset: meta.asset, amount: meta.amount, usdValue, realizedPnL: pnl, tx: digest });\n totalProceeds += usdValue;\n totalPnL += pnl;\n }\n\n // Clear any residual dust left in the strategy (gas/rounding differences)\n if (this.portfolio.hasStrategyPositions(params.strategy)) {\n this.portfolio.clearStrategy(params.strategy);\n }\n\n return {\n success: true,\n strategy: params.strategy,\n totalProceeds,\n realizedPnL: totalPnL,\n sells,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async rebalanceStrategy(params: { strategy: string }): Promise<StrategyRebalanceResult> {\n this.enforcer.assertNotLocked();\n const definition = this.strategies.get(params.strategy);\n const stratPositions = this.portfolio.getStrategyPositions(params.strategy);\n\n if (stratPositions.length === 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No positions in strategy '${params.strategy}'`);\n }\n\n const swapAdapter = this.registry.listSwap()[0];\n const prices: Record<string, number> = {};\n for (const pos of stratPositions) {\n try {\n if (pos.asset === 'SUI' && swapAdapter) {\n prices[pos.asset] = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const q = await swapAdapter.getQuote('USDC', pos.asset, 1);\n prices[pos.asset] = q.expectedOutput > 0 ? 1 / q.expectedOutput : 0;\n }\n } catch { prices[pos.asset] = 0; }\n }\n\n const totalValue = stratPositions.reduce((s, p) => s + p.totalAmount * (prices[p.asset] ?? 0), 0);\n if (totalValue <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', 'Strategy has no value to rebalance');\n }\n\n const currentWeights: Record<string, number> = {};\n const beforeWeights: Record<string, number> = {};\n for (const pos of stratPositions) {\n const w = ((pos.totalAmount * (prices[pos.asset] ?? 0)) / totalValue) * 100;\n currentWeights[pos.asset] = w;\n beforeWeights[pos.asset] = w;\n }\n\n const threshold = 3; // only rebalance if > 3% off\n\n // Classify each asset as a buy or sell\n const sellOps: Array<{ asset: string; usdAmount: number; assetAmount: number }> = [];\n const buyOps: Array<{ asset: string; usdAmount: number }> = [];\n\n for (const [asset, targetPct] of Object.entries(definition.allocations)) {\n const currentPct = currentWeights[asset] ?? 0;\n const diff = targetPct - currentPct;\n if (Math.abs(diff) < threshold) continue;\n\n const usdDiff = totalValue * (Math.abs(diff) / 100);\n if (usdDiff < 1) continue;\n\n if (diff > 0) {\n buyOps.push({ asset, usdAmount: usdDiff });\n } else {\n const price = prices[asset] ?? 1;\n const assetAmount = price > 0 ? usdDiff / price : 0;\n sellOps.push({ asset, usdAmount: usdDiff, assetAmount });\n }\n }\n\n if (sellOps.length === 0 && buyOps.length === 0) {\n return { success: true, strategy: params.strategy, trades: [], beforeWeights, afterWeights: { ...beforeWeights }, targetWeights: { ...definition.allocations } };\n }\n\n if (!swapAdapter?.addSwapToTx) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Swap adapter does not support composable PTB');\n }\n\n // Execute all sells and buys in a single PTB\n const tradeMetas: Array<{ action: 'buy' | 'sell'; asset: string; usdAmount: number; estimatedOut: number; toDecimals: number }> = [];\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n tradeMetas.length = 0;\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcCoins: TransactionObjectArgument[] = [];\n\n // Phase 1: Sells (asset → USDC), collecting USDC output coins\n for (const sell of sellOps) {\n const assetInfo = SUPPORTED_ASSETS[sell.asset as keyof typeof SUPPORTED_ASSETS];\n\n const bal = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(bal.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = sell.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const sellAmount = Math.max(0, Math.min(sell.assetAmount, walletAmount) - gasReserve);\n\n if (sellAmount <= 0) continue;\n\n const rawAmount = BigInt(Math.floor(sellAmount * 10 ** assetInfo.decimals));\n\n let splitCoin: TransactionObjectArgument;\n if (sell.asset === 'SUI') {\n [splitCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) continue;\n const merged = this._mergeCoinsInTx(tx, coins);\n [splitCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n const slippageBps = LOW_LIQUIDITY_ASSETS.has(sell.asset) ? 500 : 300;\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoin, sell.asset, 'USDC', sellAmount, slippageBps,\n );\n\n usdcCoins.push(outputCoin);\n tradeMetas.push({ action: 'sell', asset: sell.asset, usdAmount: sell.usdAmount, estimatedOut, toDecimals });\n }\n\n // Phase 2: Merge sell proceeds with wallet USDC for buys\n if (buyOps.length > 0) {\n const walletUsdc = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (walletUsdc.length > 0) {\n usdcCoins.push(this._mergeCoinsInTx(tx, walletUsdc));\n }\n\n if (usdcCoins.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC available for rebalance buys');\n }\n\n // Merge all USDC into one coin\n if (usdcCoins.length > 1) {\n tx.mergeCoins(usdcCoins[0], usdcCoins.slice(1));\n }\n const mergedUsdc = usdcCoins[0];\n\n // Phase 3: Buys (USDC → asset)\n const splitAmounts = buyOps.map(b =>\n BigInt(Math.floor(b.usdAmount * 10 ** SUPPORTED_ASSETS.USDC.decimals)),\n );\n const splitCoins = tx.splitCoins(mergedUsdc, splitAmounts);\n const outputCoins: TransactionObjectArgument[] = [];\n\n for (let i = 0; i < buyOps.length; i++) {\n const buy = buyOps[i];\n const slippageBps = LOW_LIQUIDITY_ASSETS.has(buy.asset) ? 500 : 300;\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoins[i], 'USDC', buy.asset, buy.usdAmount, slippageBps,\n );\n\n outputCoins.push(outputCoin);\n tradeMetas.push({ action: 'buy', asset: buy.asset, usdAmount: buy.usdAmount, estimatedOut, toDecimals });\n }\n\n tx.transferObjects(outputCoins, this._address);\n }\n\n return tx;\n });\n\n const digest = gasResult.digest;\n const now = new Date().toISOString();\n const trades: StrategyRebalanceResult['trades'] = [];\n\n for (const meta of tradeMetas) {\n const rawAmount = meta.estimatedOut / (10 ** meta.toDecimals);\n\n if (meta.action === 'sell') {\n const price = meta.usdAmount > 0 && rawAmount > 0 ? meta.usdAmount / rawAmount : prices[meta.asset] ?? 0;\n const assetAmount = prices[meta.asset] > 0 ? meta.usdAmount / prices[meta.asset] : 0;\n\n this.portfolio.recordStrategySell(params.strategy, {\n id: `strat_rebal_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: assetAmount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n this.portfolio.recordSell({\n id: `inv_rebal_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: assetAmount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n trades.push({ action: 'sell', asset: meta.asset, usdAmount: meta.usdAmount, amount: assetAmount, tx: digest });\n } else {\n const amount = rawAmount;\n const price = meta.usdAmount / amount;\n\n this.portfolio.recordBuy({\n id: `inv_rebal_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n this.portfolio.recordStrategyBuy(params.strategy, {\n id: `strat_rebal_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n trades.push({ action: 'buy', asset: meta.asset, usdAmount: meta.usdAmount, amount, tx: digest });\n }\n }\n\n const afterWeights: Record<string, number> = {};\n const updatedPositions = this.portfolio.getStrategyPositions(params.strategy);\n const newTotal = updatedPositions.reduce((s, p) => s + p.totalAmount * (prices[p.asset] ?? 0), 0);\n for (const p of updatedPositions) {\n afterWeights[p.asset] = newTotal > 0 ? ((p.totalAmount * (prices[p.asset] ?? 0)) / newTotal) * 100 : 0;\n }\n\n return { success: true, strategy: params.strategy, trades, beforeWeights, afterWeights, targetWeights: { ...definition.allocations } };\n }\n\n async getStrategyStatus(name: string): Promise<StrategyStatusResult> {\n const definition = this.strategies.get(name);\n const stratPositions = this.portfolio.getStrategyPositions(name);\n\n const swapAdapter = this.registry.listSwap()[0];\n const prices: Record<string, number> = {};\n for (const asset of Object.keys(definition.allocations)) {\n try {\n if (asset === 'SUI' && swapAdapter) {\n prices[asset] = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const q = await swapAdapter.getQuote('USDC', asset, 1);\n prices[asset] = q.expectedOutput > 0 ? 1 / q.expectedOutput : 0;\n }\n } catch { prices[asset] = 0; }\n }\n\n const positions: InvestmentPosition[] = stratPositions.map((sp) => {\n const price = prices[sp.asset] ?? 0;\n const currentValue = sp.totalAmount * price;\n const pnl = currentValue - sp.costBasis;\n return {\n asset: sp.asset,\n totalAmount: sp.totalAmount,\n costBasis: sp.costBasis,\n avgPrice: sp.avgPrice,\n currentPrice: price,\n currentValue,\n unrealizedPnL: pnl,\n unrealizedPnLPct: sp.costBasis > 0 ? (pnl / sp.costBasis) * 100 : 0,\n trades: sp.trades,\n };\n });\n\n const totalValue = positions.reduce((s, p) => s + p.currentValue, 0);\n const currentWeights: Record<string, number> = {};\n for (const p of positions) {\n currentWeights[p.asset] = totalValue > 0 ? (p.currentValue / totalValue) * 100 : 0;\n }\n\n return { definition, positions, currentWeights, totalValue };\n }\n\n // -- Auto-Invest --\n\n setupAutoInvest(params: {\n amount: number;\n frequency: 'daily' | 'weekly' | 'monthly';\n strategy?: string;\n asset?: string;\n dayOfWeek?: number;\n dayOfMonth?: number;\n }): AutoInvestSchedule {\n if (params.strategy) this.strategies.get(params.strategy);\n if (params.asset && !(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not an investment asset`);\n }\n return this.autoInvest.setup(params);\n }\n\n getAutoInvestStatus(): AutoInvestStatus {\n return this.autoInvest.getStatus();\n }\n\n async runAutoInvest(): Promise<AutoInvestRunResult> {\n this.enforcer.assertNotLocked();\n const status = this.autoInvest.getStatus();\n const executed: AutoInvestRunResult['executed'] = [];\n const skipped: AutoInvestRunResult['skipped'] = [];\n\n for (const schedule of status.pendingRuns) {\n try {\n const bal = await queryBalance(this.client, this._address);\n if (bal.available < schedule.amount) {\n skipped.push({ scheduleId: schedule.id, reason: `Insufficient balance ($${bal.available.toFixed(2)} < $${schedule.amount})` });\n continue;\n }\n\n if (schedule.strategy) {\n const result = await this.investStrategy({ strategy: schedule.strategy, usdAmount: schedule.amount });\n this.autoInvest.recordRun(schedule.id, schedule.amount);\n executed.push({ scheduleId: schedule.id, strategy: schedule.strategy, amount: schedule.amount, result });\n } else if (schedule.asset) {\n const result = await this.investBuy({ asset: schedule.asset as InvestmentAsset, usdAmount: schedule.amount });\n this.autoInvest.recordRun(schedule.id, schedule.amount);\n executed.push({ scheduleId: schedule.id, asset: schedule.asset, amount: schedule.amount, result });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n skipped.push({ scheduleId: schedule.id, reason: msg });\n }\n }\n\n return { executed, skipped };\n }\n\n stopAutoInvest(id: string): void {\n this.autoInvest.stop(id);\n }\n\n async getPortfolio(): Promise<PortfolioResult & { strategyPositions?: Record<string, InvestmentPosition[]> }> {\n const positions = this.portfolio.getPositions();\n const realizedPnL = this.portfolio.getRealizedPnL();\n\n const prices: Record<string, number> = {};\n const swapAdapter = this.registry.listSwap()[0];\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n try {\n if (asset === 'SUI' && swapAdapter) {\n prices[asset] = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', asset, 1);\n prices[asset] = quote.expectedOutput > 0 ? 1 / quote.expectedOutput : 0;\n }\n } catch { prices[asset] = 0; }\n }\n\n const enrichPosition = async (pos: { asset: string; totalAmount: number; costBasis: number; avgPrice: number; trades: import('./types.js').InvestmentTrade[]; earning?: boolean; earningProtocol?: string; earningApy?: number }, adjustWallet: boolean): Promise<InvestmentPosition> => {\n const currentPrice = prices[pos.asset] ?? 0;\n let totalAmount = pos.totalAmount;\n let costBasis = pos.costBasis;\n\n if (adjustWallet && pos.asset in INVESTMENT_ASSETS && !pos.earning) {\n try {\n const assetInfo = SUPPORTED_ASSETS[pos.asset as keyof typeof SUPPORTED_ASSETS];\n const bal = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(bal.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = pos.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const actualHeld = Math.max(0, walletAmount - gasReserve);\n if (actualHeld < totalAmount) {\n const ratio = totalAmount > 0 ? actualHeld / totalAmount : 0;\n costBasis *= ratio;\n totalAmount = actualHeld;\n }\n } catch { /* keep tracked values */ }\n }\n\n const currentValue = totalAmount * currentPrice;\n const unrealizedPnL = currentPrice > 0 ? currentValue - costBasis : 0;\n const unrealizedPnLPct = currentPrice > 0 && costBasis > 0 ? (unrealizedPnL / costBasis) * 100 : 0;\n return {\n asset: pos.asset, totalAmount, costBasis, avgPrice: pos.avgPrice,\n currentPrice, currentValue, unrealizedPnL, unrealizedPnLPct,\n trades: pos.trades, earning: pos.earning, earningProtocol: pos.earningProtocol, earningApy: pos.earningApy,\n };\n };\n\n const enriched: InvestmentPosition[] = [];\n for (const pos of positions) {\n enriched.push(await enrichPosition(pos, true));\n }\n\n const strategyPositions: Record<string, InvestmentPosition[]> = {};\n for (const key of this.portfolio.getAllStrategyKeys()) {\n const sps = this.portfolio.getStrategyPositions(key);\n const enrichedStrat: InvestmentPosition[] = [];\n for (const sp of sps) {\n enrichedStrat.push(await enrichPosition(sp, false));\n }\n if (enrichedStrat.length > 0) {\n strategyPositions[key] = enrichedStrat;\n }\n }\n\n const allPositions = [...enriched, ...Object.values(strategyPositions).flat()];\n const totalInvested = allPositions.reduce((sum, p) => sum + p.costBasis, 0);\n const totalValue = allPositions.reduce((sum, p) => sum + p.currentValue, 0);\n const totalUnrealizedPnL = totalValue - totalInvested;\n const totalUnrealizedPnLPct = totalInvested > 0 ? (totalUnrealizedPnL / totalInvested) * 100 : 0;\n\n const result: PortfolioResult & { strategyPositions?: Record<string, InvestmentPosition[]> } = {\n positions: enriched,\n totalInvested,\n totalValue,\n unrealizedPnL: totalUnrealizedPnL,\n unrealizedPnLPct: totalUnrealizedPnLPct,\n realizedPnL,\n };\n\n if (Object.keys(strategyPositions).length > 0) {\n result.strategyPositions = strategyPositions;\n }\n\n return result;\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 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 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 rebalance(opts: { dryRun?: boolean; minYieldDiff?: number; maxBreakEven?: number } = {}): Promise<RebalanceResult> {\n this.enforcer.assertNotLocked();\n const dryRun = opts.dryRun ?? false;\n const minYieldDiff = opts.minYieldDiff ?? 0.5;\n const maxBreakEven = opts.maxBreakEven ?? 30;\n\n const [allPositions, allRates] = await Promise.all([\n this.registry.allPositions(this._address),\n this.registry.allRatesAcrossAssets(),\n ]);\n\n const earningAssets = new Set(\n this.portfolio.getPositions().filter(p => p.earning).map(p => p.asset),\n );\n\n const savePositions = allPositions.flatMap(p =>\n p.positions.supplies\n .filter(s => s.amount > 0.01)\n .filter(s => !earningAssets.has(s.asset))\n .filter(s => !(s.asset in INVESTMENT_ASSETS))\n .map(s => ({\n protocolId: p.protocolId,\n protocol: p.protocol,\n asset: s.asset,\n amount: s.amount,\n apy: s.apy,\n })),\n );\n\n if (savePositions.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings positions to rebalance. Use `t2000 save <amount>` first.');\n }\n\n const borrowPositions = allPositions.flatMap(p =>\n p.positions.borrows.filter(b => b.amount > 0.01),\n );\n if (borrowPositions.length > 0) {\n const healthResults = await Promise.all(\n allPositions\n .filter(p => p.positions.borrows.some(b => b.amount > 0.01))\n .map(async p => {\n const adapter = this.registry.getLending(p.protocolId);\n if (!adapter) return null;\n return adapter.getHealth(this._address);\n }),\n );\n for (const hf of healthResults) {\n if (hf && hf.healthFactor < 1.5) {\n throw new T2000Error(\n 'HEALTH_FACTOR_TOO_LOW',\n `Cannot rebalance — health factor is ${hf.healthFactor.toFixed(2)} (minimum 1.5). Repay some debt first.`,\n { healthFactor: hf.healthFactor },\n );\n }\n }\n }\n\n const stableSet = new Set<string>(STABLE_ASSETS);\n const stableRates = allRates.filter(r => stableSet.has(r.asset));\n if (stableRates.length === 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No stablecoin lending rates available for rebalance');\n }\n const bestRate = stableRates.reduce((best, r) =>\n r.rates.saveApy > best.rates.saveApy ? r : best,\n );\n\n const current = savePositions.reduce((worst, p) =>\n p.apy < worst.apy ? p : worst,\n );\n\n const withdrawAdapter = this.registry.getLending(current.protocolId);\n if (withdrawAdapter) {\n try {\n const maxResult = await withdrawAdapter.maxWithdraw(this._address, current.asset);\n if (maxResult.maxAmount < current.amount) {\n current.amount = Math.max(0, maxResult.maxAmount - 0.01);\n }\n } catch { /* fall through with full amount */ }\n }\n\n if (current.amount <= 0.01) {\n throw new T2000Error(\n 'HEALTH_FACTOR_TOO_LOW',\n 'Cannot rebalance — active borrows prevent safe withdrawal. Repay some debt first.',\n );\n }\n\n const apyDiff = bestRate.rates.saveApy - current.apy;\n const isSameProtocol = current.protocolId === bestRate.protocolId;\n const isSameAsset = current.asset === bestRate.asset;\n\n if (apyDiff < minYieldDiff) {\n return {\n executed: false,\n steps: [],\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain: (current.amount * apyDiff) / 100,\n estimatedSwapCost: 0,\n breakEvenDays: Infinity,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n if (isSameProtocol && isSameAsset) {\n return {\n executed: false,\n steps: [],\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain: 0,\n estimatedSwapCost: 0,\n breakEvenDays: Infinity,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n const steps: RebalanceStep[] = [];\n let estimatedSwapCost = 0;\n\n steps.push({\n action: 'withdraw',\n protocol: current.protocolId,\n fromAsset: current.asset,\n amount: current.amount,\n });\n\n let amountToDeposit = current.amount;\n\n if (!isSameAsset) {\n try {\n const quote = await this.registry.bestSwapQuote(current.asset, bestRate.asset, current.amount);\n amountToDeposit = quote.quote.expectedOutput;\n estimatedSwapCost = Math.abs(current.amount - amountToDeposit);\n } catch {\n estimatedSwapCost = current.amount * 0.003;\n amountToDeposit = current.amount - estimatedSwapCost;\n }\n\n steps.push({\n action: 'swap',\n fromAsset: current.asset,\n toAsset: bestRate.asset,\n amount: current.amount,\n estimatedOutput: amountToDeposit,\n });\n }\n\n steps.push({\n action: 'deposit',\n protocol: bestRate.protocolId,\n toAsset: bestRate.asset,\n amount: amountToDeposit,\n });\n\n const annualGain = (amountToDeposit * apyDiff) / 100;\n const breakEvenDays = estimatedSwapCost > 0 ? Math.ceil((estimatedSwapCost / annualGain) * 365) : 0;\n\n if (breakEvenDays > maxBreakEven && estimatedSwapCost > 0) {\n return {\n executed: false,\n steps,\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain,\n estimatedSwapCost,\n breakEvenDays,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n if (dryRun) {\n return {\n executed: false,\n steps,\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain,\n estimatedSwapCost,\n breakEvenDays,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n if (!withdrawAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${current.protocolId} not found`);\n\n const depositAdapter = this.registry.getLending(bestRate.protocolId);\n if (!depositAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${bestRate.protocolId} not found`);\n\n const canComposePTB =\n withdrawAdapter.addWithdrawToTx && depositAdapter.addSaveToTx &&\n (isSameAsset || this.registry.listSwap()[0]?.addSwapToTx);\n\n let txDigests: string[];\n let totalGasCost: number;\n\n if (canComposePTB) {\n const result = await executeWithGas(this.client, this.keypair, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const { coin: withdrawnCoin, effectiveAmount } = await withdrawAdapter.addWithdrawToTx!(\n tx, this._address, current.amount, current.asset,\n );\n amountToDeposit = effectiveAmount;\n\n let depositCoin = withdrawnCoin;\n if (!isSameAsset) {\n const swapAdapter = this.registry.listSwap()[0];\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, withdrawnCoin, current.asset, bestRate.asset, amountToDeposit,\n );\n depositCoin = outputCoin;\n amountToDeposit = estimatedOut / 10 ** toDecimals;\n }\n\n await depositAdapter.addSaveToTx!(\n tx, this._address, depositCoin, bestRate.asset, { collectFee: bestRate.asset === 'USDC' },\n );\n\n return tx;\n });\n txDigests = [result.digest];\n totalGasCost = result.gasCostSui;\n } else {\n txDigests = [];\n totalGasCost = 0;\n\n const withdrawResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await withdrawAdapter.buildWithdrawTx(this._address, current.amount, current.asset);\n amountToDeposit = built.effectiveAmount;\n return built.tx;\n });\n txDigests.push(withdrawResult.digest);\n totalGasCost += withdrawResult.gasCostSui;\n\n if (!isSameAsset) {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n\n const swapResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await swapAdapter.buildSwapTx(this._address, current.asset, bestRate.asset, amountToDeposit);\n amountToDeposit = built.estimatedOut / 10 ** built.toDecimals;\n return built.tx;\n });\n txDigests.push(swapResult.digest);\n totalGasCost += swapResult.gasCostSui;\n }\n\n const depositResult = await executeWithGas(this.client, this.keypair, async () => {\n const { tx } = await depositAdapter.buildSaveTx(this._address, amountToDeposit, bestRate.asset, { collectFee: bestRate.asset === 'USDC' });\n return tx;\n });\n txDigests.push(depositResult.digest);\n totalGasCost += depositResult.gasCostSui;\n }\n\n return {\n executed: true,\n steps,\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain,\n estimatedSwapCost,\n breakEvenDays,\n txDigests,\n totalGasCost,\n };\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this.keypair);\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.keypair);\n }\n\n // -- Sentinel --\n\n async sentinelList(): Promise<SentinelAgent[]> {\n return sentinel.listSentinels();\n }\n\n async sentinelInfo(id: string): Promise<SentinelAgent> {\n return sentinel.getSentinelInfo(this.client, id);\n }\n\n async sentinelAttack(id: string, prompt: string, fee?: bigint): Promise<SentinelAttackResult> {\n this.enforcer.check({ operation: 'sentinel', amount: fee ? Number(fee) / 1e9 : 0.1 });\n return sentinel.attack(this.client, this.keypair, id, prompt, fee);\n }\n\n // -- Helpers --\n\n private async getFreeBalance(asset: string): Promise<number> {\n if (!(asset in INVESTMENT_ASSETS)) return Infinity;\n\n // Strategy buys record to BOTH direct and strategy positions, so use\n // max(direct, strategyTotal) to avoid double-counting the overlap.\n const pos = this.portfolio.getPosition(asset);\n const directAmount = (pos && pos.totalAmount > 0 && !pos.earning) ? pos.totalAmount : 0;\n\n let strategyTotal = 0;\n for (const key of this.portfolio.getAllStrategyKeys()) {\n for (const sp of this.portfolio.getStrategyPositions(key)) {\n if (sp.asset === asset && sp.totalAmount > 0) {\n strategyTotal += sp.totalAmount;\n }\n }\n }\n\n const walletInvested = Math.max(directAmount, strategyTotal);\n\n if (walletInvested <= 0) return Infinity;\n\n const assetInfo = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS];\n const balance = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(balance.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n return Math.max(0, walletAmount - walletInvested - gasReserve);\n }\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","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","export type {\n AdapterCapability,\n AdapterTxResult,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n SwapQuote,\n LendingAdapter,\n SwapAdapter,\n PerpsAdapter,\n ProtocolDescriptor,\n} from './types.js';\nexport { ProtocolRegistry } from './registry.js';\nexport { NaviAdapter, descriptor as naviDescriptor } from './navi.js';\nexport { CetusAdapter, descriptor as cetusDescriptor } from './cetus.js';\nexport { SuilendAdapter, descriptor as suilendDescriptor } from './suilend.js';\nexport { descriptor as sentinelDescriptor } from '../protocols/sentinel.js';\n\nimport { descriptor as naviDescriptor } from './navi.js';\nimport { descriptor as cetusDescriptor } from './cetus.js';\nimport { descriptor as suilendDescriptor } from './suilend.js';\nimport { descriptor as sentinelDescriptor } from '../protocols/sentinel.js';\nimport type { ProtocolDescriptor } from './types.js';\n\n/** All registered protocol descriptors — used by the indexer for event classification */\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n suilendDescriptor,\n cetusDescriptor,\n sentinelDescriptor,\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/utils/format.ts","../src/wallet/send.ts","../src/wallet/balance.ts","../src/wallet/history.ts","../src/protocols/protocolFee.ts","../src/protocols/navi.ts","../src/protocols/yieldTracker.ts","../src/protocols/sentinel.ts","../src/adapters/registry.ts","../src/adapters/navi.ts","../src/protocols/cetus.ts","../src/adapters/cetus.ts","../src/adapters/suilend.ts","../src/utils/hashcash.ts","../src/gas/autoTopUp.ts","../src/gas/gasStation.ts","../src/gas/manager.ts","../src/safeguards/types.ts","../src/safeguards/errors.ts","../src/safeguards/enforcer.ts","../src/contacts.ts","../src/portfolio.ts","../src/strategy.ts","../src/auto-invest.ts","../src/t2000.ts","../src/utils/simulate.ts","../src/adapters/index.ts"],"names":["SuiJsonRpcClient","normalizeSuiAddress","isValidSuiAddress","resolve","homedir","scryptSync","randomBytes","createCipheriv","createDecipheriv","Ed25519Keypair","decodeSuiPrivateKey","access","mkdir","dirname","writeFile","readFile","Transaction","getLendingPositions","naviGetPools","naviGetHealthFactor","depositCoinPTB","withdrawCoinPTB","repayCoinPTB","borrowCoinPTB","getUserAvailableLendingRewards","summaryLendingRewards","claimLendingRewardsPTB","attack","bcs","descriptor","AggregatorClient","Env","MIN_HEALTH_FACTOR","SuilendClient","LENDING_MARKET_ID","LENDING_MARKET_TYPE","normalizeStructTag","initializeSuilend","initializeObligations","Side","createHash","join","readFileSync","existsSync","mkdirSync","writeFileSync","emptyData","randomUUID","EventEmitter","keypair","tx","currentApy","swapAdapter","adapters"],"mappings":"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","file":"index.cjs","sourcesContent":["export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const SWAP_FEE_BPS = 0n; // Free — Cetus already charges pool fees\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n 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 BTC: {\n type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC',\n decimals: 8,\n symbol: 'BTC',\n displayName: 'Bitcoin',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'Ethereum',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 9,\n symbol: 'GOLD',\n displayName: 'Gold',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = Exclude<SupportedAsset, 'SUI' | 'BTC' | 'ETH' | 'GOLD'>;\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC', 'USDT', 'USDe', 'USDsui'] as const;\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\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\nexport const CETUS_GLOBAL_CONFIG = '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f';\nexport const CETUS_PACKAGE = '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb';\n\n// --- Investment ---\n\nexport const INVESTMENT_ASSETS = {\n SUI: SUPPORTED_ASSETS.SUI,\n BTC: SUPPORTED_ASSETS.BTC,\n ETH: SUPPORTED_ASSETS.ETH,\n GOLD: SUPPORTED_ASSETS.GOLD,\n} as const;\n\nexport type InvestmentAsset = keyof typeof INVESTMENT_ASSETS;\n\nexport const DEFAULT_STRATEGIES = {\n bluechip: {\n name: 'Bluechip / Large-Cap',\n allocations: { BTC: 50, ETH: 30, SUI: 20 },\n description: 'Large-cap crypto index',\n custom: false,\n },\n layer1: {\n name: 'Smart Contract Platforms',\n allocations: { ETH: 50, SUI: 50 },\n description: 'Smart contract platforms',\n custom: false,\n },\n 'sui-heavy': {\n name: 'Sui-Weighted Portfolio',\n allocations: { BTC: 20, ETH: 20, SUI: 60 },\n description: 'Sui-weighted portfolio',\n custom: false,\n },\n 'all-weather': {\n name: 'All-Weather Portfolio',\n allocations: { BTC: 30, ETH: 20, SUI: 20, GOLD: 30 },\n description: 'Crypto and commodities',\n custom: false,\n },\n 'safe-haven': {\n name: 'Safe Haven',\n allocations: { BTC: 50, GOLD: 50 },\n description: 'Store-of-value assets',\n custom: false,\n },\n} as const;\n\nexport const PERPS_MARKETS = ['SUI-PERP'] as const;\nexport type PerpsMarket = (typeof PERPS_MARKETS)[number];\n\nexport const DEFAULT_MAX_LEVERAGE = 5;\nexport const DEFAULT_MAX_POSITION_SIZE = 1000;\nexport const INVEST_FEE_BPS = 0n;\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n\nexport const SENTINEL = {\n PACKAGE: '0x88b83f36dafcd5f6dcdcf1d2cb5889b03f61264ab3cee9cae35db7aa940a21b7',\n AGENT_REGISTRY: '0xc47564f5f14c12b31e0dfa1a3dc99a6380a1edf8929c28cb0eaa3359c8db36ac',\n ENCLAVE: '0xfb1261aeb9583514cb1341a548a5ec12d1231bd96af22215f1792617a93e1213',\n PROTOCOL_CONFIG: '0x2fa4fa4a1dd0498612304635ff9334e1b922e78af325000e9d9c0e88adea459f',\n TEE_API: 'https://app.suisentinel.xyz/api/consume-prompt',\n SENTINELS_API: 'https://api.suisentinel.xyz/agents/mainnet',\n RANDOM: '0x8',\n MIN_FEE_MIST: 100_000_000n, // 0.1 SUI\n MAX_PROMPT_TOKENS: 600,\n} as const;\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'SWAP_FAILED'\n | 'SLIPPAGE_EXCEEDED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SENTINEL_API_ERROR'\n | 'SENTINEL_NOT_FOUND'\n | 'SENTINEL_TX_FAILED'\n | 'SENTINEL_TEE_ERROR'\n | 'SAFEGUARD_BLOCKED'\n | 'INSUFFICIENT_INVESTMENT'\n | 'INVESTMENT_LOCKED'\n | 'INVEST_ALREADY_EARNING'\n | 'INVEST_NOT_EARNING'\n | 'BORROW_GUARD_INVESTMENT'\n | 'STRATEGY_NOT_FOUND'\n | 'STRATEGY_INVALID_ALLOCATIONS'\n | 'STRATEGY_HAS_POSITIONS'\n | 'STRATEGY_BUILTIN'\n | 'STRATEGY_MIN_AMOUNT'\n | 'AUTO_INVEST_NOT_FOUND'\n | 'AUTO_INVEST_INSUFFICIENT'\n | 'MARKET_NOT_SUPPORTED'\n | 'LEVERAGE_EXCEEDED'\n | 'POSITION_SIZE_EXCEEDED'\n | 'BLUEFIN_AUTH_FAILED'\n | 'BLUEFIN_API_ERROR'\n | 'POSITION_NOT_FOUND'\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 // Cetus DEX abort codes\n 46001: 'Swap failed — the DEX pool rejected the trade (liquidity or routing issue). Try again.',\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 `Swap slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import { 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 { 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 { Transaction } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\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 interface SendParams {\n client: SuiJsonRpcClient;\n keypair: Ed25519Keypair;\n to: string;\n amount: number;\n asset?: SupportedAsset;\n}\n\nexport interface SendTxResult {\n digest: string;\n gasCost: number;\n}\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\nexport async function buildAndExecuteSend({\n client,\n keypair,\n to,\n amount,\n asset = 'USDC',\n}: SendParams): Promise<SendTxResult> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n if (amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n }\n\n const senderAddress = keypair.getPublicKey().toSuiAddress();\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n\n const tx = new Transaction();\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({\n owner: senderAddress,\n coinType: assetInfo.type,\n });\n\n if (coins.data.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n }\n\n const totalBalance = coins.data.reduce(\n (sum, c) => sum + BigInt(c.balance),\n 0n,\n );\n\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals,\n required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n\n if (coins.data.length > 1) {\n tx.mergeCoins(\n primaryCoin,\n coins.data.slice(1).map((c) => tx.object(c.coinObjectId)),\n );\n }\n\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const gasUsed = result.effects?.gasUsed;\n const gasCost = gasUsed\n ? Math.abs(\n (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n )\n : 0;\n\n return {\n digest: result.digest,\n gasCost,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, INVESTMENT_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { StableAsset, InvestmentAsset } 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 nonSuiInvestmentAssets = (Object.keys(INVESTMENT_ASSETS) as InvestmentAsset[]).filter(a => a !== 'SUI');\n const investBalancePromises = nonSuiInvestmentAssets.map((asset) =>\n client.getBalance({ owner: address, coinType: INVESTMENT_ASSETS[asset].type })\n .then((b) => ({ asset, amount: Number(b.totalBalance) / 10 ** INVESTMENT_ASSETS[asset].decimals }))\n .catch(() => ({ asset, amount: 0 })),\n );\n\n const [suiBalance, suiPriceUsd, ...rest] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ...stableBalancePromises,\n ...investBalancePromises,\n ]);\n\n const stableResults = rest.slice(0, STABLE_ASSETS.length) as Array<{ asset: StableAsset; amount: number }>;\n const investResults = rest.slice(STABLE_ASSETS.length) as Array<{ asset: string; amount: number }>;\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 const assets: Record<string, number> = {\n USDC: stables.USDC ?? 0,\n SUI: suiAmount,\n };\n for (const { asset, amount } of investResults) {\n assets[asset] = amount;\n }\n\n return {\n available: totalStables,\n savings,\n debt: 0,\n investment: 0,\n investmentPnL: 0,\n pendingRewards: 0,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n stables,\n assets,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { TransactionRecord } from '../types.js';\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => {\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 return {\n digest: tx.digest,\n action: inferAction(tx.transaction),\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n });\n}\n\nfunction inferAction(txBlock: unknown): string {\n if (!txBlock || typeof txBlock !== 'object') return 'unknown';\n const data = 'data' in txBlock ? (txBlock as { data?: unknown }).data : undefined;\n if (!data || typeof data !== 'object') return 'unknown';\n const inner = 'transaction' in data ? (data as { transaction?: unknown }).transaction : undefined;\n if (!inner || typeof inner !== 'object') return 'unknown';\n\n const kind = 'kind' in inner ? (inner as { kind: string }).kind : undefined;\n if (kind === 'ProgrammableTransaction') return 'transaction';\n return kind ?? 'unknown';\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n SWAP_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'swap' | 'borrow';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n swap: SWAP_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n swap: 1,\n borrow: 2,\n};\n\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\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 type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, STABLE_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 SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n GasMethod,\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\nconst NAVI_SUPPORTED_ASSETS = [...STABLE_ASSETS, 'SUI', 'ETH', 'GOLD'] as const;\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 } {\n return { env: 'prod', client };\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};\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\nfunction extractGasCost(effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null): number {\n if (!effects?.gasUsed) return 0;\n return Math.abs(\n (Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)) / 1e9,\n );\n}\n\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 addressOrKeypair: string | Ed25519Keypair,\n): Promise<PositionsResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\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');\n\n if (amount > 0.0001 || amountUsd > 0.001) {\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 NAVI_SUPPORTED_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');\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0');\n\n if (saveApy >= 0 && saveApy < 200) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 200 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 4.0, borrowApy: 6.0 };\n return result;\n } catch {\n return { USDC: { saveApy: 4.0, borrowApy: 6.0 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<HealthFactorResult> {\n const address = typeof addressOrKeypair === 'string'\n ? addressOrKeypair\n : addressOrKeypair.getPublicKey().toSuiAddress();\n\n const 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 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 = Number(stableToRaw(amount, assetInfo.decimals));\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 save(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<SaveResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildSaveTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const rates = await getRates(client);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n apy: rates.USDC?.saveApy ?? 4.0,\n fee: 0,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n savingsBalance: amount,\n };\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\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 try {\n const coinResult = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n const [coin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [coinResult as TransactionObjectArgument],\n typeArguments: [assetInfo.type],\n });\n tx.transferObjects([coin], 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 } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n try {\n const coinResult = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n const [coin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [coinResult as TransactionObjectArgument],\n typeArguments: [assetInfo.type],\n });\n return { coin, 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 } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\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 withdraw(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<WithdrawResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const { tx, effectiveAmount } = await buildWithdrawTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n success: true,\n tx: result.digest,\n amount: effectiveAmount,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\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 try {\n const coinResult = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n const [borrowedCoin] = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [coinResult as TransactionObjectArgument],\n typeArguments: [assetInfo.type],\n });\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin], 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 borrow(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<BorrowResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildBorrowTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const hfResult = await getHealthFactor(client, address);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n fee: 0,\n healthFactor: hfResult.healthFactor,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\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`);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\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 repay(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<RepayResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildRepayTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const posResult = await getPositions(client, address);\n let remainingDebt = 0;\n for (const pos of posResult.positions) {\n if (pos.type === 'borrow') remainingDebt += pos.amountUsd ?? pos.amount;\n }\n\n return {\n success: true,\n tx: result.digest,\n amount,\n remainingDebt,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n addressOrKeypair: string | Ed25519Keypair,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, addressOrKeypair);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\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 type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, keypair);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy / 100;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n // Estimate total yield earned based on position age\n // For MVP, use a simple approximation\n const totalYieldEarned = dailyEarning * 30; // rough monthly estimate\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 keypair: Ed25519Keypair,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, keypair);\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 { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { bcs } from '@mysten/sui/bcs';\nimport { SENTINEL, CLOCK_ID, MIST_PER_SUI } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { SentinelAgent, SentinelVerdict, SentinelAttackResult } from '../types.js';\nimport type { ProtocolDescriptor } from '../adapters/types.js';\n\nexport const descriptor: ProtocolDescriptor = {\n id: 'sentinel',\n name: 'Sui Sentinel',\n packages: [SENTINEL.PACKAGE],\n actionMap: {\n 'sentinel::request_attack': 'sentinel_attack',\n 'sentinel::consume_prompt': 'sentinel_settle',\n },\n};\n\ninterface RawSentinelAgent {\n agent_id: string;\n agent_object_id: string;\n agent_name: string;\n cost_per_message: string;\n total_balance: string;\n total_attacks: number;\n successful_breaches?: number;\n state: string;\n prompt: string;\n model?: string;\n}\n\nfunction mapAgent(raw: RawSentinelAgent): SentinelAgent {\n return {\n id: raw.agent_id,\n objectId: raw.agent_object_id,\n name: raw.agent_name,\n model: raw.model ?? 'unknown',\n systemPrompt: raw.prompt,\n attackFee: BigInt(raw.cost_per_message),\n prizePool: BigInt(raw.total_balance),\n totalAttacks: raw.total_attacks,\n successfulBreaches: raw.successful_breaches ?? 0,\n state: raw.state,\n };\n}\n\nexport async function listSentinels(): Promise<SentinelAgent[]> {\n const res = await fetch(SENTINEL.SENTINELS_API);\n if (!res.ok) {\n throw new T2000Error('SENTINEL_API_ERROR', `Sentinel API returned ${res.status}`);\n }\n\n const data = (await res.json()) as { agents: RawSentinelAgent[] };\n if (!Array.isArray(data.agents)) {\n throw new T2000Error('SENTINEL_API_ERROR', 'Unexpected API response shape');\n }\n\n return data.agents\n .filter((a) => a.state === 'active')\n .map(mapAgent);\n}\n\nexport async function getSentinelInfo(\n client: SuiJsonRpcClient,\n sentinelObjectId: string,\n): Promise<SentinelAgent> {\n const agents = await listSentinels();\n const match = agents.find((a) => a.objectId === sentinelObjectId || a.id === sentinelObjectId);\n\n if (match) return match;\n\n const obj = await client.getObject({\n id: sentinelObjectId,\n options: { showContent: true, showType: true },\n });\n\n if (!obj.data) {\n throw new T2000Error('SENTINEL_NOT_FOUND', `Sentinel ${sentinelObjectId} not found on-chain`);\n }\n\n const content = obj.data.content;\n if (!content || content.dataType !== 'moveObject') {\n throw new T2000Error('SENTINEL_NOT_FOUND', `Object ${sentinelObjectId} is not a Move object`);\n }\n\n const fields = content.fields as Record<string, unknown>;\n\n return {\n id: (fields.id as { id: string })?.id ?? sentinelObjectId,\n objectId: sentinelObjectId,\n name: (fields.name as string) ?? 'Unknown',\n model: (fields.model as string) ?? 'unknown',\n systemPrompt: (fields.system_prompt as string) ?? '',\n attackFee: BigInt((fields.cost_per_message as string) ?? '0'),\n prizePool: BigInt((fields.balance as string) ?? '0'),\n totalAttacks: Number((fields.total_attacks as string) ?? '0'),\n successfulBreaches: Number((fields.successful_breaches as string) ?? '0'),\n state: (fields.state as string) ?? 'unknown',\n };\n}\n\nexport async function requestAttack(\n client: SuiJsonRpcClient,\n signer: Ed25519Keypair,\n sentinelObjectId: string,\n feeMist: bigint,\n): Promise<{ attackObjectId: string; digest: string }> {\n if (feeMist < SENTINEL.MIN_FEE_MIST) {\n throw new T2000Error('INVALID_AMOUNT', `Attack fee must be at least 0.1 SUI (${SENTINEL.MIN_FEE_MIST} MIST)`);\n }\n\n const tx = new Transaction();\n const [coin] = tx.splitCoins(tx.gas, [Number(feeMist)]);\n\n const [attack] = tx.moveCall({\n target: `${SENTINEL.PACKAGE}::sentinel::request_attack`,\n arguments: [\n tx.object(SENTINEL.AGENT_REGISTRY),\n tx.object(sentinelObjectId),\n tx.object(SENTINEL.PROTOCOL_CONFIG),\n coin,\n tx.object(SENTINEL.RANDOM),\n tx.object(CLOCK_ID),\n ],\n });\n\n const address = signer.toSuiAddress();\n tx.transferObjects([attack], address);\n\n const result = await client.signAndExecuteTransaction({\n signer,\n transaction: tx,\n options: { showObjectChanges: true, showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const attackObj = result.objectChanges?.find(\n (c) => c.type === 'created' && c.objectType?.includes('::sentinel::Attack'),\n );\n\n const attackObjectId = attackObj && 'objectId' in attackObj ? attackObj.objectId : undefined;\n\n if (!attackObjectId) {\n throw new T2000Error('SENTINEL_TX_FAILED', 'Attack object was not created — transaction may have failed');\n }\n\n return { attackObjectId, digest: result.digest };\n}\n\nexport async function submitPrompt(\n agentId: string,\n attackObjectId: string,\n prompt: string,\n): Promise<SentinelVerdict> {\n const res = await fetch(SENTINEL.TEE_API, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agent_id: agentId,\n attack_object_id: attackObjectId,\n message: prompt,\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n throw new T2000Error('SENTINEL_TEE_ERROR', `TEE returned ${res.status}: ${body.slice(0, 200)}`);\n }\n\n const raw = await res.json() as Record<string, unknown>;\n\n // TEE wraps: { response: { intent, timestamp_ms, data: { ... } }, signature }\n const envelope = (raw.response ?? raw) as Record<string, unknown>;\n const data = (envelope.data ?? envelope) as Record<string, unknown>;\n const signature = (raw.signature ?? data.signature) as string;\n const timestampMs = (envelope.timestamp_ms ?? data.timestamp_ms) as number;\n\n if (typeof signature !== 'string') {\n throw new T2000Error('SENTINEL_TEE_ERROR', 'TEE response missing signature');\n }\n\n return {\n success: (data.success ?? data.is_success) as boolean,\n score: data.score as number,\n agentResponse: data.agent_response as string,\n juryResponse: data.jury_response as string,\n funResponse: (data.fun_response as string) ?? '',\n signature,\n timestampMs,\n };\n}\n\nexport async function settleAttack(\n client: SuiJsonRpcClient,\n signer: Ed25519Keypair,\n sentinelObjectId: string,\n attackObjectId: string,\n prompt: string,\n verdict: SentinelVerdict,\n): Promise<{ digest: string; success: boolean }> {\n const sigBytes = Array.from(Buffer.from(verdict.signature.replace(/^0x/, ''), 'hex'));\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${SENTINEL.PACKAGE}::sentinel::consume_prompt`,\n arguments: [\n tx.object(SENTINEL.AGENT_REGISTRY),\n tx.object(SENTINEL.PROTOCOL_CONFIG),\n tx.object(sentinelObjectId),\n tx.pure.bool(verdict.success),\n tx.pure.string(verdict.agentResponse),\n tx.pure.string(verdict.juryResponse),\n tx.pure.string(verdict.funResponse),\n tx.pure.string(prompt),\n tx.pure.u8(verdict.score),\n tx.pure.u64(verdict.timestampMs),\n tx.pure(bcs.vector(bcs.u8()).serialize(sigBytes)),\n tx.object(SENTINEL.ENCLAVE),\n tx.object(attackObjectId),\n tx.object(CLOCK_ID),\n ],\n });\n\n const result = await client.signAndExecuteTransaction({\n signer,\n transaction: tx,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const txSuccess = result.effects?.status?.status === 'success';\n\n return { digest: result.digest, success: txSuccess };\n}\n\nexport async function attack(\n client: SuiJsonRpcClient,\n signer: Ed25519Keypair,\n sentinelId: string,\n prompt: string,\n feeMist?: bigint,\n): Promise<SentinelAttackResult> {\n const sentinel = await getSentinelInfo(client, sentinelId);\n const fee = feeMist ?? sentinel.attackFee;\n\n if (fee < SENTINEL.MIN_FEE_MIST) {\n throw new T2000Error('INVALID_AMOUNT', `Attack fee must be at least 0.1 SUI`);\n }\n\n const { attackObjectId, digest: requestTx } = await requestAttack(\n client,\n signer,\n sentinel.objectId,\n fee,\n );\n\n const verdict = await submitPrompt(sentinel.id, attackObjectId, prompt);\n\n const { digest: settleTx } = await settleAttack(\n client,\n signer,\n sentinel.objectId,\n attackObjectId,\n prompt,\n verdict,\n );\n\n const won = verdict.success && verdict.score >= 70;\n\n return {\n attackObjectId,\n sentinelId: sentinel.id,\n prompt,\n verdict,\n requestTx,\n settleTx,\n won,\n feePaid: Number(fee) / Number(MIST_PER_SUI),\n };\n}\n","import type {\n LendingAdapter,\n SwapAdapter,\n LendingRates,\n SwapQuote,\n AdapterPositions,\n AdapterCapability,\n} from './types.js';\nimport { STABLE_ASSETS, INVESTMENT_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n private swap: Map<string, SwapAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n registerSwap(adapter: SwapAdapter): void {\n this.swap.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new 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 bestSwapQuote(from: string, to: string, amount: number): Promise<{ adapter: SwapAdapter; quote: SwapQuote }> {\n const candidates: Array<{ adapter: SwapAdapter; quote: SwapQuote }> = [];\n\n for (const adapter of this.swap.values()) {\n const pairs = adapter.getSupportedPairs();\n if (!pairs.some(p => p.from === from && p.to === to)) continue;\n try {\n const quote = await adapter.getQuote(from, to, amount);\n candidates.push({ adapter, quote });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No swap adapter supports ${from} → ${to}`);\n }\n\n candidates.sort((a, b) => b.quote.expectedOutput - a.quote.expectedOutput);\n return candidates[0];\n }\n\n async 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 allAssets = [...STABLE_ASSETS, ...Object.keys(INVESTMENT_ASSETS)];\n const seen = new Set<string>();\n for (const asset of allAssets) {\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 getSwap(id: string): SwapAdapter | undefined {\n return this.swap.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n\n listSwap(): SwapAdapter[] {\n return [...this.swap.values()];\n }\n\n}\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 ProtocolDescriptor,\n PendingReward,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport const descriptor: 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 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[] = [...STABLE_ASSETS, 'SUI', 'ETH', 'GOLD'];\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 },\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 ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const 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 ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, { asset: normalized });\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 { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk';\nimport { SUPPORTED_ASSETS, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { GasMethod } from '../types.js';\n\nconst DEFAULT_SLIPPAGE_BPS = 300; // 3%\n\nexport interface SwapParams {\n client: SuiJsonRpcClient;\n keypair: Ed25519Keypair;\n fromAsset: string;\n toAsset: string;\n amount: number;\n maxSlippageBps?: number;\n}\n\nexport interface SwapTxResult {\n digest: string;\n fromAmount: number;\n fromAsset: string;\n toAmount: number;\n toAsset: string;\n priceImpact: number;\n gasCost: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nexport interface SwapBuildResult {\n tx: Transaction;\n estimatedOut: number;\n toDecimals: number;\n}\n\nfunction createAggregatorClient(client: SuiJsonRpcClient, signer?: string): AggregatorClient {\n // Cetus SDK bundles @mysten/sui v1 internally — the runtime API is\n // identical to SuiJsonRpcClient, so the cast is safe.\n return new AggregatorClient({\n client: client as never,\n signer,\n env: Env.Mainnet,\n });\n}\n\nexport async function buildSwapTx(params: {\n client: SuiJsonRpcClient;\n address: string;\n fromAsset: string;\n toAsset: string;\n amount: number;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const fromInfo = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS];\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n if (!fromInfo || !toInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const aggClient = createAggregatorClient(client, address);\n\n const _origLog = console.log;\n console.log = () => {};\n let result;\n try {\n result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n } finally {\n console.log = _origLog;\n }\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `No swap route found for ${fromAsset} → ${toAsset}`,\n );\n }\n\n const tx = new Transaction();\n const slippage = maxSlippageBps / 10000;\n\n console.log = () => {};\n try {\n await aggClient.fastRouterSwap({\n router: result,\n txb: tx as never,\n slippage,\n });\n } finally {\n console.log = _origLog;\n }\n\n const estimatedOut = Number(result.amountOut.toString());\n\n return {\n tx,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\n/**\n * Composable variant: adds swap commands to an existing PTB using\n * routerSwap (accepts inputCoin, returns targetCoin).\n */\nexport async function addSwapToTx(params: {\n tx: Transaction;\n client: SuiJsonRpcClient;\n address: string;\n inputCoin: TransactionObjectArgument;\n fromAsset: string;\n toAsset: string;\n amount: number;\n maxSlippageBps?: number;\n}): Promise<{ outputCoin: TransactionObjectArgument; estimatedOut: number; toDecimals: number }> {\n const { tx, client, address, inputCoin, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const fromInfo = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS];\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n if (!fromInfo || !toInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const aggClient = createAggregatorClient(client, address);\n\n const _origLog = console.log;\n console.log = () => {};\n let result;\n try {\n result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n } finally {\n console.log = _origLog;\n }\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `No swap route found for ${fromAsset} → ${toAsset}`,\n );\n }\n\n const slippage = maxSlippageBps / 10000;\n\n console.log = () => {};\n let outputCoin;\n try {\n outputCoin = await aggClient.routerSwap({\n router: result,\n txb: tx as never,\n inputCoin: inputCoin as never,\n slippage,\n });\n } finally {\n console.log = _origLog;\n }\n\n const estimatedOut = Number(result.amountOut.toString());\n\n return {\n outputCoin: outputCoin as unknown as TransactionObjectArgument,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\nexport async function executeSwap(params: SwapParams): Promise<SwapTxResult> {\n const { client, keypair, fromAsset, toAsset, amount, maxSlippageBps } = params;\n const address = keypair.getPublicKey().toSuiAddress();\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n const { tx, estimatedOut, toDecimals } = await buildSwapTx({\n client,\n address,\n fromAsset,\n toAsset,\n amount,\n maxSlippageBps,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let actualReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = estimatedOut / 10 ** toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n return {\n digest: result.digest,\n fromAmount: amount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n gasCost: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\n/**\n * Build a swap TX from an arbitrary coin type to USDC (or another\n * SUPPORTED_ASSET). Used for converting reward tokens after claiming.\n */\nexport async function buildRawSwapTx(params: {\n client: SuiJsonRpcClient;\n address: string;\n fromCoinType: string;\n fromDecimals: number;\n toCoinType: string;\n toDecimals: number;\n amount: bigint;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromCoinType, toCoinType, amount, toDecimals, maxSlippageBps = 500 } = params;\n\n const aggClient = createAggregatorClient(client, address);\n\n const _origLog = console.log;\n console.log = () => {};\n let result;\n try {\n result = await aggClient.findRouters({\n from: fromCoinType,\n target: toCoinType,\n amount,\n byAmountIn: true,\n });\n } finally {\n console.log = _origLog;\n }\n\n if (!result || result.insufficientLiquidity) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No swap route for reward token → USDC`);\n }\n\n const tx = new Transaction();\n const slippage = maxSlippageBps / 10000;\n\n console.log = () => {};\n try {\n await aggClient.fastRouterSwap({\n router: result,\n txb: tx as never,\n slippage,\n });\n } finally {\n console.log = _origLog;\n }\n\n return {\n tx,\n estimatedOut: Number(result.amountOut.toString()),\n toDecimals,\n };\n}\n\nexport async function getPoolPrice(client: SuiJsonRpcClient): Promise<number> {\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const currentSqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n\n if (currentSqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtPriceFloat = Number(currentSqrtPrice) / Number(Q64);\n const rawPrice = sqrtPriceFloat * sqrtPriceFloat;\n const suiPriceUsd = 1e3 / rawPrice;\n if (suiPriceUsd > 0.01 && suiPriceUsd < 1000) return suiPriceUsd;\n }\n }\n } catch {\n // Fallback\n }\n\n return 3.5;\n}\n\nexport async function getSwapQuote(\n client: SuiJsonRpcClient,\n fromAsset: string,\n toAsset: string,\n amount: number,\n): Promise<{ expectedOutput: number; priceImpact: number; poolPrice: number }> {\n const fromInfo = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS];\n const toInfo = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS];\n\n if (!fromInfo || !toInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const poolPrice = await getPoolPrice(client);\n\n try {\n const aggClient = createAggregatorClient(client);\n\n const result = await aggClient.findRouters({\n from: fromInfo.type,\n target: toInfo.type,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!result || result.insufficientLiquidity) {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n\n const expectedOutput = Number(result.amountOut.toString()) / 10 ** toInfo.decimals;\n const priceImpact = result.deviationRatio ?? 0;\n\n return { expectedOutput, priceImpact, poolPrice };\n } catch {\n return fallbackQuote(fromAsset, amount, poolPrice);\n }\n}\n\nfunction fallbackQuote(\n fromAsset: string,\n amount: number,\n poolPrice: number,\n): { expectedOutput: number; priceImpact: number; poolPrice: number } {\n const expectedOutput = fromAsset === 'USDC'\n ? amount / poolPrice\n : amount * poolPrice;\n return { expectedOutput, priceImpact: 0, poolPrice };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n SwapAdapter,\n SwapQuote,\n AdapterTxResult,\n AdapterCapability,\n ProtocolDescriptor,\n} from './types.js';\nimport * as cetusProtocol from '../protocols/cetus.js';\nimport { CETUS_PACKAGE, STABLE_ASSETS, INVESTMENT_ASSETS } from '../constants.js';\n\nexport const descriptor: ProtocolDescriptor = {\n id: 'cetus',\n name: 'Cetus DEX',\n packages: [CETUS_PACKAGE],\n actionMap: {\n 'router::swap': 'swap',\n 'router::swap_ab_bc': 'swap',\n 'router::swap_ab_cb': 'swap',\n 'router::swap_ba_bc': 'swap',\n 'router::swap_ba_cb': 'swap',\n },\n};\n\nexport class CetusAdapter implements SwapAdapter {\n readonly id = 'cetus';\n readonly name = 'Cetus';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['swap'];\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getQuote(from: string, to: string, amount: number): Promise<SwapQuote> {\n return cetusProtocol.getSwapQuote(this.client, from, to, amount);\n }\n\n async buildSwapTx(\n address: string,\n from: string,\n to: string,\n amount: number,\n maxSlippageBps?: number,\n ): Promise<AdapterTxResult & { estimatedOut: number; toDecimals: number }> {\n const result = await cetusProtocol.buildSwapTx({\n client: this.client,\n address,\n fromAsset: from,\n toAsset: to,\n amount,\n maxSlippageBps,\n });\n return {\n tx: result.tx,\n estimatedOut: result.estimatedOut,\n toDecimals: result.toDecimals,\n };\n }\n\n getSupportedPairs(): Array<{ from: string; to: string }> {\n const pairs: Array<{ from: string; to: string }> = [];\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n pairs.push({ from: 'USDC', to: asset }, { from: asset, to: 'USDC' });\n }\n for (const a of STABLE_ASSETS) {\n for (const b of STABLE_ASSETS) {\n if (a !== b) pairs.push({ from: a, to: b });\n }\n }\n return pairs;\n }\n\n async getPoolPrice(): Promise<number> {\n return cetusProtocol.getPoolPrice(this.client);\n }\n\n async addSwapToTx(\n tx: Transaction,\n address: string,\n inputCoin: TransactionObjectArgument,\n from: string,\n to: string,\n amount: number,\n maxSlippageBps?: number,\n ): Promise<{ outputCoin: TransactionObjectArgument; estimatedOut: number; toDecimals: number }> {\n return cetusProtocol.addSwapToTx({\n tx,\n client: this.client,\n address,\n inputCoin,\n fromAsset: from,\n toAsset: to,\n amount,\n maxSlippageBps,\n });\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\nimport {\n SuilendClient,\n LENDING_MARKET_ID,\n LENDING_MARKET_TYPE,\n} from '@suilend/sdk/client';\nimport { initializeSuilend, initializeObligations } from '@suilend/sdk/lib/initialize';\nimport { Side } from '@suilend/sdk/lib/types';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n ProtocolDescriptor,\n PendingReward,\n} from './types.js';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS } from '../constants.js';\nimport { stableToRaw } from '../utils/format.js';\nimport { T2000Error } from '../errors.js';\nimport { addCollectFeeToTx } from '../protocols/protocolFee.js';\nimport type { TransactionObjectArgument } from '@mysten/sui/transactions';\n\nconst SUILEND_PACKAGE = '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf';\nconst MIN_HEALTH_FACTOR = 1.5;\n\nexport const descriptor: ProtocolDescriptor = {\n id: 'suilend',\n name: 'Suilend',\n packages: [SUILEND_PACKAGE],\n actionMap: {\n 'lending_market::deposit_liquidity_and_mint_ctokens': 'save',\n 'lending_market::deposit_ctokens_into_obligation': 'save',\n 'lending_market::create_obligation': 'save',\n 'lending_market::withdraw_ctokens': 'withdraw',\n 'lending_market::redeem_ctokens_and_withdraw_liquidity': 'withdraw',\n 'lending_market::redeem_ctokens_and_withdraw_liquidity_request': 'withdraw',\n 'lending_market::fulfill_liquidity_request': 'withdraw',\n 'lending_market::unstake_sui_from_staker': 'withdraw',\n 'lending_market::borrow': 'borrow',\n 'lending_market::repay': 'repay',\n },\n};\n\nexport class SuilendAdapter implements LendingAdapter {\n readonly id = 'suilend';\n readonly name = 'Suilend';\n readonly version = '3.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...STABLE_ASSETS, 'SUI', 'ETH', 'BTC', 'GOLD'];\n readonly supportsSameAssetBorrow = false;\n\n private client!: SuiJsonRpcClient;\n private sdkClient: SuilendClient | null = null;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n private async getSdkClient(): Promise<SuilendClient> {\n if (!this.sdkClient) {\n this.sdkClient = await SuilendClient.initialize(\n LENDING_MARKET_ID,\n LENDING_MARKET_TYPE,\n this.client,\n false,\n );\n }\n return this.sdkClient;\n }\n\n private resolveSymbol(coinType: string): string {\n try {\n const normalized = normalizeStructTag(coinType);\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n try {\n if (normalizeStructTag(info.type) === normalized) return key;\n } catch { /* skip */ }\n }\n } catch { /* fall through */ }\n const parts = coinType.split('::');\n return parts[parts.length - 1] || 'UNKNOWN';\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n try {\n const sdk = await this.getSdkClient();\n const { reserveMap } = await initializeSuilend(this.client, sdk);\n\n const assetInfo = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS];\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Suilend does not support ${asset}`);\n\n const normalized = normalizeStructTag(assetInfo.type);\n const reserve = Object.values(reserveMap).find((r) => {\n try { return normalizeStructTag(r.coinType) === normalized; }\n catch { return false; }\n });\n\n if (!reserve) throw new T2000Error('ASSET_NOT_SUPPORTED', `Suilend does not support ${asset}`);\n\n return {\n asset,\n saveApy: reserve.depositAprPercent.toNumber(),\n borrowApy: reserve.borrowAprPercent.toNumber(),\n };\n } catch (err) {\n if (err instanceof T2000Error) throw err;\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Suilend getRates failed: ${msg}`);\n }\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const supplies: AdapterPositions['supplies'] = [];\n const borrows: AdapterPositions['borrows'] = [];\n\n try {\n const sdk = await this.getSdkClient();\n const { reserveMap, refreshedRawReserves } = await initializeSuilend(this.client, sdk);\n\n const { obligations, obligationOwnerCaps } = await initializeObligations(\n this.client, sdk, refreshedRawReserves, reserveMap, address,\n );\n\n if (obligationOwnerCaps.length === 0 || obligations.length === 0) {\n return { supplies, borrows };\n }\n\n const obligation = obligations[0];\n\n for (const dep of obligation.deposits) {\n const symbol = this.resolveSymbol(dep.coinType);\n const amount = dep.depositedAmount.toNumber();\n const amountUsd = dep.depositedAmountUsd.toNumber();\n const apy = dep.reserve.depositAprPercent.toNumber();\n if (amount > 0.0001) {\n supplies.push({ asset: symbol, amount, amountUsd, apy });\n }\n }\n\n for (const bor of obligation.borrows) {\n const symbol = this.resolveSymbol(bor.coinType);\n const amount = bor.borrowedAmount.toNumber();\n const amountUsd = bor.borrowedAmountUsd.toNumber();\n const apy = bor.reserve.borrowAprPercent.toNumber();\n if (amount > 0.0001) {\n borrows.push({ asset: symbol, amount, amountUsd, apy });\n }\n }\n } catch (err) {\n if (err instanceof T2000Error) throw err;\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Suilend getPositions failed: ${msg}`);\n }\n\n return { supplies, borrows };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n try {\n const sdk = await this.getSdkClient();\n const { reserveMap, refreshedRawReserves } = await initializeSuilend(this.client, sdk);\n\n const { obligations, obligationOwnerCaps } = await initializeObligations(\n this.client, sdk, refreshedRawReserves, reserveMap, address,\n );\n\n if (obligationOwnerCaps.length === 0 || obligations.length === 0) {\n return { healthFactor: Infinity, supplied: 0, borrowed: 0, maxBorrow: 0, liquidationThreshold: 0 };\n }\n\n const ob = obligations[0];\n const supplied = ob.depositedAmountUsd.toNumber();\n const borrowed = ob.borrowedAmountUsd.toNumber();\n const borrowLimit = ob.borrowLimitUsd.toNumber();\n const unhealthy = ob.unhealthyBorrowValueUsd.toNumber();\n\n const liqThreshold = supplied > 0 ? unhealthy / supplied : 0.75;\n const healthFactor = borrowed > 0 ? unhealthy / borrowed : Infinity;\n const maxBorrow = Math.max(0, borrowLimit - borrowed);\n\n return { healthFactor, supplied, borrowed, maxBorrow, liquidationThreshold: liqThreshold };\n } catch {\n return { healthFactor: Infinity, supplied: 0, borrowed: 0, maxBorrow: 0, liquidationThreshold: 0 };\n }\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n const tx = new Transaction();\n tx.setSender(address);\n\n let capRef: string;\n if (caps.length === 0) {\n const newCap = sdk.createObligation(tx);\n tx.transferObjects([newCap], address);\n // Need to execute in two steps: create obligation, then deposit\n // For simplicity, create then deposit in same PTB using depositIntoObligation\n }\n\n const rawValue = stableToRaw(amount, assetInfo.decimals).toString();\n\n if (options?.collectFee) {\n const allCoins = await this.fetchAllCoins(address, assetInfo.type);\n if (allCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n const primaryCoinId = allCoins[0].coinObjectId;\n if (allCoins.length > 1) {\n tx.mergeCoins(tx.object(primaryCoinId), allCoins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [depositCoin] = tx.splitCoins(tx.object(primaryCoinId), [rawValue]);\n addCollectFeeToTx(tx, depositCoin as TransactionObjectArgument, 'save');\n }\n\n if (caps.length > 0) {\n await sdk.depositIntoObligation(address, assetInfo.type, rawValue, tx, caps[0].id);\n } else {\n await sdk.depositIntoObligation(address, assetInfo.type, rawValue, tx, tx.object(caps[0]?.id ?? ''));\n }\n\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found');\n\n const positions = await this.getPositions(address);\n const dep = positions.supplies.find(s => s.asset === assetKey);\n const deposited = dep?.amount ?? 0;\n const effectiveAmount = Math.min(amount, deposited);\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on Suilend`);\n\n const rawValue = stableToRaw(effectiveAmount, assetInfo.decimals).toString();\n const tx = new Transaction();\n tx.setSender(address);\n\n await sdk.withdrawAndSendToUser(address, caps[0].id, caps[0].obligationId, assetInfo.type, rawValue, tx);\n\n return { tx, effectiveAmount };\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 assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found');\n\n const positions = await this.getPositions(address);\n const dep = positions.supplies.find(s => s.asset === assetKey);\n const deposited = dep?.amount ?? 0;\n const effectiveAmount = Math.min(amount, deposited);\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on Suilend`);\n\n const rawValue = stableToRaw(effectiveAmount, assetInfo.decimals).toString();\n const coin = await sdk.withdraw(caps[0].id, caps[0].obligationId, assetInfo.type, rawValue, tx);\n\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\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 assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n\n let capRef: string | TransactionObjectArgument;\n if (caps.length === 0) {\n const newCap = sdk.createObligation(tx);\n capRef = newCap;\n tx.transferObjects([newCap], address);\n } else {\n capRef = caps[0].id;\n }\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n sdk.deposit(coin, assetInfo.type, capRef as string, tx);\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<AdapterTxResult> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend position found. Deposit collateral first with: t2000 save <amount>');\n\n const rawValue = stableToRaw(amount, assetInfo.decimals).toString();\n const tx = new Transaction();\n tx.setSender(address);\n\n if (options?.collectFee) {\n const coin = await sdk.borrow(caps[0].id, caps[0].obligationId, assetInfo.type, rawValue, tx);\n addCollectFeeToTx(tx, coin as TransactionObjectArgument, 'borrow');\n tx.transferObjects([coin], address);\n } else {\n await sdk.borrowAndSendToUser(address, caps[0].id, caps[0].obligationId, assetInfo.type, rawValue, tx);\n }\n\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n ): Promise<AdapterTxResult> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend obligation found');\n\n const rawValue = stableToRaw(amount, assetInfo.decimals).toString();\n const tx = new Transaction();\n tx.setSender(address);\n\n await sdk.repayIntoObligation(address, caps[0].obligationId, assetInfo.type, rawValue, tx);\n\n return { tx };\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const assetKey = (asset in SUPPORTED_ASSETS ? asset : 'USDC') as keyof typeof SUPPORTED_ASSETS;\n const assetInfo = SUPPORTED_ASSETS[assetKey];\n\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n if (caps.length === 0) throw new T2000Error('NO_COLLATERAL', 'No Suilend obligation found');\n\n sdk.repay(caps[0].obligationId, assetInfo.type, coin, tx);\n }\n\n async maxWithdraw(\n address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n const health = await this.getHealth(address);\n let maxAmount: number;\n if (health.borrowed === 0) {\n maxAmount = health.supplied;\n } else {\n maxAmount = Math.max(0, health.supplied - (health.borrowed * MIN_HEALTH_FACTOR) / health.liquidationThreshold);\n }\n const remainingSupply = health.supplied - maxAmount;\n const hfAfter = health.borrowed > 0\n ? (remainingSupply * health.liquidationThreshold) / health.borrowed\n : Infinity;\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: health.healthFactor };\n }\n\n async maxBorrow(\n address: string,\n _asset: string,\n ): Promise<{ maxAmount: number; healthFactorAfter: number; currentHF: number }> {\n const health = await this.getHealth(address);\n return { maxAmount: health.maxBorrow, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: health.healthFactor };\n }\n\n private async fetchAllCoins(\n owner: string,\n coinType: string,\n ): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined = null;\n let hasNext = true;\n while (hasNext) {\n const page = await this.client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n try {\n const sdk = await this.getSdkClient();\n const { reserveMap, refreshedRawReserves } = await initializeSuilend(this.client, sdk);\n const { obligations, obligationOwnerCaps } = await initializeObligations(\n this.client, sdk, refreshedRawReserves, reserveMap, address,\n );\n\n if (obligationOwnerCaps.length === 0 || obligations.length === 0) return [];\n\n const ob = obligations[0];\n const rewards: PendingReward[] = [];\n\n for (const dep of ob.deposits) {\n for (const rw of dep.reserve.depositsPoolRewardManager.poolRewards) {\n if (rw.endTimeMs <= Date.now()) continue;\n const symbol = rw.symbol || rw.coinType.split('::').pop() || 'UNKNOWN';\n rewards.push({\n protocol: 'suilend',\n asset: this.resolveSymbol(dep.coinType),\n coinType: rw.coinType,\n symbol,\n amount: 0,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return rewards;\n } catch {\n return [];\n }\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n try {\n const sdk = await this.getSdkClient();\n const caps = await SuilendClient.getObligationOwnerCaps(address, [LENDING_MARKET_TYPE], this.client);\n if (caps.length === 0) return [];\n\n const { reserveMap, refreshedRawReserves } = await initializeSuilend(this.client, sdk);\n const { obligations } = await initializeObligations(\n this.client, sdk, refreshedRawReserves, reserveMap, address,\n );\n\n if (obligations.length === 0) return [];\n const ob = obligations[0];\n\n const claimRewards: Array<{\n reserveArrayIndex: bigint;\n rewardIndex: bigint;\n rewardCoinType: string;\n side: Side;\n }> = [];\n\n for (const dep of ob.deposits) {\n for (const rw of dep.reserve.depositsPoolRewardManager.poolRewards) {\n if (rw.endTimeMs <= Date.now()) continue;\n claimRewards.push({\n reserveArrayIndex: dep.reserveArrayIndex,\n rewardIndex: BigInt(rw.rewardIndex),\n rewardCoinType: rw.coinType,\n side: Side.DEPOSIT,\n });\n }\n }\n\n if (claimRewards.length === 0) return [];\n\n sdk.claimRewardsAndSendToUser(address, caps[0].id, claimRewards, tx);\n\n return claimRewards.map((r) => ({\n protocol: 'suilend',\n asset: '',\n coinType: r.rewardCoinType,\n symbol: r.rewardCoinType.split('::').pop() ?? 'UNKNOWN',\n amount: 0,\n estimatedValueUsd: 0,\n }));\n } catch {\n return [];\n }\n }\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 type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n AUTO_TOPUP_AMOUNT,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport { buildSwapTx } from '../protocols/cetus.js';\n\nconst AUTO_TOPUP_MIN_SUI_FOR_GAS = 5_000_000n; // 0.005 SUI — minimum to self-fund the swap\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 return suiRaw < AUTO_TOPUP_THRESHOLD && suiRaw >= AUTO_TOPUP_MIN_SUI_FOR_GAS && usdcRaw >= AUTO_TOPUP_MIN_USDC;\n}\n\n/**\n * Self-fund a USDC→SUI swap to replenish gas.\n *\n * Uses the agent's remaining SUI to pay for the swap gas (~0.007 SUI).\n * This avoids the chicken-and-egg problem of needing gas station sponsorship\n * to get gas, and works even when the gas station is down.\n */\nexport async function executeAutoTopUp(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n): Promise<AutoTopUpResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const topupAmountHuman = Number(AUTO_TOPUP_AMOUNT) / 1e6; // $1 USDC\n\n const { tx } = await buildSwapTx({\n client,\n address,\n fromAsset: 'USDC',\n toAsset: 'SUI',\n amount: topupAmountHuman,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let suiReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === SUPPORTED_ASSETS.SUI.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n suiReceived += Number(change.amount) / Number(MIST_PER_SUI);\n }\n }\n }\n\n return {\n success: true,\n tx: result.digest,\n usdcSpent: topupAmountHuman,\n suiReceived: Math.abs(suiReceived),\n };\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.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 = Buffer.from(txJson).toString('base64');\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') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter },\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 undefined,\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","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\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';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n gasMethod: GasMethod;\n gasCostSui: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\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 trySelfFunded(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n // Need at least 0.05 SUI for gas\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, keypair);\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 result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\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 = Buffer.from(bcsBytes).toString('base64');\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = Buffer.from(sponsoredResult.txBytes, 'base64');\n const { signature: agentSig } = await keypair.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n // Report gas usage (best-effort)\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 gasMethod: 'sponsored',\n gasCostSui: gasCost,\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 */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n keypair: Ed25519Keypair,\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 errors: string[] = [];\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, keypair, tx);\n if (result) return result;\n errors.push('self-funded: SUI below threshold');\n } catch (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 errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (self-fund swap for gas) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, keypair, buildTx);\n if (result) return result;\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, keypair, tx);\n if (result) return result;\n errors.push('sponsored: returned null');\n } catch (err) {\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and Gas Station unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\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 | 'exchange'\n | 'rebalance'\n | 'pay'\n | 'sentinel'\n | 'invest'\n | 'trade';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n 'sentinel',\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","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from './errors.js';\nimport type { InvestmentTrade } from './types.js';\n\ninterface StoredPosition {\n totalAmount: number;\n costBasis: number;\n avgPrice: number;\n trades: InvestmentTrade[];\n earning?: boolean;\n earningProtocol?: string;\n earningApy?: number;\n}\n\ninterface PortfolioData {\n positions: Record<string, StoredPosition>;\n strategies: Record<string, Record<string, StoredPosition>>;\n realizedPnL: number;\n}\n\nfunction emptyData(): PortfolioData {\n return { positions: {}, strategies: {}, realizedPnL: 0 };\n}\n\nexport class PortfolioManager {\n private data: PortfolioData = emptyData();\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, 'portfolio.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.data = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n if (!this.data.strategies) this.data.strategies = {};\n }\n } catch {\n this.data = emptyData();\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));\n }\n\n recordBuy(trade: InvestmentTrade): void {\n this.load();\n const pos = this.data.positions[trade.asset] ?? { totalAmount: 0, costBasis: 0, avgPrice: 0, trades: [] };\n\n pos.totalAmount += trade.amount;\n pos.costBasis += trade.usdValue;\n pos.avgPrice = pos.costBasis / pos.totalAmount;\n pos.trades.push(trade);\n\n this.data.positions[trade.asset] = pos;\n this.save();\n }\n\n recordSell(trade: InvestmentTrade): number {\n this.load();\n const pos = this.data.positions[trade.asset];\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${trade.asset} position to sell`);\n }\n\n const sellAmount = Math.min(trade.amount, pos.totalAmount);\n const effectiveUsdValue = trade.amount > 0 && sellAmount < trade.amount\n ? trade.usdValue * (sellAmount / trade.amount)\n : trade.usdValue;\n const costOfSold = pos.avgPrice * sellAmount;\n const realizedPnL = effectiveUsdValue - costOfSold;\n\n pos.totalAmount -= sellAmount;\n pos.costBasis -= costOfSold;\n if (pos.totalAmount < 0.000001) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n }\n\n pos.trades.push(trade);\n this.data.realizedPnL += realizedPnL;\n\n this.data.positions[trade.asset] = pos;\n this.save();\n return realizedPnL;\n }\n\n getPosition(asset: string): StoredPosition | undefined {\n this.load();\n return this.data.positions[asset];\n }\n\n getPositions(): Array<{ asset: string } & StoredPosition> {\n this.load();\n return Object.entries(this.data.positions)\n .filter(([, pos]) => pos.totalAmount > 0)\n .map(([asset, pos]) => ({ asset, ...pos }));\n }\n\n recordEarn(asset: string, protocol: string, apy: number): void {\n this.load();\n const pos = this.data.positions[asset];\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${asset} position to earn on`);\n }\n pos.earning = true;\n pos.earningProtocol = protocol;\n pos.earningApy = apy;\n this.data.positions[asset] = pos;\n this.save();\n }\n\n recordUnearn(asset: string): void {\n this.load();\n const pos = this.data.positions[asset];\n if (!pos || !pos.earning) {\n throw new T2000Error('INVEST_NOT_EARNING', `${asset} is not currently earning`);\n }\n pos.earning = false;\n pos.earningProtocol = undefined;\n pos.earningApy = undefined;\n this.data.positions[asset] = pos;\n this.save();\n }\n\n closePosition(asset: string): void {\n this.load();\n const pos = this.data.positions[asset];\n if (pos) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n pos.earning = false;\n pos.earningProtocol = undefined;\n pos.earningApy = undefined;\n this.data.positions[asset] = pos;\n this.save();\n }\n }\n\n isEarning(asset: string): boolean {\n this.load();\n const pos = this.data.positions[asset];\n return pos?.earning === true;\n }\n\n getRealizedPnL(): number {\n this.load();\n return this.data.realizedPnL;\n }\n\n // --- Strategy position tracking ---\n\n recordStrategyBuy(strategyKey: string, trade: InvestmentTrade): void {\n this.load();\n if (!this.data.strategies[strategyKey]) {\n this.data.strategies[strategyKey] = {};\n }\n const bucket = this.data.strategies[strategyKey];\n const pos = bucket[trade.asset] ?? { totalAmount: 0, costBasis: 0, avgPrice: 0, trades: [] };\n\n pos.totalAmount += trade.amount;\n pos.costBasis += trade.usdValue;\n pos.avgPrice = pos.costBasis / pos.totalAmount;\n pos.trades.push(trade);\n\n bucket[trade.asset] = pos;\n this.save();\n }\n\n recordStrategySell(strategyKey: string, trade: InvestmentTrade): number {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket) {\n throw new T2000Error('STRATEGY_NOT_FOUND', `No positions for strategy '${strategyKey}'`);\n }\n const pos = bucket[trade.asset];\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${trade.asset} position in strategy '${strategyKey}'`);\n }\n\n const sellAmount = Math.min(trade.amount, pos.totalAmount);\n const effectiveUsdValue = trade.amount > 0 && sellAmount < trade.amount\n ? trade.usdValue * (sellAmount / trade.amount)\n : trade.usdValue;\n const costOfSold = pos.avgPrice * sellAmount;\n const realizedPnL = effectiveUsdValue - costOfSold;\n\n pos.totalAmount -= sellAmount;\n pos.costBasis -= costOfSold;\n if (pos.totalAmount < 0.000001) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n }\n\n pos.trades.push(trade);\n // P&L is NOT added to global realizedPnL here — investSell already\n // recorded it via recordSell to avoid double-counting.\n\n bucket[trade.asset] = pos;\n\n const hasPositions = Object.values(bucket).some((p) => p.totalAmount > 0);\n if (!hasPositions) {\n delete this.data.strategies[strategyKey];\n }\n\n this.save();\n return realizedPnL;\n }\n\n getStrategyPositions(strategyKey: string): Array<{ asset: string } & StoredPosition> {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket) return [];\n return Object.entries(bucket)\n .filter(([, pos]) => pos.totalAmount > 0)\n .map(([asset, pos]) => ({ asset, ...pos }));\n }\n\n getAllStrategyKeys(): string[] {\n this.load();\n return Object.keys(this.data.strategies);\n }\n\n clearStrategy(strategyKey: string): void {\n this.load();\n delete this.data.strategies[strategyKey];\n this.save();\n }\n\n hasStrategyPositions(strategyKey: string): boolean {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket) return false;\n return Object.values(bucket).some((p) => p.totalAmount > 0);\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from './errors.js';\nimport { DEFAULT_STRATEGIES, INVESTMENT_ASSETS } from './constants.js';\nimport type { StrategyDefinition } from './types.js';\n\ninterface StrategyData {\n strategies: Record<string, StrategyDefinition>;\n}\n\nfunction emptyData(): StrategyData {\n return { strategies: {} };\n}\n\nexport class StrategyManager {\n private data: StrategyData = emptyData();\n private readonly filePath: string;\n private readonly dir: string;\n private seeded = false;\n\n constructor(configDir?: string) {\n this.dir = configDir ?? join(homedir(), '.t2000');\n this.filePath = join(this.dir, 'strategies.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.data = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.data = emptyData();\n }\n if (!this.seeded) {\n this.seedDefaults();\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));\n }\n\n private seedDefaults(): void {\n this.seeded = true;\n let changed = false;\n for (const [key, def] of Object.entries(DEFAULT_STRATEGIES)) {\n if (!this.data.strategies[key]) {\n this.data.strategies[key] = { ...def, allocations: { ...def.allocations } };\n changed = true;\n }\n }\n if (changed) this.save();\n }\n\n getAll(): Record<string, StrategyDefinition> {\n this.load();\n return { ...this.data.strategies };\n }\n\n get(name: string): StrategyDefinition {\n this.load();\n const strategy = this.data.strategies[name];\n if (!strategy) {\n throw new T2000Error('STRATEGY_NOT_FOUND', `Strategy '${name}' not found`);\n }\n return strategy;\n }\n\n create(params: { name: string; allocations: Record<string, number>; description?: string }): StrategyDefinition {\n this.load();\n const key = params.name.toLowerCase().replace(/\\s+/g, '-');\n\n if (this.data.strategies[key]) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `Strategy '${key}' already exists`);\n }\n\n this.validateAllocations(params.allocations);\n\n const definition: StrategyDefinition = {\n name: params.name,\n allocations: { ...params.allocations },\n description: params.description ?? `Custom strategy: ${params.name}`,\n custom: true,\n };\n\n this.data.strategies[key] = definition;\n this.save();\n return definition;\n }\n\n delete(name: string): void {\n this.load();\n const strategy = this.data.strategies[name];\n if (!strategy) {\n throw new T2000Error('STRATEGY_NOT_FOUND', `Strategy '${name}' not found`);\n }\n if (!strategy.custom) {\n throw new T2000Error('STRATEGY_BUILTIN', `Cannot delete built-in strategy '${name}'`);\n }\n delete this.data.strategies[name];\n this.save();\n }\n\n validateAllocations(allocations: Record<string, number>): void {\n const total = Object.values(allocations).reduce((sum, pct) => sum + pct, 0);\n if (Math.abs(total - 100) > 0.01) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `Allocations must sum to 100 (got ${total})`);\n }\n\n for (const asset of Object.keys(allocations)) {\n if (!(asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `${asset} is not an investment asset`);\n }\n if (allocations[asset] <= 0) {\n throw new T2000Error('STRATEGY_INVALID_ALLOCATIONS', `Allocation for ${asset} must be > 0`);\n }\n }\n }\n\n validateMinAmount(allocations: Record<string, number>, totalUsd: number): void {\n const smallestPct = Math.min(...Object.values(allocations));\n const minRequired = Math.ceil(100 / smallestPct);\n if (totalUsd < minRequired) {\n const smallestAsset = Object.entries(allocations).find(([, p]) => p === smallestPct)?.[0] ?? '?';\n throw new T2000Error(\n 'STRATEGY_MIN_AMOUNT',\n `Minimum $${minRequired} for this strategy (${smallestAsset} at ${smallestPct}% needs at least $1)`,\n );\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport { T2000Error } from './errors.js';\nimport type { AutoInvestSchedule, AutoInvestStatus } from './types.js';\n\ninterface AutoInvestData {\n schedules: AutoInvestSchedule[];\n}\n\nfunction emptyData(): AutoInvestData {\n return { schedules: [] };\n}\n\nfunction computeNextRun(\n frequency: 'daily' | 'weekly' | 'monthly',\n dayOfWeek?: number,\n dayOfMonth?: number,\n from?: Date,\n): string {\n const base = from ?? new Date();\n const next = new Date(base);\n\n switch (frequency) {\n case 'daily':\n next.setDate(next.getDate() + 1);\n next.setHours(0, 0, 0, 0);\n break;\n case 'weekly': {\n const dow = dayOfWeek ?? 1; // Monday default\n next.setDate(next.getDate() + ((7 - next.getDay() + dow) % 7 || 7));\n next.setHours(0, 0, 0, 0);\n break;\n }\n case 'monthly': {\n const dom = dayOfMonth ?? 1;\n next.setMonth(next.getMonth() + 1, dom);\n next.setHours(0, 0, 0, 0);\n break;\n }\n }\n\n return next.toISOString();\n}\n\nexport class AutoInvestManager {\n private data: AutoInvestData = emptyData();\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, 'auto-invest.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.data = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.data = emptyData();\n }\n if (!this.data.schedules) {\n this.data.schedules = [];\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));\n }\n\n setup(params: {\n amount: number;\n frequency: 'daily' | 'weekly' | 'monthly';\n strategy?: string;\n asset?: string;\n dayOfWeek?: number;\n dayOfMonth?: number;\n }): AutoInvestSchedule {\n this.load();\n\n if (!params.strategy && !params.asset) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', 'Either strategy or asset must be specified');\n }\n if (params.amount < 1) {\n throw new T2000Error('AUTO_INVEST_INSUFFICIENT', 'Auto-invest amount must be at least $1');\n }\n\n const schedule: AutoInvestSchedule = {\n id: randomUUID().slice(0, 8),\n strategy: params.strategy,\n asset: params.asset,\n amount: params.amount,\n frequency: params.frequency,\n dayOfWeek: params.dayOfWeek,\n dayOfMonth: params.dayOfMonth,\n nextRun: computeNextRun(params.frequency, params.dayOfWeek, params.dayOfMonth),\n enabled: true,\n totalInvested: 0,\n runCount: 0,\n };\n\n this.data.schedules.push(schedule);\n this.save();\n return schedule;\n }\n\n getStatus(): AutoInvestStatus {\n this.load();\n const now = new Date();\n const pending = this.data.schedules.filter(\n (s) => s.enabled && new Date(s.nextRun) <= now,\n );\n return {\n schedules: [...this.data.schedules],\n pendingRuns: pending,\n };\n }\n\n getSchedule(id: string): AutoInvestSchedule {\n this.load();\n const schedule = this.data.schedules.find((s) => s.id === id);\n if (!schedule) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);\n }\n return schedule;\n }\n\n recordRun(id: string, amountInvested: number): void {\n this.load();\n const schedule = this.data.schedules.find((s) => s.id === id);\n if (!schedule) return;\n\n schedule.lastRun = new Date().toISOString();\n schedule.nextRun = computeNextRun(schedule.frequency, schedule.dayOfWeek, schedule.dayOfMonth);\n schedule.totalInvested += amountInvested;\n schedule.runCount += 1;\n this.save();\n }\n\n stop(id: string): void {\n this.load();\n const schedule = this.data.schedules.find((s) => s.id === id);\n if (!schedule) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);\n }\n schedule.enabled = false;\n this.save();\n }\n\n remove(id: string): void {\n this.load();\n const idx = this.data.schedules.findIndex((s) => s.id === id);\n if (idx === -1) {\n throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);\n }\n this.data.schedules.splice(idx, 1);\n this.save();\n }\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 { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory } from './wallet/history.js';\nimport { calculateFee, reportFee } from './protocols/protocolFee.js';\nimport * as yieldTracker from './protocols/yieldTracker.js';\nimport * as sentinel from './protocols/sentinel.js';\nimport { ProtocolRegistry } from './adapters/registry.js';\nimport { NaviAdapter } from './adapters/navi.js';\nimport { CetusAdapter } from './adapters/cetus.js';\nimport { buildRawSwapTx } from './protocols/cetus.js';\nimport { SuilendAdapter } from './adapters/suilend.js';\nimport type { LendingAdapter, SwapAdapter } 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 SwapResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n RatesResult,\n PositionsResult,\n TransactionRecord,\n DepositInfo,\n EarningsResult,\n FundStatusResult,\n SentinelAgent,\n SentinelAttackResult,\n RebalanceResult,\n RebalanceStep,\n InvestResult,\n InvestmentPosition,\n PortfolioResult,\n StrategyBuyResult,\n StrategySellResult,\n StrategyRebalanceResult,\n StrategyStatusResult,\n AutoInvestSchedule,\n AutoInvestStatus,\n AutoInvestRunResult,\n ClaimRewardsResult,\n PendingReward,\n} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, DEFAULT_NETWORK, API_BASE_URL, INVESTMENT_ASSETS, GAS_RESERVE_MIN, DEFAULT_MAX_LEVERAGE, DEFAULT_MAX_POSITION_SIZE } from './constants.js';\nimport type { InvestmentAsset } from './constants.js';\n\nconst LOW_LIQUIDITY_ASSETS = new Set(['GOLD']);\n\nconst REWARD_TOKEN_DECIMALS: Record<string, number> = {\n '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT': 9,\n '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP': 6,\n '0x83556891f4a0f233ce7b05cfe7f957d4020492a34f5405b2cb9377d060bef4bf::spring_sui::SPRING_SUI': 9,\n};\nfunction defaultSlippage(asset: string): number {\n return LOW_LIQUIDITY_ASSETS.has(asset) ? 0.05 : 0.03;\n}\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 { PortfolioManager } from './portfolio.js';\nimport { StrategyManager } from './strategy.js';\nimport { AutoInvestManager } from './auto-invest.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 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 readonly portfolio: PortfolioManager;\n readonly strategies: StrategyManager;\n readonly autoInvest: AutoInvestManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string) {\n super();\n this.keypair = keypair;\n this.client = client;\n this._address = getAddress(keypair);\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n this.portfolio = new PortfolioManager(configDir);\n this.strategies = new StrategyManager(configDir);\n this.autoInvest = new AutoInvestManager(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 const cetusAdapter = new CetusAdapter();\n cetusAdapter.initSync(client);\n registry.registerSwap(cetusAdapter);\n const suilendAdapter = new SuilendAdapter();\n suilendAdapter.initSync(client);\n registry.registerLending(suilendAdapter);\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 }> {\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 if (options.sponsored !== false) {\n try {\n await callSponsorApi(address, options.name);\n sponsored = true;\n } catch {\n // Sponsor unavailable — agent can still be funded manually\n }\n }\n\n return { agent, address, sponsored };\n }\n\n // -- Gas --\n\n /** SuiJsonRpcClient used by this agent — exposed for x402 and other integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for x402 and other integrations. */\n get signer(): Ed25519Keypair {\n return this.keypair;\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 if (asset in INVESTMENT_ASSETS) {\n const free = await this.getFreeBalance(asset);\n if (params.amount > free) {\n const pos = this.portfolio.getPosition(asset);\n const invested = pos?.totalAmount ?? 0;\n throw new T2000Error('INVESTMENT_LOCKED',\n `Cannot send ${params.amount} ${asset} — ${invested.toFixed(4)} ${asset} is invested. Free ${asset}: ${free.toFixed(4)}\\nTo access invested funds: t2000 invest sell ${params.amount} ${asset}`,\n { free, invested, requested: params.amount },\n );\n }\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.keypair, () =>\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 const portfolioPositions = this.portfolio.getPositions();\n const earningAssets = new Set(\n portfolioPositions.filter(p => p.earning).map(p => p.asset),\n );\n\n // --- Phase 1: Fetch prices for all investment assets upfront ---\n const suiPrice = bal.gasReserve.sui > 0\n ? bal.gasReserve.usdEquiv / bal.gasReserve.sui\n : 0;\n const assetPrices: Record<string, number> = { SUI: suiPrice };\n const swapAdapter = this.registry.listSwap()[0];\n\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n if (asset === 'SUI') continue;\n try {\n if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', asset, 1);\n assetPrices[asset] = quote.expectedOutput > 0 ? 1 / quote.expectedOutput : 0;\n }\n } catch { assetPrices[asset] = 0; }\n }\n\n // --- Phase 2: Chain-derived total (wallet + protocol supplies - borrows) ---\n // Wallet value: stablecoins + SUI + investment assets (all in USD)\n let chainTotal = bal.available + bal.gasReserve.usdEquiv;\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n if (asset === 'SUI') continue;\n chainTotal += (bal.assets[asset] ?? 0) * (assetPrices[asset] ?? 0);\n }\n\n // Protocol positions: adapters return amounts in asset units.\n // Stablecoins are ~1:1 USD. Non-stablecoins are approximate until\n // adapters return proper USD values.\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 if (!earningAssets.has(pos.asset)) {\n bal.savings += usdValue;\n }\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 // --- Phase 3: Investment P&L breakdown (display only, does not affect total) ---\n try {\n const trackedAmounts: Record<string, number> = {};\n const trackedCostBasis: Record<string, number> = {};\n const earningAssetSet = new Set<string>();\n\n for (const pos of portfolioPositions) {\n if (!(pos.asset in INVESTMENT_ASSETS)) continue;\n trackedAmounts[pos.asset] = (trackedAmounts[pos.asset] ?? 0) + pos.totalAmount;\n trackedCostBasis[pos.asset] = (trackedCostBasis[pos.asset] ?? 0) + pos.costBasis;\n if (pos.earning) earningAssetSet.add(pos.asset);\n }\n for (const key of this.portfolio.getAllStrategyKeys()) {\n for (const sp of this.portfolio.getStrategyPositions(key)) {\n if (!(sp.asset in INVESTMENT_ASSETS)) continue;\n trackedAmounts[sp.asset] = (trackedAmounts[sp.asset] ?? 0) + sp.totalAmount;\n trackedCostBasis[sp.asset] = (trackedCostBasis[sp.asset] ?? 0) + sp.costBasis;\n }\n }\n\n let investmentValue = 0;\n let investmentCostBasis = 0;\n let trackedValue = 0;\n\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n const price = assetPrices[asset] ?? 0;\n const tracked = trackedAmounts[asset] ?? 0;\n const costBasis = trackedCostBasis[asset] ?? 0;\n\n if (asset === 'SUI') {\n const actualSui = earningAssetSet.has('SUI') ? tracked : Math.min(tracked, bal.gasReserve.sui);\n investmentValue += actualSui * price;\n trackedValue += actualSui * price;\n if (actualSui < tracked && tracked > 0) {\n investmentCostBasis += costBasis * (actualSui / tracked);\n } else {\n investmentCostBasis += costBasis;\n }\n if (!earningAssetSet.has('SUI')) {\n const gasSui = Math.max(0, bal.gasReserve.sui - tracked);\n bal.gasReserve = { sui: gasSui, usdEquiv: gasSui * price };\n }\n } else {\n const onChainAmount = bal.assets[asset] ?? 0;\n const effectiveAmount = Math.max(tracked, onChainAmount);\n investmentValue += effectiveAmount * price;\n trackedValue += tracked * price;\n investmentCostBasis += costBasis;\n }\n }\n\n bal.investment = investmentValue;\n bal.investmentPnL = trackedValue - investmentCostBasis;\n } catch {\n bal.investment = 0;\n bal.investmentPnL = 0;\n }\n\n // --- Phase 4: Pending rewards ---\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 // Total is chain-derived — always accurate regardless of categorization\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 deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'Sui (mainnet)',\n supportedAssets: ['USDC'],\n instructions: [\n `Send USDC on Sui to: ${this._address}`,\n '',\n 'From a CEX (Coinbase, Binance):',\n ` 1. Withdraw USDC`,\n ` 2. Select \"Sui\" network`,\n ` 3. Paste address: ${truncateAddress(this._address)}`,\n '',\n 'From another Sui wallet:',\n ` Transfer USDC to ${truncateAddress(this._address)}`,\n ].join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n async registerAdapter(adapter: LendingAdapter | SwapAdapter): Promise<void> {\n await adapter.init(this.client);\n if ('buildSaveTx' in adapter) this.registry.registerLending(adapter as LendingAdapter);\n if ('buildSwapTx' in adapter) this.registry.registerSwap(adapter as SwapAdapter);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; protocol?: string }): Promise<SaveResult> {\n this.enforcer.assertNotLocked();\n const asset = 'USDC';\n const bal = await queryBalance(this.client, this._address);\n const usdcBalance = bal.stables.USDC ?? 0;\n\n const needsAutoConvert =\n params.amount === 'all'\n ? Object.entries(bal.stables).some(([k, v]) => k !== 'USDC' && v > 0.01)\n : typeof params.amount === 'number' && params.amount > usdcBalance;\n\n let amount: number;\n if (params.amount === 'all') {\n amount = (bal.available ?? 0) - 1.0;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'Balance too low to save after $1 gas reserve', {\n reason: 'gas_reserve_required', available: bal.available ?? 0,\n });\n }\n } else {\n amount = params.amount;\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 swapAdapter = this.registry.listSwap()[0];\n const canPTB = adapter.addSaveToTx && (!needsAutoConvert || swapAdapter?.addSwapToTx);\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB && needsAutoConvert) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const usdcCoins: TransactionObjectArgument[] = [];\n\n // Swap non-USDC stables → USDC within the same PTB\n for (const [stableAsset, stableAmount] of Object.entries(bal.stables)) {\n if (stableAsset === 'USDC' || stableAmount <= 0.01) continue;\n const assetInfo = SUPPORTED_ASSETS[stableAsset as keyof typeof SUPPORTED_ASSETS];\n if (!assetInfo) continue;\n\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) continue;\n\n const merged = this._mergeCoinsInTx(tx, coins);\n const { outputCoin } = await swapAdapter!.addSwapToTx!(\n tx, this._address, merged, stableAsset, 'USDC', stableAmount,\n );\n usdcCoins.push(outputCoin);\n }\n\n // Add existing wallet USDC\n const existingUsdc = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (existingUsdc.length > 0) {\n usdcCoins.push(this._mergeCoinsInTx(tx, existingUsdc));\n }\n\n // Merge all USDC into one coin\n if (usdcCoins.length > 1) {\n tx.mergeCoins(usdcCoins[0], usdcCoins.slice(1));\n }\n\n await adapter.addSaveToTx!(tx, this._address, usdcCoins[0], asset, { collectFee: true });\n return tx;\n }\n\n if (canPTB && !needsAutoConvert) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const existingUsdc = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (existingUsdc.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n\n const merged = this._mergeCoinsInTx(tx, existingUsdc);\n const rawAmount = BigInt(Math.floor(saveAmount * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n const [depositCoin] = tx.splitCoins(merged, [rawAmount]);\n await adapter.addSaveToTx!(tx, this._address, depositCoin, asset, { collectFee: true });\n return tx;\n }\n\n // Fallback: non-composable path\n if (needsAutoConvert) {\n await this._convertWalletStablesToUsdc(bal, params.amount === 'all' ? undefined : amount - usdcBalance);\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 try {\n const positions = await this.positions();\n savingsBalance = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n } catch {\n // query failed — fall back to deposit amount\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'; protocol?: string }): Promise<WithdrawResult> {\n this.enforcer.assertNotLocked();\n if (params.amount === 'all' && !params.protocol) {\n return this.withdrawAllProtocols();\n }\n\n // Find the actual position to withdraw from (may be non-USDC after rebalance).\n // Exclude assets tracked as earning in portfolio (managed via invest unearn).\n const allPositions = await this.registry.allPositions(this._address);\n const earningAssets = new Set(\n this.portfolio.getPositions().filter(p => p.earning).map(p => p.asset),\n );\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 && !earningAssets.has(s.asset)) {\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', 'No savings to withdraw');\n }\n\n // Prefer USDC positions to avoid unnecessary swaps, then lowest-APY first\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 swapAdapter = target.asset !== 'USDC' ? this.registry.listSwap()[0] : undefined;\n const canPTB = adapter.addWithdrawToTx && (!swapAdapter || swapAdapter.addSwapToTx);\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB) {\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\n if (target.asset !== 'USDC' && swapAdapter?.addSwapToTx) {\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx(\n tx, this._address, coin, target.asset, 'USDC', effectiveAmount, 500,\n );\n finalAmount = estimatedOut / 10 ** toDecimals;\n tx.transferObjects([outputCoin], this._address);\n } else {\n tx.transferObjects([coin], this._address);\n }\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('USDC', finalAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: finalAmount,\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 // Skip positions that are investment-earning (managed via invest sell/unearn)\n const earningAssets = new Set(\n this.portfolio.getPositions().filter(p => p.earning).map(p => p.asset),\n );\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 && !earningAssets.has(supply.asset)) {\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 // Pre-check maxWithdraw per protocol, then distribute across entries\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 const DUST_SWAP_THRESHOLD = 1.0;\n const swappableEntries = entries.filter(e => e.asset === 'USDC' || e.maxAmount >= DUST_SWAP_THRESHOLD);\n const dustEntries = entries.filter(e => e.asset !== 'USDC' && e.maxAmount < DUST_SWAP_THRESHOLD);\n const hasNonUsdc = swappableEntries.some(e => e.asset !== 'USDC');\n const swapAdapter = hasNonUsdc ? this.registry.listSwap()[0] : undefined;\n const canPTB = swappableEntries.every(e => e.adapter.addWithdrawToTx) && (!swapAdapter || swapAdapter.addSwapToTx);\n\n let totalUsdcReceived = 0;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const usdcCoins: TransactionObjectArgument[] = [];\n\n for (const entry of swappableEntries) {\n const { coin, effectiveAmount } = await entry.adapter.addWithdrawToTx!(\n tx, this._address, entry.maxAmount, entry.asset,\n );\n\n if (entry.asset === 'USDC') {\n totalUsdcReceived += effectiveAmount;\n usdcCoins.push(coin);\n } else if (swapAdapter?.addSwapToTx) {\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx(\n tx, this._address, coin, entry.asset, 'USDC', effectiveAmount, 500,\n );\n totalUsdcReceived += estimatedOut / 10 ** toDecimals;\n usdcCoins.push(outputCoin);\n } else {\n totalUsdcReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n }\n\n for (const dust of dustEntries) {\n if (dust.adapter.addWithdrawToTx) {\n const { coin, effectiveAmount } = await dust.adapter.addWithdrawToTx!(\n tx, this._address, dust.maxAmount, dust.asset,\n );\n totalUsdcReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n }\n\n if (usdcCoins.length > 1) {\n tx.mergeCoins(usdcCoins[0], usdcCoins.slice(1));\n }\n if (usdcCoins.length > 0) {\n tx.transferObjects([usdcCoins[0]], this._address);\n }\n return tx;\n }\n\n // Fallback: sequential withdraw + swap per entry\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 totalUsdcReceived += built.effectiveAmount;\n lastTx = built.tx;\n }\n if (hasNonUsdc && swapAdapter) {\n await this._convertWalletStablesToUsdc(await queryBalance(this.client, this._address));\n }\n return lastTx!;\n });\n\n if (totalUsdcReceived <= 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: totalUsdcReceived,\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 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 async _swapToUsdc(asset: string, amount: number): Promise<{ usdcReceived: number; digest: string; gasCost: number }> {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n\n let estimatedOut = 0;\n let toDecimals = 6;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await swapAdapter.buildSwapTx(this._address, asset, 'USDC', amount);\n estimatedOut = built.estimatedOut;\n toDecimals = built.toDecimals;\n return built.tx;\n });\n\n const usdcReceived = estimatedOut / 10 ** toDecimals;\n return { usdcReceived, digest: gasResult.digest, gasCost: gasResult.gasCostSui };\n }\n\n private async _swapFromUsdc(toAsset: string, amount: number): Promise<{ received: number; digest: string; gasCost: number }> {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n\n let estimatedOut = 0;\n let toDecimals = 6;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await swapAdapter.buildSwapTx(this._address, 'USDC', toAsset, amount);\n estimatedOut = built.estimatedOut;\n toDecimals = built.toDecimals;\n return built.tx;\n });\n\n const received = estimatedOut / 10 ** toDecimals;\n return { received, digest: gasResult.digest, gasCost: gasResult.gasCostSui };\n }\n\n private async _convertWalletStablesToUsdc(bal: BalanceResponse, amountNeeded?: number): Promise<void> {\n const nonUsdcStables: Array<{ asset: string; amount: number }> = [];\n for (const [asset, amount] of Object.entries(bal.stables)) {\n if (asset !== 'USDC' && amount > 0.01) {\n nonUsdcStables.push({ asset, amount });\n }\n }\n if (nonUsdcStables.length === 0) return;\n\n // Sort largest balance first for efficiency\n nonUsdcStables.sort((a, b) => b.amount - a.amount);\n\n let converted = 0;\n for (const entry of nonUsdcStables) {\n if (amountNeeded !== undefined && converted >= amountNeeded) break;\n try {\n await this._swapToUsdc(entry.asset, entry.amount);\n converted += entry.amount;\n } catch {\n // Skip this asset if swap fails, continue with others\n }\n }\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 private async adjustMaxBorrowForInvestments(\n adapter: import('./adapters/types.js').LendingAdapter,\n maxResult: MaxBorrowResult,\n ): Promise<MaxBorrowResult> {\n const earningPositions = this.portfolio.getPositions().filter(p => p.earning);\n if (earningPositions.length === 0) return maxResult;\n\n let investmentCollateralUsd = 0;\n const swapAdapter = this.registry.listSwap()[0];\n\n for (const pos of earningPositions) {\n if (pos.earningProtocol !== adapter.id) continue;\n try {\n let price = 0;\n if (pos.asset === 'SUI' && swapAdapter) {\n price = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', pos.asset, 1);\n price = quote.expectedOutput > 0 ? 1 / quote.expectedOutput : 0;\n }\n investmentCollateralUsd += pos.totalAmount * price;\n } catch { /* keep zero */ }\n }\n\n if (investmentCollateralUsd <= 0) return maxResult;\n\n const CONSERVATIVE_LTV = 0.60;\n const investmentBorrowCapacity = investmentCollateralUsd * CONSERVATIVE_LTV;\n const adjustedMax = Math.max(0, maxResult.maxAmount - investmentBorrowCapacity);\n\n return { ...maxResult, maxAmount: adjustedMax };\n }\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 rawMax = await adapter.maxBorrow(this._address, asset);\n const maxResult = await this.adjustMaxBorrowForInvestments(adapter, rawMax);\n if (maxResult.maxAmount <= 0) {\n const hasInvestmentEarning = this.portfolio.getPositions().some(p => p.earning && p.earningProtocol === adapter.id);\n if (hasInvestmentEarning) {\n throw new T2000Error('BORROW_GUARD_INVESTMENT',\n 'Max safe borrow: $0.00. Only savings deposits (stablecoins) count as borrowable collateral. Investment collateral (SUI, ETH, BTC) is excluded.');\n }\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.keypair, 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 // Find actual borrows (may be non-USDC from rebalance or legacy)\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 // Repay highest-interest borrow first\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 const swapAdapter = target.asset !== 'USDC' ? this.registry.listSwap()[0] : undefined;\n const canPTB = adapter.addRepayToTx && (!swapAdapter || swapAdapter.addSwapToTx);\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB && target.asset !== 'USDC' && swapAdapter?.addSwapToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const buffer = repayAmount * 1.005;\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (usdcCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins for swap');\n const merged = this._mergeCoinsInTx(tx, usdcCoins);\n const rawSwap = BigInt(Math.floor(buffer * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n const [splitCoin] = tx.splitCoins(merged, [rawSwap]);\n\n const { outputCoin } = await swapAdapter.addSwapToTx(\n tx, this._address, splitCoin, 'USDC', target.asset, buffer,\n );\n\n await adapter.addRepayToTx!(tx, this._address, outputCoin, target.asset);\n return tx;\n }\n\n if (canPTB && target.asset === 'USDC') {\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 // Fallback: multi-tx\n if (target.asset !== 'USDC') {\n await this._swapFromUsdc(target.asset, repayAmount * 1.005);\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 swapAdapter = this.registry.listSwap()[0];\n const canPTB = entries.every(e => e.adapter.addRepayToTx) &&\n (entries.every(e => e.borrow.asset === 'USDC') || swapAdapter?.addSwapToTx);\n\n let totalRepaid = 0;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n // Pre-fetch USDC coins for any swaps or direct repays\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 if (borrow.asset !== 'USDC' && swapAdapter?.addSwapToTx) {\n const buffer = borrow.amount * 1.005;\n const rawSwap = BigInt(Math.floor(buffer * 10 ** SUPPORTED_ASSETS.USDC.decimals));\n if (!usdcMerged) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC for swap');\n const [splitCoin] = tx.splitCoins(usdcMerged, [rawSwap]);\n\n const { outputCoin } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoin, 'USDC', borrow.asset, buffer,\n );\n await adapter.addRepayToTx!(tx, this._address, outputCoin, borrow.asset);\n } else {\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 }\n totalRepaid += borrow.amount;\n }\n\n return tx;\n }\n\n // Fallback: multi-tx\n let lastTx: Transaction | undefined;\n for (const { borrow, adapter } of entries) {\n if (borrow.asset !== 'USDC') {\n await this._swapFromUsdc(borrow.asset, borrow.amount * 1.005);\n }\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 const rawMax = await adapter.maxBorrow(this._address, 'USDC');\n return this.adjustMaxBorrowForInvestments(adapter, rawMax);\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 // -- Exchange --\n\n async exchange(params: { from: string; to: string; amount: number; maxSlippage?: number; _bypassInvestmentGuard?: boolean }): Promise<SwapResult> {\n this.enforcer.assertNotLocked();\n const fromAsset = params.from as keyof typeof SUPPORTED_ASSETS;\n const toAsset = params.to as keyof typeof SUPPORTED_ASSETS;\n\n if (!(fromAsset in SUPPORTED_ASSETS) || !(toAsset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Swap pair ${fromAsset}/${toAsset} is not supported`);\n }\n if (fromAsset === toAsset) {\n throw new T2000Error('INVALID_AMOUNT', 'Cannot swap same asset');\n }\n\n if (!params._bypassInvestmentGuard && fromAsset in INVESTMENT_ASSETS) {\n const free = await this.getFreeBalance(fromAsset);\n if (params.amount > free) {\n const pos = this.portfolio.getPosition(fromAsset);\n const invested = pos?.totalAmount ?? 0;\n throw new T2000Error('INVESTMENT_LOCKED',\n `Cannot exchange ${params.amount} ${fromAsset} — ${invested.toFixed(4)} ${fromAsset} is invested. Free ${fromAsset}: ${free.toFixed(4)}\\nTo sell investment: t2000 invest sell ${params.amount} ${fromAsset}`,\n { free, invested, requested: params.amount },\n );\n }\n }\n\n const best = await this.registry.bestSwapQuote(fromAsset, toAsset, params.amount);\n const adapter = best.adapter;\n\n const fee = calculateFee('swap', params.amount);\n const swapAmount = params.amount;\n const slippageBps = params.maxSlippage ? params.maxSlippage * 100 : undefined;\n\n let swapMeta: { estimatedOut: number; toDecimals: number } = { estimatedOut: 0, toDecimals: 0 };\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await adapter.buildSwapTx(this._address, fromAsset, toAsset, swapAmount, slippageBps);\n swapMeta = { estimatedOut: built.estimatedOut, toDecimals: built.toDecimals };\n return built.tx;\n });\n\n const toInfo = SUPPORTED_ASSETS[toAsset];\n await this.client.waitForTransaction({ digest: gasResult.digest });\n const txDetail = await this.client.getTransactionBlock({\n digest: gasResult.digest,\n options: { showBalanceChanges: true },\n });\n\n let actualReceived = 0;\n if (txDetail.balanceChanges) {\n for (const change of txDetail.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === this._address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = swapMeta.estimatedOut / 10 ** swapMeta.toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n reportFee(this._address, 'swap', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(fromAsset, swapAmount, 'swap', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n fromAmount: swapAmount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async exchangeQuote(params: { from: string; to: string; amount: number }): Promise<{\n expectedOutput: number;\n priceImpact: number;\n poolPrice: number;\n fee: { amount: number; rate: number };\n }> {\n const fromAsset = params.from;\n const toAsset = params.to;\n const best = await this.registry.bestSwapQuote(fromAsset, toAsset, params.amount);\n const fee = calculateFee('swap', params.amount);\n return { ...best.quote, fee: { amount: fee.amount, rate: fee.rate } };\n }\n\n // -- Investment --\n\n async investBuy(params: { asset: InvestmentAsset; usdAmount: number; maxSlippage?: number }): Promise<InvestResult> {\n this.enforcer.assertNotLocked();\n\n if (!params.usdAmount || params.usdAmount <= 0 || !isFinite(params.usdAmount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Investment amount must be greater than $0');\n }\n\n this.enforcer.check({ operation: 'invest', amount: params.usdAmount });\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const bal = await queryBalance(this.client, this._address);\n if (bal.available < params.usdAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient checking balance. Available: $${bal.available.toFixed(2)}, requested: $${params.usdAmount.toFixed(2)}`);\n }\n\n let swapResult: Awaited<ReturnType<typeof this.exchange>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.exchange({\n from: 'USDC',\n to: params.asset,\n amount: params.usdAmount,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\n _bypassInvestmentGuard: true,\n });\n break;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const isSlippage = msg.includes('slippage') || msg.includes('amount_out_slippage');\n if (isSlippage && attempt < maxRetries) {\n await new Promise(r => setTimeout(r, 2000 * (attempt + 1)));\n continue;\n }\n throw err;\n }\n }\n\n if (swapResult.toAmount === 0) {\n throw new T2000Error('SWAP_FAILED', 'Swap returned zero tokens — try a different amount or check liquidity');\n }\n\n const price = params.usdAmount / swapResult.toAmount;\n\n this.portfolio.recordBuy({\n id: `inv_${Date.now()}`,\n type: 'buy',\n asset: params.asset,\n amount: swapResult.toAmount,\n price,\n usdValue: params.usdAmount,\n fee: swapResult.fee,\n tx: swapResult.tx,\n timestamp: new Date().toISOString(),\n });\n\n const pos = this.portfolio.getPosition(params.asset);\n const currentPrice = price;\n const position: InvestmentPosition = {\n asset: params.asset,\n totalAmount: pos?.totalAmount ?? swapResult.toAmount,\n costBasis: pos?.costBasis ?? params.usdAmount,\n avgPrice: pos?.avgPrice ?? price,\n currentPrice,\n currentValue: (pos?.totalAmount ?? swapResult.toAmount) * currentPrice,\n unrealizedPnL: 0,\n unrealizedPnLPct: 0,\n trades: pos?.trades ?? [],\n };\n\n return {\n success: true,\n tx: swapResult.tx,\n type: 'buy',\n asset: params.asset,\n amount: swapResult.toAmount,\n price,\n usdValue: params.usdAmount,\n fee: swapResult.fee,\n gasCost: swapResult.gasCost,\n gasMethod: swapResult.gasMethod,\n position,\n };\n }\n\n async investSell(params: { asset: InvestmentAsset; usdAmount: number | 'all'; maxSlippage?: number; _strategyOnly?: boolean }): Promise<InvestResult> {\n this.enforcer.assertNotLocked();\n\n if (params.usdAmount !== 'all') {\n if (!params.usdAmount || params.usdAmount <= 0 || !isFinite(params.usdAmount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Sell amount must be greater than $0');\n }\n }\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const pos = this.portfolio.getPosition(params.asset);\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${params.asset} position to sell`);\n }\n\n const didAutoWithdraw = !!(pos.earning && pos.earningProtocol);\n if (didAutoWithdraw) {\n const unearnResult = await this.investUnearn({ asset: params.asset });\n if (unearnResult.tx) {\n await this.client.waitForTransaction({ digest: unearnResult.tx, options: { showEffects: true } });\n }\n }\n\n const assetInfo = SUPPORTED_ASSETS[params.asset as keyof typeof SUPPORTED_ASSETS];\n const gasReserve = params.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n\n let walletAmount = 0;\n for (let attempt = 0; ; attempt++) {\n const assetBalance = await this.client.getBalance({\n owner: this._address,\n coinType: assetInfo.type,\n });\n walletAmount = Number(assetBalance.totalBalance) / (10 ** assetInfo.decimals);\n if (!didAutoWithdraw || walletAmount > gasReserve || attempt >= 5) break;\n await new Promise(r => setTimeout(r, 1500));\n }\n\n const maxSellable = Math.max(0, walletAmount - gasReserve);\n\n let sellAmountAsset: number;\n if (params.usdAmount === 'all') {\n sellAmountAsset = Math.min(pos.totalAmount, maxSellable);\n } else {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n const quote = await swapAdapter.getQuote('USDC', params.asset, 1);\n const assetPrice = 1 / quote.expectedOutput;\n sellAmountAsset = params.usdAmount / assetPrice;\n // For strategy sells, cap to wallet balance; for direct sells, cap to tracked position\n const maxPosition = params._strategyOnly ? maxSellable : pos.totalAmount;\n sellAmountAsset = Math.min(sellAmountAsset, maxPosition);\n if (sellAmountAsset > maxSellable) {\n throw new T2000Error(\n 'INSUFFICIENT_INVESTMENT',\n `Cannot sell $${params.usdAmount.toFixed(2)} — max sellable: $${(maxSellable * assetPrice).toFixed(2)} (gas reserve: ${gasReserve} ${params.asset})`,\n );\n }\n }\n\n if (sellAmountAsset <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', 'Nothing to sell after gas reserve');\n }\n\n let swapResult: Awaited<ReturnType<typeof this.exchange>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.exchange({\n from: params.asset,\n to: 'USDC',\n amount: sellAmountAsset,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\n _bypassInvestmentGuard: true,\n });\n break;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const isSlippage = msg.includes('slippage') || msg.includes('amount_out_slippage');\n if (isSlippage && attempt < maxRetries) {\n await new Promise(r => setTimeout(r, 2000 * (attempt + 1)));\n continue;\n }\n throw err;\n }\n }\n\n const price = swapResult.toAmount / sellAmountAsset;\n\n const realizedPnL = this.portfolio.recordSell({\n id: `inv_${Date.now()}`,\n type: 'sell',\n asset: params.asset,\n amount: sellAmountAsset,\n price,\n usdValue: swapResult.toAmount,\n fee: swapResult.fee,\n tx: swapResult.tx,\n timestamp: new Date().toISOString(),\n });\n\n if (params.usdAmount === 'all' && !params._strategyOnly) {\n this.portfolio.closePosition(params.asset);\n }\n\n const updatedPos = this.portfolio.getPosition(params.asset);\n const position: InvestmentPosition = {\n asset: params.asset,\n totalAmount: updatedPos?.totalAmount ?? 0,\n costBasis: updatedPos?.costBasis ?? 0,\n avgPrice: updatedPos?.avgPrice ?? 0,\n currentPrice: price,\n currentValue: (updatedPos?.totalAmount ?? 0) * price,\n unrealizedPnL: 0,\n unrealizedPnLPct: 0,\n trades: updatedPos?.trades ?? [],\n };\n\n return {\n success: true,\n tx: swapResult.tx,\n type: 'sell',\n asset: params.asset,\n amount: sellAmountAsset,\n price,\n usdValue: swapResult.toAmount,\n fee: swapResult.fee,\n gasCost: swapResult.gasCost,\n gasMethod: swapResult.gasMethod,\n realizedPnL,\n position,\n };\n }\n\n async investEarn(params: { asset: InvestmentAsset; protocol?: string }): Promise<import('./types.js').InvestEarnResult> {\n this.enforcer.assertNotLocked();\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const pos = this.portfolio.getPosition(params.asset);\n if (!pos || pos.totalAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${params.asset} position to earn on`);\n }\n\n const assetInfo = SUPPORTED_ASSETS[params.asset as keyof typeof SUPPORTED_ASSETS];\n const assetBalance = await this.client.getBalance({\n owner: this._address,\n coinType: assetInfo.type,\n });\n const walletAmount = Number(assetBalance.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = params.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const depositAmount = Math.min(pos.totalAmount, Math.max(0, walletAmount - gasReserve));\n\n if (pos.earning && depositAmount <= 0) {\n return {\n success: true,\n tx: '',\n asset: params.asset,\n amount: 0,\n protocol: pos.earningProtocol ?? 'unknown',\n apy: pos.earningApy ?? 0,\n gasCost: 0,\n gasMethod: 'none',\n };\n }\n if (depositAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${params.asset} available to deposit (wallet: ${walletAmount}, gas reserve: ${gasReserve})`);\n }\n\n let adapter: import('./adapters/types.js').LendingAdapter;\n let rate: import('./adapters/types.js').LendingRates;\n\n if (params.protocol) {\n const specific = this.registry.getLending(params.protocol);\n if (!specific) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${params.protocol} not found`);\n adapter = specific;\n rate = await specific.getRates(params.asset);\n } else {\n ({ adapter, rate } = await this.registry.bestSaveRate(params.asset));\n }\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const { tx } = await adapter.buildSaveTx(this._address, depositAmount, params.asset);\n return tx;\n });\n\n this.portfolio.recordEarn(params.asset, adapter.id, rate.saveApy);\n\n return {\n success: true,\n tx: gasResult.digest,\n asset: params.asset,\n amount: depositAmount,\n protocol: adapter.name,\n apy: rate.saveApy,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async investUnearn(params: { asset: InvestmentAsset }): Promise<import('./types.js').InvestEarnResult> {\n this.enforcer.assertNotLocked();\n\n if (!(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not available for investment`);\n }\n\n const pos = this.portfolio.getPosition(params.asset);\n if (!pos || !pos.earning || !pos.earningProtocol) {\n throw new T2000Error('INVEST_NOT_EARNING', `${params.asset} is not currently earning`);\n }\n\n const adapter = this.registry.getLending(pos.earningProtocol);\n if (!adapter) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Lending protocol ${pos.earningProtocol} not found`);\n }\n\n // Withdraw only the tracked investment amount, not the entire protocol position\n // (the protocol may hold more from regular savings or previous runs)\n const withdrawAmount = pos.totalAmount;\n\n const protocolName = adapter.name;\n let effectiveAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const result = await adapter.buildWithdrawTx(this._address, withdrawAmount, params.asset);\n effectiveAmount = result.effectiveAmount;\n return result.tx;\n });\n\n this.portfolio.recordUnearn(params.asset);\n\n return {\n success: true,\n tx: gasResult.digest,\n asset: params.asset,\n amount: effectiveAmount,\n protocol: protocolName,\n apy: 0,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n // -- Invest Rebalance --\n\n async investRebalance(opts: { dryRun?: boolean; minYieldDiff?: number } = {}): Promise<import('./types.js').InvestRebalanceResult> {\n this.enforcer.assertNotLocked();\n\n const minDiff = opts.minYieldDiff ?? 0.1;\n const positions = this.portfolio.getPositions().filter((p) => p.earning && p.earningProtocol);\n\n if (positions.length === 0) {\n return { executed: false, moves: [], totalGasCost: 0, skipped: [] };\n }\n\n const moves: import('./types.js').InvestRebalanceMove[] = [];\n const skipped: import('./types.js').InvestRebalanceResult['skipped'] = [];\n let totalGasCost = 0;\n\n for (const pos of positions) {\n const currentProtocol = pos.earningProtocol!;\n\n let best: { adapter: import('./adapters/types.js').LendingAdapter; rate: import('./adapters/types.js').LendingRates };\n try {\n best = await this.registry.bestSaveRate(pos.asset);\n } catch {\n const currentApy = pos.earningApy ?? 0;\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: currentApy, reason: 'no_rates' });\n continue;\n }\n\n // Use live rate for current protocol instead of stale stored rate\n let currentApy = pos.earningApy ?? 0;\n try {\n const currentAdapter = this.registry.getLending(currentProtocol);\n if (currentAdapter) {\n const liveRate = await currentAdapter.getRates(pos.asset);\n currentApy = liveRate.saveApy;\n }\n } catch { /* fall back to stored rate */ }\n\n const apyGain = best.rate.saveApy - currentApy;\n\n if (best.adapter.id === currentProtocol || apyGain <= 0) {\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: 'already_best' });\n continue;\n }\n\n if (apyGain < minDiff) {\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: 'below_threshold' });\n continue;\n }\n\n if (opts.dryRun) {\n moves.push({\n asset: pos.asset,\n fromProtocol: this.registry.getLending(currentProtocol)?.name ?? currentProtocol,\n toProtocol: best.adapter.name,\n amount: pos.totalAmount,\n oldApy: currentApy,\n newApy: best.rate.saveApy,\n txDigests: [],\n gasCost: 0,\n });\n continue;\n }\n\n const txDigests: string[] = [];\n let moveGasCost = 0;\n\n const fromAdapter = this.registry.getLending(currentProtocol);\n if (!fromAdapter) {\n skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: 'protocol_unavailable' });\n continue;\n }\n\n const withdrawResult = await executeWithGas(this.client, this.keypair, async () => {\n const result = await fromAdapter.buildWithdrawTx(this._address, pos.totalAmount, pos.asset);\n return result.tx;\n });\n txDigests.push(withdrawResult.digest);\n moveGasCost += withdrawResult.gasCostSui;\n\n const depositResult = await executeWithGas(this.client, this.keypair, async () => {\n const assetInfo = SUPPORTED_ASSETS[pos.asset as keyof typeof SUPPORTED_ASSETS];\n const balance = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const available = Number(balance.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = pos.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const depositAmount = Math.max(0, available - gasReserve);\n const { tx } = await best.adapter.buildSaveTx(this._address, depositAmount, pos.asset);\n return tx;\n });\n txDigests.push(depositResult.digest);\n moveGasCost += depositResult.gasCostSui;\n\n this.portfolio.recordUnearn(pos.asset);\n this.portfolio.recordEarn(pos.asset, best.adapter.id, best.rate.saveApy);\n\n moves.push({\n asset: pos.asset,\n fromProtocol: fromAdapter.name,\n toProtocol: best.adapter.name,\n amount: pos.totalAmount,\n oldApy: currentApy,\n newApy: best.rate.saveApy,\n txDigests,\n gasCost: moveGasCost,\n });\n totalGasCost += moveGasCost;\n }\n\n return { executed: !opts.dryRun && moves.length > 0, moves, totalGasCost, skipped };\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\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, usdcReceived: 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, usdcReceived: 0, gasCost: 0, gasMethod: 'none' };\n }\n\n const claimResult = await executeWithGas(this.client, this.keypair, async () => tx);\n await this.client.waitForTransaction({ digest: claimResult.digest });\n\n const usdcReceived = await this.swapRewardTokensToUsdc(allRewards);\n\n return {\n success: true,\n tx: claimResult.digest,\n rewards: allRewards,\n totalValueUsd: usdcReceived,\n usdcReceived,\n gasCost: claimResult.gasCostSui,\n gasMethod: claimResult.gasMethod,\n };\n }\n\n private async swapRewardTokensToUsdc(rewards: PendingReward[]): Promise<number> {\n const uniqueTokens = [...new Set(rewards.map(r => r.coinType))];\n const usdcType = SUPPORTED_ASSETS.USDC.type;\n const usdcDecimals = SUPPORTED_ASSETS.USDC.decimals;\n let totalUsdc = 0;\n\n for (const coinType of uniqueTokens) {\n try {\n const balResult = await this.client.getBalance({\n owner: this._address,\n coinType,\n });\n const rawBalance = BigInt(balResult.totalBalance);\n if (rawBalance <= 0n) continue;\n\n const decimals = REWARD_TOKEN_DECIMALS[coinType] ?? 9;\n\n const swapResult = await buildRawSwapTx({\n client: this.client,\n address: this._address,\n fromCoinType: coinType,\n fromDecimals: decimals,\n toCoinType: usdcType,\n toDecimals: usdcDecimals,\n amount: rawBalance,\n });\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => swapResult.tx);\n await this.client.waitForTransaction({ digest: gasResult.digest });\n\n totalUsdc += swapResult.estimatedOut / 10 ** usdcDecimals;\n } catch {\n // If swap fails for a token (e.g. no liquidity), skip it\n }\n }\n\n return totalUsdc;\n }\n\n // -- Strategies --\n\n async investStrategy(params: { strategy: string; usdAmount: number; dryRun?: boolean }): Promise<StrategyBuyResult> {\n this.enforcer.assertNotLocked();\n const definition = this.strategies.get(params.strategy);\n this.strategies.validateMinAmount(definition.allocations, params.usdAmount);\n\n if (!params.usdAmount || params.usdAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Strategy investment must be > $0');\n }\n\n this.enforcer.check({ operation: 'invest', amount: params.usdAmount });\n\n const bal = await queryBalance(this.client, this._address);\n if (bal.available < params.usdAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance. Available: $${bal.available.toFixed(2)}, requested: $${params.usdAmount.toFixed(2)}`);\n }\n\n const buys: StrategyBuyResult['buys'] = [];\n const allocEntries = Object.entries(definition.allocations);\n\n if (params.dryRun) {\n const swapAdapter = this.registry.listSwap()[0];\n for (const [asset, pct] of allocEntries) {\n const assetUsd = params.usdAmount * (pct / 100);\n let estAmount = 0;\n let estPrice = 0;\n try {\n if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', asset, assetUsd);\n estAmount = quote.expectedOutput;\n estPrice = assetUsd / estAmount;\n }\n } catch { /* price unavailable */ }\n buys.push({ asset, usdAmount: assetUsd, amount: estAmount, price: estPrice, tx: '' });\n }\n return { success: true, strategy: params.strategy, totalInvested: params.usdAmount, buys, gasCost: 0, gasMethod: 'self-funded' };\n }\n\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter?.addSwapToTx) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Swap adapter does not support composable PTB');\n }\n\n let swapMetas: Array<{ asset: string; usdAmount: number; estimatedOut: number; toDecimals: number }> = [];\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n swapMetas = [];\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcCoins = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (usdcCoins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n const mergedUsdc = this._mergeCoinsInTx(tx, usdcCoins);\n\n const splitAmounts = allocEntries.map(([, pct]) =>\n BigInt(Math.floor(params.usdAmount * (pct / 100) * 10 ** SUPPORTED_ASSETS.USDC.decimals)),\n );\n\n const splitCoins = tx.splitCoins(mergedUsdc, splitAmounts);\n const outputCoins: TransactionObjectArgument[] = [];\n\n for (let i = 0; i < allocEntries.length; i++) {\n const [asset] = allocEntries[i];\n const assetUsd = params.usdAmount * (allocEntries[i][1] / 100);\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoins[i], 'USDC', asset, assetUsd,\n );\n\n outputCoins.push(outputCoin);\n swapMetas.push({ asset, usdAmount: assetUsd, estimatedOut, toDecimals });\n }\n\n tx.transferObjects(outputCoins, this._address);\n return tx;\n });\n\n const digest = gasResult.digest;\n const now = new Date().toISOString();\n\n for (const meta of swapMetas) {\n const amount = meta.estimatedOut / (10 ** meta.toDecimals);\n const price = meta.usdAmount / amount;\n\n this.portfolio.recordBuy({\n id: `inv_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n this.portfolio.recordStrategyBuy(params.strategy, {\n id: `strat_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n buys.push({ asset: meta.asset, usdAmount: meta.usdAmount, amount, price, tx: digest });\n }\n\n return {\n success: true,\n strategy: params.strategy,\n totalInvested: params.usdAmount,\n buys,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async sellStrategy(params: { strategy: string }): Promise<StrategySellResult> {\n this.enforcer.assertNotLocked();\n this.strategies.get(params.strategy);\n\n const stratPositions = this.portfolio.getStrategyPositions(params.strategy);\n if (stratPositions.length === 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No positions in strategy '${params.strategy}'`);\n }\n\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter?.addSwapToTx) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Swap adapter does not support composable PTB');\n }\n\n // Phase 0: Unearn any earning assets so coins are in the wallet\n for (const pos of stratPositions) {\n const directPos = this.portfolio.getPosition(pos.asset);\n if (directPos?.earning && directPos.earningProtocol) {\n await this.investUnearn({ asset: pos.asset as InvestmentAsset });\n // Wait for coins to settle\n await new Promise(r => setTimeout(r, 1500));\n }\n }\n\n let swapMetas: Array<{ asset: string; amount: number; estimatedOut: number; toDecimals: number }> = [];\n\n const buildSellPtb = async () => {\n swapMetas = [];\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcOutputs: TransactionObjectArgument[] = [];\n\n for (const pos of stratPositions) {\n const assetInfo = SUPPORTED_ASSETS[pos.asset as keyof typeof SUPPORTED_ASSETS];\n\n const bal = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(bal.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = pos.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const sellAmount = Math.max(0, Math.min(pos.totalAmount, walletAmount) - gasReserve);\n\n if (sellAmount <= 0) continue;\n\n const rawAmount = BigInt(Math.floor(sellAmount * 10 ** assetInfo.decimals));\n\n let splitCoin: TransactionObjectArgument;\n if (pos.asset === 'SUI') {\n [splitCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) continue;\n const merged = this._mergeCoinsInTx(tx, coins);\n [splitCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n\n const slippageBps = LOW_LIQUIDITY_ASSETS.has(pos.asset) ? 500 : 300;\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoin, pos.asset, 'USDC', sellAmount, slippageBps,\n );\n\n usdcOutputs.push(outputCoin);\n swapMetas.push({ asset: pos.asset, amount: sellAmount, estimatedOut, toDecimals });\n }\n\n if (usdcOutputs.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No assets available to sell');\n }\n\n if (usdcOutputs.length > 1) {\n tx.mergeCoins(usdcOutputs[0], usdcOutputs.slice(1));\n }\n tx.transferObjects([usdcOutputs[0]], this._address);\n\n return tx;\n };\n\n let gasResult: import('./gas/index.js').GasExecutionResult;\n const MAX_RETRIES = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n gasResult = await executeWithGas(this.client, this.keypair, buildSellPtb);\n break;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const isSlippage = msg.includes('slippage') || msg.includes('amount_out_slippage');\n if (isSlippage && attempt < MAX_RETRIES) {\n await new Promise(r => setTimeout(r, 2000 * (attempt + 1)));\n continue;\n }\n throw err;\n }\n }\n\n const digest = gasResult.digest;\n const now = new Date().toISOString();\n const sells: StrategySellResult['sells'] = [];\n let totalProceeds = 0;\n let totalPnL = 0;\n\n for (const meta of swapMetas) {\n const usdValue = meta.estimatedOut / (10 ** meta.toDecimals);\n const price = meta.amount > 0 ? usdValue / meta.amount : 0;\n\n const pnl = this.portfolio.recordStrategySell(params.strategy, {\n id: `strat_sell_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: meta.amount,\n price,\n usdValue,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n this.portfolio.recordSell({\n id: `inv_sell_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: meta.amount,\n price,\n usdValue,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n\n sells.push({ asset: meta.asset, amount: meta.amount, usdValue, realizedPnL: pnl, tx: digest });\n totalProceeds += usdValue;\n totalPnL += pnl;\n }\n\n // Clear any residual dust left in the strategy (gas/rounding differences)\n if (this.portfolio.hasStrategyPositions(params.strategy)) {\n this.portfolio.clearStrategy(params.strategy);\n }\n\n return {\n success: true,\n strategy: params.strategy,\n totalProceeds,\n realizedPnL: totalPnL,\n sells,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async rebalanceStrategy(params: { strategy: string }): Promise<StrategyRebalanceResult> {\n this.enforcer.assertNotLocked();\n const definition = this.strategies.get(params.strategy);\n const stratPositions = this.portfolio.getStrategyPositions(params.strategy);\n\n if (stratPositions.length === 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No positions in strategy '${params.strategy}'`);\n }\n\n const swapAdapter = this.registry.listSwap()[0];\n const prices: Record<string, number> = {};\n for (const pos of stratPositions) {\n try {\n if (pos.asset === 'SUI' && swapAdapter) {\n prices[pos.asset] = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const q = await swapAdapter.getQuote('USDC', pos.asset, 1);\n prices[pos.asset] = q.expectedOutput > 0 ? 1 / q.expectedOutput : 0;\n }\n } catch { prices[pos.asset] = 0; }\n }\n\n const totalValue = stratPositions.reduce((s, p) => s + p.totalAmount * (prices[p.asset] ?? 0), 0);\n if (totalValue <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', 'Strategy has no value to rebalance');\n }\n\n const currentWeights: Record<string, number> = {};\n const beforeWeights: Record<string, number> = {};\n for (const pos of stratPositions) {\n const w = ((pos.totalAmount * (prices[pos.asset] ?? 0)) / totalValue) * 100;\n currentWeights[pos.asset] = w;\n beforeWeights[pos.asset] = w;\n }\n\n const threshold = 3; // only rebalance if > 3% off\n\n // Classify each asset as a buy or sell\n const sellOps: Array<{ asset: string; usdAmount: number; assetAmount: number }> = [];\n const buyOps: Array<{ asset: string; usdAmount: number }> = [];\n\n for (const [asset, targetPct] of Object.entries(definition.allocations)) {\n const currentPct = currentWeights[asset] ?? 0;\n const diff = targetPct - currentPct;\n if (Math.abs(diff) < threshold) continue;\n\n const usdDiff = totalValue * (Math.abs(diff) / 100);\n if (usdDiff < 1) continue;\n\n if (diff > 0) {\n buyOps.push({ asset, usdAmount: usdDiff });\n } else {\n const price = prices[asset] ?? 1;\n const assetAmount = price > 0 ? usdDiff / price : 0;\n sellOps.push({ asset, usdAmount: usdDiff, assetAmount });\n }\n }\n\n if (sellOps.length === 0 && buyOps.length === 0) {\n return { success: true, strategy: params.strategy, trades: [], beforeWeights, afterWeights: { ...beforeWeights }, targetWeights: { ...definition.allocations } };\n }\n\n if (!swapAdapter?.addSwapToTx) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'Swap adapter does not support composable PTB');\n }\n\n // Execute all sells and buys in a single PTB\n const tradeMetas: Array<{ action: 'buy' | 'sell'; asset: string; usdAmount: number; estimatedOut: number; toDecimals: number }> = [];\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n tradeMetas.length = 0;\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const usdcCoins: TransactionObjectArgument[] = [];\n\n // Phase 1: Sells (asset → USDC), collecting USDC output coins\n for (const sell of sellOps) {\n const assetInfo = SUPPORTED_ASSETS[sell.asset as keyof typeof SUPPORTED_ASSETS];\n\n const bal = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(bal.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = sell.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const sellAmount = Math.max(0, Math.min(sell.assetAmount, walletAmount) - gasReserve);\n\n if (sellAmount <= 0) continue;\n\n const rawAmount = BigInt(Math.floor(sellAmount * 10 ** assetInfo.decimals));\n\n let splitCoin: TransactionObjectArgument;\n if (sell.asset === 'SUI') {\n [splitCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) continue;\n const merged = this._mergeCoinsInTx(tx, coins);\n [splitCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n const slippageBps = LOW_LIQUIDITY_ASSETS.has(sell.asset) ? 500 : 300;\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoin, sell.asset, 'USDC', sellAmount, slippageBps,\n );\n\n usdcCoins.push(outputCoin);\n tradeMetas.push({ action: 'sell', asset: sell.asset, usdAmount: sell.usdAmount, estimatedOut, toDecimals });\n }\n\n // Phase 2: Merge sell proceeds with wallet USDC for buys\n if (buyOps.length > 0) {\n const walletUsdc = await this._fetchCoins(SUPPORTED_ASSETS.USDC.type);\n if (walletUsdc.length > 0) {\n usdcCoins.push(this._mergeCoinsInTx(tx, walletUsdc));\n }\n\n if (usdcCoins.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC available for rebalance buys');\n }\n\n // Merge all USDC into one coin\n if (usdcCoins.length > 1) {\n tx.mergeCoins(usdcCoins[0], usdcCoins.slice(1));\n }\n const mergedUsdc = usdcCoins[0];\n\n // Phase 3: Buys (USDC → asset)\n const splitAmounts = buyOps.map(b =>\n BigInt(Math.floor(b.usdAmount * 10 ** SUPPORTED_ASSETS.USDC.decimals)),\n );\n const splitCoins = tx.splitCoins(mergedUsdc, splitAmounts);\n const outputCoins: TransactionObjectArgument[] = [];\n\n for (let i = 0; i < buyOps.length; i++) {\n const buy = buyOps[i];\n const slippageBps = LOW_LIQUIDITY_ASSETS.has(buy.asset) ? 500 : 300;\n\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, splitCoins[i], 'USDC', buy.asset, buy.usdAmount, slippageBps,\n );\n\n outputCoins.push(outputCoin);\n tradeMetas.push({ action: 'buy', asset: buy.asset, usdAmount: buy.usdAmount, estimatedOut, toDecimals });\n }\n\n tx.transferObjects(outputCoins, this._address);\n }\n\n return tx;\n });\n\n const digest = gasResult.digest;\n const now = new Date().toISOString();\n const trades: StrategyRebalanceResult['trades'] = [];\n\n for (const meta of tradeMetas) {\n const rawAmount = meta.estimatedOut / (10 ** meta.toDecimals);\n\n if (meta.action === 'sell') {\n const price = meta.usdAmount > 0 && rawAmount > 0 ? meta.usdAmount / rawAmount : prices[meta.asset] ?? 0;\n const assetAmount = prices[meta.asset] > 0 ? meta.usdAmount / prices[meta.asset] : 0;\n\n this.portfolio.recordStrategySell(params.strategy, {\n id: `strat_rebal_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: assetAmount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n this.portfolio.recordSell({\n id: `inv_rebal_${Date.now()}_${meta.asset}`,\n type: 'sell',\n asset: meta.asset,\n amount: assetAmount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n trades.push({ action: 'sell', asset: meta.asset, usdAmount: meta.usdAmount, amount: assetAmount, tx: digest });\n } else {\n const amount = rawAmount;\n const price = meta.usdAmount / amount;\n\n this.portfolio.recordBuy({\n id: `inv_rebal_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n this.portfolio.recordStrategyBuy(params.strategy, {\n id: `strat_rebal_${Date.now()}_${meta.asset}`,\n type: 'buy',\n asset: meta.asset,\n amount,\n price,\n usdValue: meta.usdAmount,\n fee: 0,\n tx: digest,\n timestamp: now,\n });\n trades.push({ action: 'buy', asset: meta.asset, usdAmount: meta.usdAmount, amount, tx: digest });\n }\n }\n\n const afterWeights: Record<string, number> = {};\n const updatedPositions = this.portfolio.getStrategyPositions(params.strategy);\n const newTotal = updatedPositions.reduce((s, p) => s + p.totalAmount * (prices[p.asset] ?? 0), 0);\n for (const p of updatedPositions) {\n afterWeights[p.asset] = newTotal > 0 ? ((p.totalAmount * (prices[p.asset] ?? 0)) / newTotal) * 100 : 0;\n }\n\n return { success: true, strategy: params.strategy, trades, beforeWeights, afterWeights, targetWeights: { ...definition.allocations } };\n }\n\n async getStrategyStatus(name: string): Promise<StrategyStatusResult> {\n const definition = this.strategies.get(name);\n const stratPositions = this.portfolio.getStrategyPositions(name);\n\n const swapAdapter = this.registry.listSwap()[0];\n const prices: Record<string, number> = {};\n for (const asset of Object.keys(definition.allocations)) {\n try {\n if (asset === 'SUI' && swapAdapter) {\n prices[asset] = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const q = await swapAdapter.getQuote('USDC', asset, 1);\n prices[asset] = q.expectedOutput > 0 ? 1 / q.expectedOutput : 0;\n }\n } catch { prices[asset] = 0; }\n }\n\n const positions: InvestmentPosition[] = stratPositions.map((sp) => {\n const price = prices[sp.asset] ?? 0;\n const currentValue = sp.totalAmount * price;\n const pnl = currentValue - sp.costBasis;\n return {\n asset: sp.asset,\n totalAmount: sp.totalAmount,\n costBasis: sp.costBasis,\n avgPrice: sp.avgPrice,\n currentPrice: price,\n currentValue,\n unrealizedPnL: pnl,\n unrealizedPnLPct: sp.costBasis > 0 ? (pnl / sp.costBasis) * 100 : 0,\n trades: sp.trades,\n };\n });\n\n const totalValue = positions.reduce((s, p) => s + p.currentValue, 0);\n const currentWeights: Record<string, number> = {};\n for (const p of positions) {\n currentWeights[p.asset] = totalValue > 0 ? (p.currentValue / totalValue) * 100 : 0;\n }\n\n return { definition, positions, currentWeights, totalValue };\n }\n\n // -- Auto-Invest --\n\n setupAutoInvest(params: {\n amount: number;\n frequency: 'daily' | 'weekly' | 'monthly';\n strategy?: string;\n asset?: string;\n dayOfWeek?: number;\n dayOfMonth?: number;\n }): AutoInvestSchedule {\n if (params.strategy) this.strategies.get(params.strategy);\n if (params.asset && !(params.asset in INVESTMENT_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `${params.asset} is not an investment asset`);\n }\n return this.autoInvest.setup(params);\n }\n\n getAutoInvestStatus(): AutoInvestStatus {\n return this.autoInvest.getStatus();\n }\n\n async runAutoInvest(): Promise<AutoInvestRunResult> {\n this.enforcer.assertNotLocked();\n const status = this.autoInvest.getStatus();\n const executed: AutoInvestRunResult['executed'] = [];\n const skipped: AutoInvestRunResult['skipped'] = [];\n\n for (const schedule of status.pendingRuns) {\n try {\n const bal = await queryBalance(this.client, this._address);\n if (bal.available < schedule.amount) {\n skipped.push({ scheduleId: schedule.id, reason: `Insufficient balance ($${bal.available.toFixed(2)} < $${schedule.amount})` });\n continue;\n }\n\n if (schedule.strategy) {\n const result = await this.investStrategy({ strategy: schedule.strategy, usdAmount: schedule.amount });\n this.autoInvest.recordRun(schedule.id, schedule.amount);\n executed.push({ scheduleId: schedule.id, strategy: schedule.strategy, amount: schedule.amount, result });\n } else if (schedule.asset) {\n const result = await this.investBuy({ asset: schedule.asset as InvestmentAsset, usdAmount: schedule.amount });\n this.autoInvest.recordRun(schedule.id, schedule.amount);\n executed.push({ scheduleId: schedule.id, asset: schedule.asset, amount: schedule.amount, result });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n skipped.push({ scheduleId: schedule.id, reason: msg });\n }\n }\n\n return { executed, skipped };\n }\n\n stopAutoInvest(id: string): void {\n this.autoInvest.stop(id);\n }\n\n async getPortfolio(): Promise<PortfolioResult & { strategyPositions?: Record<string, InvestmentPosition[]> }> {\n const positions = this.portfolio.getPositions();\n const realizedPnL = this.portfolio.getRealizedPnL();\n\n const prices: Record<string, number> = {};\n const swapAdapter = this.registry.listSwap()[0];\n for (const asset of Object.keys(INVESTMENT_ASSETS)) {\n try {\n if (asset === 'SUI' && swapAdapter) {\n prices[asset] = await swapAdapter.getPoolPrice();\n } else if (swapAdapter) {\n const quote = await swapAdapter.getQuote('USDC', asset, 1);\n prices[asset] = quote.expectedOutput > 0 ? 1 / quote.expectedOutput : 0;\n }\n } catch { prices[asset] = 0; }\n }\n\n const enrichPosition = async (pos: { asset: string; totalAmount: number; costBasis: number; avgPrice: number; trades: import('./types.js').InvestmentTrade[]; earning?: boolean; earningProtocol?: string; earningApy?: number }, adjustWallet: boolean): Promise<InvestmentPosition> => {\n const currentPrice = prices[pos.asset] ?? 0;\n let totalAmount = pos.totalAmount;\n let costBasis = pos.costBasis;\n\n if (adjustWallet && pos.asset in INVESTMENT_ASSETS && !pos.earning) {\n try {\n const assetInfo = SUPPORTED_ASSETS[pos.asset as keyof typeof SUPPORTED_ASSETS];\n const bal = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(bal.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = pos.asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n const actualHeld = Math.max(0, walletAmount - gasReserve);\n if (actualHeld < totalAmount) {\n const ratio = totalAmount > 0 ? actualHeld / totalAmount : 0;\n costBasis *= ratio;\n totalAmount = actualHeld;\n }\n } catch { /* keep tracked values */ }\n }\n\n const currentValue = totalAmount * currentPrice;\n const unrealizedPnL = currentPrice > 0 ? currentValue - costBasis : 0;\n const unrealizedPnLPct = currentPrice > 0 && costBasis > 0 ? (unrealizedPnL / costBasis) * 100 : 0;\n return {\n asset: pos.asset, totalAmount, costBasis, avgPrice: pos.avgPrice,\n currentPrice, currentValue, unrealizedPnL, unrealizedPnLPct,\n trades: pos.trades, earning: pos.earning, earningProtocol: pos.earningProtocol, earningApy: pos.earningApy,\n };\n };\n\n const enriched: InvestmentPosition[] = [];\n for (const pos of positions) {\n enriched.push(await enrichPosition(pos, true));\n }\n\n const strategyPositions: Record<string, InvestmentPosition[]> = {};\n for (const key of this.portfolio.getAllStrategyKeys()) {\n const sps = this.portfolio.getStrategyPositions(key);\n const enrichedStrat: InvestmentPosition[] = [];\n for (const sp of sps) {\n enrichedStrat.push(await enrichPosition(sp, false));\n }\n if (enrichedStrat.length > 0) {\n strategyPositions[key] = enrichedStrat;\n }\n }\n\n const allPositions = [...enriched, ...Object.values(strategyPositions).flat()];\n const totalInvested = allPositions.reduce((sum, p) => sum + p.costBasis, 0);\n const totalValue = allPositions.reduce((sum, p) => sum + p.currentValue, 0);\n const totalUnrealizedPnL = totalValue - totalInvested;\n const totalUnrealizedPnLPct = totalInvested > 0 ? (totalUnrealizedPnL / totalInvested) * 100 : 0;\n\n const result: PortfolioResult & { strategyPositions?: Record<string, InvestmentPosition[]> } = {\n positions: enriched,\n totalInvested,\n totalValue,\n unrealizedPnL: totalUnrealizedPnL,\n unrealizedPnLPct: totalUnrealizedPnLPct,\n realizedPnL,\n };\n\n if (Object.keys(strategyPositions).length > 0) {\n result.strategyPositions = strategyPositions;\n }\n\n return result;\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 rebalance(opts: { dryRun?: boolean; minYieldDiff?: number; maxBreakEven?: number } = {}): Promise<RebalanceResult> {\n this.enforcer.assertNotLocked();\n const dryRun = opts.dryRun ?? false;\n const minYieldDiff = opts.minYieldDiff ?? 0.5;\n const maxBreakEven = opts.maxBreakEven ?? 30;\n\n const [allPositions, allRates] = await Promise.all([\n this.registry.allPositions(this._address),\n this.registry.allRatesAcrossAssets(),\n ]);\n\n const earningAssets = new Set(\n this.portfolio.getPositions().filter(p => p.earning).map(p => p.asset),\n );\n\n const savePositions = allPositions.flatMap(p =>\n p.positions.supplies\n .filter(s => s.amount > 0.01)\n .filter(s => !earningAssets.has(s.asset))\n .filter(s => !(s.asset in INVESTMENT_ASSETS))\n .map(s => ({\n protocolId: p.protocolId,\n protocol: p.protocol,\n asset: s.asset,\n amount: s.amount,\n apy: s.apy,\n })),\n );\n\n if (savePositions.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings positions to rebalance. Use `t2000 save <amount>` first.');\n }\n\n const borrowPositions = allPositions.flatMap(p =>\n p.positions.borrows.filter(b => b.amount > 0.01),\n );\n if (borrowPositions.length > 0) {\n const healthResults = await Promise.all(\n allPositions\n .filter(p => p.positions.borrows.some(b => b.amount > 0.01))\n .map(async p => {\n const adapter = this.registry.getLending(p.protocolId);\n if (!adapter) return null;\n return adapter.getHealth(this._address);\n }),\n );\n for (const hf of healthResults) {\n if (hf && hf.healthFactor < 1.5) {\n throw new T2000Error(\n 'HEALTH_FACTOR_TOO_LOW',\n `Cannot rebalance — health factor is ${hf.healthFactor.toFixed(2)} (minimum 1.5). Repay some debt first.`,\n { healthFactor: hf.healthFactor },\n );\n }\n }\n }\n\n const stableSet = new Set<string>(STABLE_ASSETS);\n const stableRates = allRates.filter(r => stableSet.has(r.asset));\n if (stableRates.length === 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No stablecoin lending rates available for rebalance');\n }\n const bestRate = stableRates.reduce((best, r) =>\n r.rates.saveApy > best.rates.saveApy ? r : best,\n );\n\n const current = savePositions.reduce((worst, p) =>\n p.apy < worst.apy ? p : worst,\n );\n\n const withdrawAdapter = this.registry.getLending(current.protocolId);\n if (withdrawAdapter) {\n try {\n const maxResult = await withdrawAdapter.maxWithdraw(this._address, current.asset);\n if (maxResult.maxAmount < current.amount) {\n current.amount = Math.max(0, maxResult.maxAmount - 0.01);\n }\n } catch { /* fall through with full amount */ }\n }\n\n if (current.amount <= 0.01) {\n throw new T2000Error(\n 'HEALTH_FACTOR_TOO_LOW',\n 'Cannot rebalance — active borrows prevent safe withdrawal. Repay some debt first.',\n );\n }\n\n const apyDiff = bestRate.rates.saveApy - current.apy;\n const isSameProtocol = current.protocolId === bestRate.protocolId;\n const isSameAsset = current.asset === bestRate.asset;\n\n if (apyDiff < minYieldDiff) {\n return {\n executed: false,\n steps: [],\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain: (current.amount * apyDiff) / 100,\n estimatedSwapCost: 0,\n breakEvenDays: Infinity,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n if (isSameProtocol && isSameAsset) {\n return {\n executed: false,\n steps: [],\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain: 0,\n estimatedSwapCost: 0,\n breakEvenDays: Infinity,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n const steps: RebalanceStep[] = [];\n let estimatedSwapCost = 0;\n\n steps.push({\n action: 'withdraw',\n protocol: current.protocolId,\n fromAsset: current.asset,\n amount: current.amount,\n });\n\n let amountToDeposit = current.amount;\n\n if (!isSameAsset) {\n try {\n const quote = await this.registry.bestSwapQuote(current.asset, bestRate.asset, current.amount);\n amountToDeposit = quote.quote.expectedOutput;\n estimatedSwapCost = Math.abs(current.amount - amountToDeposit);\n } catch {\n estimatedSwapCost = current.amount * 0.003;\n amountToDeposit = current.amount - estimatedSwapCost;\n }\n\n steps.push({\n action: 'swap',\n fromAsset: current.asset,\n toAsset: bestRate.asset,\n amount: current.amount,\n estimatedOutput: amountToDeposit,\n });\n }\n\n steps.push({\n action: 'deposit',\n protocol: bestRate.protocolId,\n toAsset: bestRate.asset,\n amount: amountToDeposit,\n });\n\n const annualGain = (amountToDeposit * apyDiff) / 100;\n const breakEvenDays = estimatedSwapCost > 0 ? Math.ceil((estimatedSwapCost / annualGain) * 365) : 0;\n\n if (breakEvenDays > maxBreakEven && estimatedSwapCost > 0) {\n return {\n executed: false,\n steps,\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain,\n estimatedSwapCost,\n breakEvenDays,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n if (dryRun) {\n return {\n executed: false,\n steps,\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain,\n estimatedSwapCost,\n breakEvenDays,\n txDigests: [],\n totalGasCost: 0,\n };\n }\n\n if (!withdrawAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${current.protocolId} not found`);\n\n const depositAdapter = this.registry.getLending(bestRate.protocolId);\n if (!depositAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${bestRate.protocolId} not found`);\n\n const canComposePTB =\n withdrawAdapter.addWithdrawToTx && depositAdapter.addSaveToTx &&\n (isSameAsset || this.registry.listSwap()[0]?.addSwapToTx);\n\n let txDigests: string[];\n let totalGasCost: number;\n\n if (canComposePTB) {\n const result = await executeWithGas(this.client, this.keypair, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const { coin: withdrawnCoin, effectiveAmount } = await withdrawAdapter.addWithdrawToTx!(\n tx, this._address, current.amount, current.asset,\n );\n amountToDeposit = effectiveAmount;\n\n let depositCoin = withdrawnCoin;\n if (!isSameAsset) {\n const swapAdapter = this.registry.listSwap()[0];\n const { outputCoin, estimatedOut, toDecimals } = await swapAdapter.addSwapToTx!(\n tx, this._address, withdrawnCoin, current.asset, bestRate.asset, amountToDeposit,\n );\n depositCoin = outputCoin;\n amountToDeposit = estimatedOut / 10 ** toDecimals;\n }\n\n await depositAdapter.addSaveToTx!(\n tx, this._address, depositCoin, bestRate.asset, { collectFee: bestRate.asset === 'USDC' },\n );\n\n return tx;\n });\n txDigests = [result.digest];\n totalGasCost = result.gasCostSui;\n } else {\n txDigests = [];\n totalGasCost = 0;\n\n const withdrawResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await withdrawAdapter.buildWithdrawTx(this._address, current.amount, current.asset);\n amountToDeposit = built.effectiveAmount;\n return built.tx;\n });\n txDigests.push(withdrawResult.digest);\n totalGasCost += withdrawResult.gasCostSui;\n\n if (!isSameAsset) {\n const swapAdapter = this.registry.listSwap()[0];\n if (!swapAdapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', 'No swap adapter available');\n\n const swapResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await swapAdapter.buildSwapTx(this._address, current.asset, bestRate.asset, amountToDeposit);\n amountToDeposit = built.estimatedOut / 10 ** built.toDecimals;\n return built.tx;\n });\n txDigests.push(swapResult.digest);\n totalGasCost += swapResult.gasCostSui;\n }\n\n const depositResult = await executeWithGas(this.client, this.keypair, async () => {\n const { tx } = await depositAdapter.buildSaveTx(this._address, amountToDeposit, bestRate.asset, { collectFee: bestRate.asset === 'USDC' });\n return tx;\n });\n txDigests.push(depositResult.digest);\n totalGasCost += depositResult.gasCostSui;\n }\n\n return {\n executed: true,\n steps,\n fromProtocol: current.protocol,\n fromAsset: current.asset,\n toProtocol: bestRate.protocol,\n toAsset: bestRate.asset,\n amount: current.amount,\n currentApy: current.apy,\n newApy: bestRate.rates.saveApy,\n annualGain,\n estimatedSwapCost,\n breakEvenDays,\n txDigests,\n totalGasCost,\n };\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this.keypair);\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.keypair);\n }\n\n // -- Sentinel --\n\n async sentinelList(): Promise<SentinelAgent[]> {\n return sentinel.listSentinels();\n }\n\n async sentinelInfo(id: string): Promise<SentinelAgent> {\n return sentinel.getSentinelInfo(this.client, id);\n }\n\n async sentinelAttack(id: string, prompt: string, fee?: bigint): Promise<SentinelAttackResult> {\n this.enforcer.check({ operation: 'sentinel', amount: fee ? Number(fee) / 1e9 : 0.1 });\n return sentinel.attack(this.client, this.keypair, id, prompt, fee);\n }\n\n // -- Helpers --\n\n private async getFreeBalance(asset: string): Promise<number> {\n if (!(asset in INVESTMENT_ASSETS)) return Infinity;\n\n // Strategy buys record to BOTH direct and strategy positions, so use\n // max(direct, strategyTotal) to avoid double-counting the overlap.\n const pos = this.portfolio.getPosition(asset);\n const directAmount = (pos && pos.totalAmount > 0 && !pos.earning) ? pos.totalAmount : 0;\n\n let strategyTotal = 0;\n for (const key of this.portfolio.getAllStrategyKeys()) {\n for (const sp of this.portfolio.getStrategyPositions(key)) {\n if (sp.asset === asset && sp.totalAmount > 0) {\n strategyTotal += sp.totalAmount;\n }\n }\n }\n\n const walletInvested = Math.max(directAmount, strategyTotal);\n\n if (walletInvested <= 0) return Infinity;\n\n const assetInfo = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS];\n const balance = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });\n const walletAmount = Number(balance.totalBalance) / (10 ** assetInfo.decimals);\n const gasReserve = asset === 'SUI' ? GAS_RESERVE_MIN : 0;\n return Math.max(0, walletAmount - walletInvested - gasReserve);\n }\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","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","export type {\n AdapterCapability,\n AdapterTxResult,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n SwapQuote,\n LendingAdapter,\n SwapAdapter,\n PerpsAdapter,\n ProtocolDescriptor,\n} from './types.js';\nexport { ProtocolRegistry } from './registry.js';\nexport { NaviAdapter, descriptor as naviDescriptor } from './navi.js';\nexport { CetusAdapter, descriptor as cetusDescriptor } from './cetus.js';\nexport { SuilendAdapter, descriptor as suilendDescriptor } from './suilend.js';\nexport { descriptor as sentinelDescriptor } from '../protocols/sentinel.js';\n\nimport { descriptor as naviDescriptor } from './navi.js';\nimport { descriptor as cetusDescriptor } from './cetus.js';\nimport { descriptor as suilendDescriptor } from './suilend.js';\nimport { descriptor as sentinelDescriptor } from '../protocols/sentinel.js';\nimport type { ProtocolDescriptor } from './types.js';\n\n/** All registered protocol descriptors — used by the indexer for event classification */\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n suilendDescriptor,\n cetusDescriptor,\n sentinelDescriptor,\n];\n"]}
|