@t2000/sdk 0.19.15 → 0.19.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +32 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +32 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -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/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.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/utils/base64.ts","../src/gas/gasStation.ts","../src/gas/autoTopUp.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","naviGetPools","updateOraclePriceBeforeUserOperationPTB","getLendingPositions","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 — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const 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 | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | '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 type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","import { 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 { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiJsonRpcClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\n","import 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\nconst SUI_TYPE = '0x2::sui::SUI';\n\nconst KNOWN_TARGETS: [RegExp, string][] = [\n [/::suilend|::obligation/, 'lending'],\n [/::navi|::incentive_v2/, 'lending'],\n [/::cetus|::pool/, 'swap'],\n [/::deepbook/, 'swap'],\n [/::transfer::public_transfer/, 'send'],\n];\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => parseTxRecord(tx as unknown as TxBlock, address));\n}\n\nexport async function queryTransaction(\n client: SuiJsonRpcClient,\n digest: string,\n senderAddress: string,\n): Promise<TransactionRecord | null> {\n try {\n const tx = await client.getTransactionBlock({\n digest,\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n });\n return parseTxRecord(tx as unknown as TxBlock, senderAddress);\n } catch {\n return null;\n }\n}\n\ninterface TxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: BalanceChange[];\n}\n\nfunction parseTxRecord(tx: TxBlock, address: string): TransactionRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n const { moveCallTargets, commandTypes } = extractCommands(tx.transaction);\n const { amount, asset, recipient } = extractTransferDetails(tx.balanceChanges, address);\n const action = classifyAction(moveCallTargets, commandTypes);\n\n return {\n digest: tx.digest,\n action,\n amount,\n asset,\n recipient,\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n}\n\ninterface BalanceChange {\n owner: { AddressOwner?: string } | string;\n coinType: string;\n amount: string;\n}\n\nfunction resolveOwner(owner: BalanceChange['owner']): string | null {\n if (typeof owner === 'object' && owner.AddressOwner) return owner.AddressOwner;\n if (typeof owner === 'string') return owner;\n return null;\n}\n\nfunction extractTransferDetails(\n changes: BalanceChange[] | undefined,\n sender: string,\n): { amount?: number; asset?: string; recipient?: string } {\n if (!changes || changes.length === 0) return {};\n\n const outflows = changes.filter((c) => resolveOwner(c.owner) === sender && BigInt(c.amount) < 0n);\n const inflows = changes.filter((c) => resolveOwner(c.owner) !== sender && BigInt(c.amount) > 0n);\n\n const primaryOutflow = outflows\n .filter((c) => c.coinType !== SUI_TYPE)\n .sort((a, b) => Number(BigInt(a.amount) - BigInt(b.amount)))[0]\n ?? outflows[0];\n\n if (!primaryOutflow) return {};\n\n const coinType = primaryOutflow.coinType;\n const decimals = coinType.includes('::usdc::') ? 6 : 9;\n const amount = Math.abs(Number(BigInt(primaryOutflow.amount))) / 10 ** decimals;\n const asset = coinType === SUI_TYPE ? 'SUI' : coinType.includes('::usdc::') ? 'USDC' : coinType.split('::').pop() ?? 'unknown';\n\n const recipientChange = inflows.find((c) => c.coinType === coinType);\n const recipient = recipientChange ? resolveOwner(recipientChange.owner) ?? undefined : undefined;\n\n return { amount, asset, recipient };\n}\n\ninterface CommandInfo {\n moveCallTargets: string[];\n commandTypes: string[];\n}\n\nfunction extractCommands(txBlock: unknown): CommandInfo {\n const result: CommandInfo = { moveCallTargets: [], commandTypes: [] };\n try {\n if (!txBlock || typeof txBlock !== 'object') return result;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return result;\n const inner = 'transaction' in (data as Record<string, unknown>)\n ? (data as Record<string, unknown>).transaction\n : undefined;\n if (!inner || typeof inner !== 'object') return result;\n const commands = 'commands' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).commands\n : undefined;\n if (!Array.isArray(commands)) return result;\n\n for (const cmd of commands as Record<string, unknown>[]) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n result.moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n result.commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n result.commandTypes.push('TransferObjects');\n }\n }\n } catch { /* best effort */ }\n return result;\n}\n\nfunction classifyAction(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of KNOWN_TARGETS) {\n if (pattern.test(target)) return label;\n }\n }\n\n const hasTransfer = commandTypes.includes('TransferObjects');\n const hasMoveCall = commandTypes.includes('MoveCall');\n\n if (hasTransfer && !hasMoveCall) return 'send';\n if (hasMoveCall) return 'transaction';\n\n return 'transaction';\n}\n","import { 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 { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, 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 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; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean },\n): Promise<void> {\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n // Pyth update uses tx.splitCoins(tx.gas, ...) which is incompatible\n // with sponsored transactions where tx.gas belongs to the sponsor.\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0');\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of 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 address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const 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 buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address);\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; collectFee?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address);\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string; sponsored?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin as TransactionObjectArgument, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\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 await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n } catch {\n return [];\n }\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n const claimed = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n\n return claimed.map((c) => ({\n protocol: 'navi',\n asset: '',\n coinType: '',\n symbol: 'REWARD',\n amount: 0,\n estimatedValueUsd: 0,\n }));\n } catch {\n return [];\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, address);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy / 100;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n const totalYieldEarned = dailyEarning * 30;\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, address);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\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 { TransactionSigner } from '../signer.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: TransactionSigner,\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 address = signer.getAddress();\n const tx = new Transaction();\n tx.setSender(address);\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 tx.transferObjects([attack], address);\n\n const built = await tx.build({ client });\n const { signature } = await signer.signTransaction(built);\n const result = await client.executeTransactionBlock({\n transactionBlock: built,\n signature,\n options: { showObjectChanges: true, showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const attackObj = result.objectChanges?.find(\n (c: Record<string, unknown>) => c.type === 'created' && (c.objectType as string)?.includes('::sentinel::Attack'),\n );\n\n const attackObjectId = attackObj && 'objectId' in attackObj ? (attackObj as Record<string, string>).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: TransactionSigner,\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 address = signer.getAddress();\n const tx = new Transaction();\n tx.setSender(address);\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 built = await tx.build({ client });\n const { signature } = await signer.signTransaction(built);\n const result = await client.executeTransactionBlock({\n transactionBlock: built,\n signature,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const txSuccess = (result.effects as { status?: { status?: string } })?.status?.status === 'success';\n\n return { digest: result.digest, success: txSuccess };\n}\n\nexport async function attack(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\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; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\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 { 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 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\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\nasync function quietSuilend<T>(fn: () => Promise<T>): Promise<T> {\n const origLog = console.log;\n const origWarn = console.warn;\n const filter = (...args: unknown[]) =>\n typeof args[0] === 'string' && (args[0].includes('PythEndpoint') || args[0].includes('PythConnection'));\n console.log = (...args: unknown[]) => { if (!filter(...args)) origLog.apply(console, args); };\n console.warn = (...args: unknown[]) => { if (!filter(...args)) origWarn.apply(console, args); };\n return fn().finally(() => { console.log = origLog; console.warn = origWarn; });\n}\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 quietSuilend(() => 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 quietSuilend(() => 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 (amountUsd > 0.01) {\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 (amountUsd > 0.01) {\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 quietSuilend(() => 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 const rawValue = stableToRaw(amount, assetInfo.decimals).toString();\n\n if (caps.length > 0) {\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 await sdk.depositIntoObligation(address, assetInfo.type, rawValue, tx, caps[0].id);\n } else {\n const newCap = sdk.createObligation(tx);\n\n let depositCoin: TransactionObjectArgument;\n if (assetKey === 'SUI') {\n [depositCoin] = tx.splitCoins(tx.gas, [rawValue]);\n } else {\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 primaryCoin = tx.object(allCoins[0].coinObjectId);\n if (allCoins.length > 1) {\n tx.mergeCoins(primaryCoin, allCoins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n [depositCoin] = tx.splitCoins(primaryCoin, [rawValue]);\n }\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, depositCoin, 'save');\n }\n\n sdk.deposit(depositCoin, assetInfo.type, newCap as unknown as string, tx);\n tx.transferObjects([newCap], 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\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 { ctokenRaw, effectiveAmount, obligationIndex } = await this.resolveWithdrawCTokens(sdk, address, assetKey, assetInfo, amount);\n const cap = caps[obligationIndex] ?? caps[0];\n const tx = new Transaction();\n tx.setSender(address);\n\n await sdk.withdrawAndSendToUser(address, cap.id, cap.obligationId, assetInfo.type, ctokenRaw, 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 { ctokenRaw, effectiveAmount, obligationIndex } = await this.resolveWithdrawCTokens(sdk, address, assetKey, assetInfo, amount);\n const cap = caps[obligationIndex] ?? caps[0];\n const coin = await sdk.withdraw(cap.id, cap.obligationId, assetInfo.type, ctokenRaw, 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 private async resolveWithdrawCTokens(\n sdk: SuilendClient,\n address: string,\n assetKey: string,\n assetInfo: (typeof SUPPORTED_ASSETS)[keyof typeof SUPPORTED_ASSETS],\n amount: number,\n ): Promise<{ ctokenRaw: string; effectiveAmount: number; obligationIndex: number }> {\n const { reserveMap, refreshedRawReserves } = await quietSuilend(() => initializeSuilend(this.client, sdk));\n const { obligations } = await initializeObligations(\n this.client, sdk, refreshedRawReserves, reserveMap, address,\n );\n if (obligations.length === 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on Suilend — no obligations found`);\n\n // Search ALL obligations, not just the first (user may have multiple obligation caps)\n let dep: (typeof obligations)[0]['deposits'][0] | undefined;\n let matchedObligation = 0;\n for (let oi = 0; oi < obligations.length; oi++) {\n dep = obligations[oi].deposits.find(d => {\n const resolved = this.resolveSymbol(d.coinType);\n if (resolved === assetKey) return true;\n try {\n return normalizeStructTag(d.coinType) === normalizeStructTag(assetInfo.type);\n } catch { return false; }\n });\n if (dep && dep.depositedAmount.toNumber() > 1e-10) {\n matchedObligation = oi;\n break;\n }\n dep = undefined;\n }\n\n if (!dep) {\n const foundDeposits = obligations.flatMap((o, i) =>\n o.deposits.map(d => `ob${i}:${this.resolveSymbol(d.coinType)}=${d.depositedAmount.toFixed(8)}`),\n );\n throw new T2000Error(\n 'NO_COLLATERAL',\n `Nothing to withdraw for ${assetInfo.displayName} (${assetKey}) on Suilend. Found deposits: [${foundDeposits.join(', ')}]`,\n );\n }\n\n const deposited = dep.depositedAmount.toNumber();\n const effectiveAmount = Math.min(amount, deposited);\n const proportion = effectiveAmount / deposited;\n\n const ctokenRaw = proportion >= 0.999\n ? dep.depositedCtokenAmount.toFixed(0)\n : dep.depositedCtokenAmount.times(proportion).integerValue(1).toFixed(0);\n\n return { ctokenRaw, effectiveAmount, obligationIndex: matchedObligation };\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 quietSuilend(() => 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 quietSuilend(() => 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","/** Cross-platform (Node + browser) base64 helpers. */\n\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nexport function fromBase64(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { toBase64 } from '../utils/base64.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\n/**\n * Request gas sponsorship from the gas station.\n *\n * Sends `txJson` (preferred) or `txBcsBytes` (base64-encoded BCS from tx.build(),\n * used when serialize() fails due to v1/v2 SDK mismatch with aggregator).\n */\nexport async function requestGasSponsorship(\n txJson: string,\n sender: string,\n type?: GasRequestType,\n txBcsBytes?: string,\n): Promise<GasSponsorResponse> {\n const payload: Record<string, unknown> = { sender, type };\n if (txBcsBytes) {\n payload.txBcsBytes = txBcsBytes;\n } else {\n payload.txJson = txJson;\n payload.txBytes = toBase64(new TextEncoder().encode(txJson));\n }\n\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED' || errorCode === 'PRICE_STALE') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter, reason: errorCode },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n { reason: errorCode },\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SUPPORTED_ASSETS,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_AMOUNT,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport { buildSwapTx } from '../protocols/cetus.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport { T2000Error } from '../errors.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n return suiRaw < GAS_RESERVE_TARGET && usdcRaw >= AUTO_TOPUP_MIN_USDC;\n}\n\n/**\n * Swap USDC→SUI to replenish gas. Tries self-funding first; if the agent\n * doesn't have enough SUI to pay for the swap itself, falls back to\n * gas station sponsorship — eliminating the chicken-and-egg problem.\n */\nexport async function executeAutoTopUp(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n): Promise<AutoTopUpResult> {\n const address = signer.getAddress();\n const topupAmountHuman = Number(AUTO_TOPUP_AMOUNT) / 1e6;\n\n const { tx } = await buildSwapTx({\n client,\n address,\n fromAsset: 'USDC',\n toAsset: 'SUI',\n amount: topupAmountHuman,\n });\n tx.setSender(address);\n\n let result;\n try {\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n } catch {\n // Not enough SUI to self-fund the swap — sponsor it via gas station\n const { tx: freshTx } = await buildSwapTx({\n client, address, fromAsset: 'USDC', toAsset: 'SUI', amount: topupAmountHuman,\n });\n freshTx.setSender(address);\n\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = freshTx.serialize();\n } catch {\n const bcsBytes = await freshTx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsored = await requestGasSponsorship(\n txJson ?? '', address, 'auto-topup', txBcsBase64,\n );\n const sponsoredTxBytes = fromBase64(sponsored.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n result = await client.executeTransactionBlock({\n transactionBlock: sponsored.txBytes,\n signature: [agentSig, sponsored.sponsorSignature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n reportGasUsage(address, result.digest, 0, 0, 'auto-topup');\n }\n\n await client.waitForTransaction({ digest: result.digest });\n\n const eff = result.effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n throw new T2000Error(\n 'TRANSACTION_FAILED',\n `Auto-topup swap failed on-chain: ${eff.status.error ?? 'unknown'}`,\n );\n }\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 type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error, isMoveAbort, parseMoveAbortMessage } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport type { SafeguardEnforcer } from '../safeguards/enforcer.js';\nimport type { TxMetadata } from '../safeguards/types.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n gasMethod: GasMethod;\n gasCostSui: number;\n /** Pre-TX SUI balance in MIST — used internally for proactive gas maintenance. */\n preTxSuiMist?: bigint;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nasync function getSuiBalance(client: SuiJsonRpcClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function assertTxSuccess(effects: unknown, digest: string): Promise<void> {\n const eff = effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n const errMsg = eff.status.error ?? 'unknown on-chain error';\n if (isMoveAbort(errMsg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(errMsg));\n }\n throw new T2000Error('TRANSACTION_FAILED', `Transaction ${digest} failed on-chain: ${errMsg}`);\n }\n}\n\nasync function trySelfFunded(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiBalance,\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, signer);\n\n // Rebuild the transaction with fresh object versions (auto-topup changed coin state)\n const tx = await buildTx();\n tx.setSender(address);\n\n const suiAfterTopUp = await getSuiBalance(client, address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiAfterTopUp,\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n tx.setSender(address);\n\n // Use serialize() for pure v2 transactions, fall back to build() for\n // mixed v1/v2 transactions (e.g. Cetus aggregator adds v1 commands).\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = tx.serialize();\n } catch {\n const bcsBytes = await tx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = fromBase64(sponsoredResult.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n preTxSuiMist: suiBalance,\n };\n}\n\n/**\n * Best-effort indexer readiness check after transaction finalization.\n * Verifies the TX effects are queryable. Note: aggregate indices\n * (getBalance, getDynamicFields) may still lag — callers that need\n * consistent reads should poll their expected state separately.\n */\nasync function waitForIndexer(client: SuiJsonRpcClient, digest: string): Promise<void> {\n for (let i = 0; i < 3; i++) {\n try {\n await client.getTransactionBlock({ digest, options: { showObjectChanges: true } });\n return;\n } catch {\n await new Promise(r => setTimeout(r, 500));\n }\n }\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n *\n * After every successful transaction, proactively tops up SUI if it\n * dropped below threshold — so the user never hits a \"no gas\" wall.\n */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n options?: { metadata?: TxMetadata; enforcer?: SafeguardEnforcer },\n): Promise<GasExecutionResult> {\n if (options?.enforcer && options?.metadata) {\n options.enforcer.check(options.metadata);\n }\n\n const result = await resolveGas(client, signer, buildTx);\n\n // Proactive gas maintenance — compute remaining SUI from the TX result\n // instead of querying the indexer (which may still show stale balances).\n try {\n if (result.preTxSuiMist !== undefined) {\n const gasCostMist = result.gasMethod === 'sponsored'\n ? 0n\n : BigInt(Math.round(result.gasCostSui * 1e9));\n const estimatedRemaining = result.preTxSuiMist - gasCostMist;\n if (estimatedRemaining < GAS_RESERVE_TARGET) {\n const address = signer.getAddress();\n const usdcBal = await client.getBalance({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n if (BigInt(usdcBal.totalBalance) >= AUTO_TOPUP_MIN_USDC) {\n await executeAutoTopUp(client, signer);\n }\n }\n }\n } catch { /* best-effort — don't fail the main operation */ }\n\n return result;\n}\n\nconst GAS_RESOLUTION_CODES: Set<string> = new Set([\n 'INSUFFICIENT_GAS',\n 'GAS_STATION_UNAVAILABLE',\n 'GAS_FEE_EXCEEDED',\n 'AUTO_TOPUP_FAILED',\n 'SPONSOR_UNAVAILABLE',\n]);\n\nfunction isBuildError(err: unknown): err is T2000Error {\n return err instanceof T2000Error && !GAS_RESOLUTION_CODES.has(err.code);\n}\n\nasync function resolveGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n let lastBuildError: T2000Error | undefined;\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (swap USDC→SUI) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, signer, buildTx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2.5: Retry self-funded — auto-topup may have deposited SUI\n // even if the combined operation failed\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded-retry: ${msg}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('sponsored: returned null');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n if (lastBuildError) throw lastBuildError;\n\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and sponsorship unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","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 getStrategyAmountForAsset(asset: string): number {\n this.load();\n let total = 0;\n for (const bucket of Object.values(this.data.strategies)) {\n const pos = bucket[asset];\n if (pos && pos.totalAmount > 0) total += pos.totalAmount;\n }\n return total;\n }\n\n getDirectAmount(asset: string): number {\n this.load();\n const aggregate = this.data.positions[asset]?.totalAmount ?? 0;\n const strategyAmount = this.getStrategyAmountForAsset(asset);\n return Math.max(0, aggregate - strategyAmount);\n }\n\n deductFromStrategies(asset: string, amount: number): void {\n this.load();\n let remaining = amount;\n for (const [stratKey, bucket] of Object.entries(this.data.strategies)) {\n if (remaining <= 0) break;\n const pos = bucket[asset];\n if (!pos || pos.totalAmount <= 0) continue;\n\n const deduct = Math.min(pos.totalAmount, remaining);\n const costDeduct = pos.avgPrice * deduct;\n pos.totalAmount -= deduct;\n pos.costBasis -= costDeduct;\n if (pos.totalAmount < 0.000001) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n }\n remaining -= deduct;\n\n const hasPositions = Object.values(bucket).some((p) => p.totalAmount > 0);\n if (!hasPositions) {\n delete this.data.strategies[stratKey];\n }\n }\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 closeStrategyPosition(strategyKey: string, asset: string): void {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket?.[asset]) return;\n bucket[asset].totalAmount = 0;\n bucket[asset].costBasis = 0;\n bucket[asset].avgPrice = 0;\n const hasPositions = Object.values(bucket).some((p) => p.totalAmount > 0);\n if (!hasPositions) {\n delete this.data.strategies[strategyKey];\n }\n this.save();\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 type { TransactionSigner } from './signer.js';\nimport { KeypairSigner } from './wallet/keypairSigner.js';\nimport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory, queryTransaction } from './wallet/history.js';\nimport { 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 PayOptions,\n PayResult,\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 _signer: TransactionSigner;\n private readonly _keypair?: Ed25519Keypair;\n private readonly client: SuiJsonRpcClient;\n private readonly _address: string;\n private readonly registry: ProtocolRegistry;\n readonly enforcer: SafeguardEnforcer;\n readonly contacts: ContactManager;\n readonly portfolio: PortfolioManager;\n readonly strategies: StrategyManager;\n readonly autoInvest: AutoInvestManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string);\n private constructor(signer: TransactionSigner, client: SuiJsonRpcClient, registry: ProtocolRegistry | undefined, configDir: string | undefined, isSignerMode: true);\n private constructor(\n keypairOrSigner: Ed25519Keypair | TransactionSigner,\n client: SuiJsonRpcClient,\n registry?: ProtocolRegistry,\n configDir?: string,\n isSignerMode?: boolean,\n ) {\n super();\n if (isSignerMode) {\n this._signer = keypairOrSigner as TransactionSigner;\n this._keypair = undefined;\n this._address = this._signer.getAddress();\n } else {\n const kp = keypairOrSigner as Ed25519Keypair;\n this._keypair = kp;\n this._signer = new KeypairSigner(kp);\n this._address = getAddress(kp);\n }\n this.client = client;\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n 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 integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for CLI/MCP integrations. */\n get keypair(): Ed25519Keypair {\n if (!this._keypair) {\n throw new T2000Error('WALLET_NOT_FOUND', 'Keypair not available — this instance uses zkLogin');\n }\n return this._keypair;\n }\n\n /** Transaction signer (works for both keypair and zkLogin). */\n get signer(): TransactionSigner {\n return this._signer;\n }\n\n // -- MPP Payments --\n\n async pay(options: PayOptions): Promise<PayResult> {\n this.enforcer.assertNotLocked();\n this.enforcer.check({ operation: 'pay', amount: options.maxPrice ?? 1.0 });\n\n const { Mppx } = await import('mppx/client');\n const { sui } = await import('@t2000/mpp-sui/client');\n\n const client = this.client;\n const signer = this._signer;\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [sui({\n client,\n signer,\n execute: async (tx) => {\n const result = await executeWithGas(client, signer, () => tx);\n return { digest: result.digest, effects: result.effects };\n },\n })],\n });\n\n const method = (options.method ?? 'GET').toUpperCase();\n const canHaveBody = method !== 'GET' && method !== 'HEAD';\n\n const response = await mppx.fetch(options.url, {\n method,\n headers: options.headers,\n body: canHaveBody ? options.body : undefined,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n let body: unknown;\n try {\n body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n } catch {\n body = null;\n }\n\n const receiptHeader = response.headers.get('x-payment-receipt');\n const paid = !!receiptHeader;\n\n if (paid) {\n this.enforcer.recordUsage(options.maxPrice ?? 1.0);\n }\n\n return {\n status: response.status,\n body,\n paid,\n cost: paid ? (options.maxPrice ?? undefined) : undefined,\n receipt: receiptHeader\n ? { reference: receiptHeader, timestamp: new Date().toISOString() }\n : undefined,\n };\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n this.enforcer.assertNotLocked();\n\n const asset = (params.asset ?? 'USDC') as keyof typeof SUPPORTED_ASSETS;\n if (!(asset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n\n const resolved = this.contacts.resolve(params.to);\n const sendAmount = params.amount;\n const sendTo = resolved.address;\n\n const gasResult = await executeWithGas(this.client, this._signer, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n { metadata: { operation: 'send', amount: sendAmount }, enforcer: this.enforcer },\n );\n\n this.enforcer.recordUsage(sendAmount);\n const balance = await this.balance();\n\n this.emitBalanceChange(asset, sendAmount, 'send', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: sendAmount,\n to: resolved.address,\n contactName: resolved.contactName,\n gasCost: gasResult.gasCostSui,\n gasCostUnit: 'SUI',\n gasMethod: gasResult.gasMethod,\n balance,\n };\n }\n\n async balance(): Promise<BalanceResponse> {\n const bal = await queryBalance(this.client, this._address);\n\n 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 // Direct positions already include strategy buy amounts — don't add\n // strategy positions again or the investment total will be double-counted.\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\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 transactionDetail(digest: string): Promise<TransactionRecord | null> {\n return queryTransaction(this.client, digest, this._address);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: '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 /** Create a T2000 instance from zkLogin credentials (for web app). */\n static fromZkLogin(opts: {\n ephemeralKeypair: Ed25519Keypair;\n zkProof: ZkLoginProof;\n userAddress: string;\n maxEpoch: number;\n rpcUrl?: string;\n }): T2000 {\n const signer = new ZkLoginSigner(opts.ephemeralKeypair, opts.zkProof, opts.userAddress, opts.maxEpoch);\n const client = getSuiClient(opts.rpcUrl);\n return new T2000(signer, client, undefined, undefined, true);\n }\n\n async registerAdapter(adapter: LendingAdapter | 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._signer, 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 // Verify the deposit is visible on-chain before returning.\n // With NAVI cache disabled this usually succeeds on the first try;\n // the retry handles rare indexer propagation lag.\n let savingsBalance = saveAmount;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const positions = await this.positions();\n const actual = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n if (actual > 0) {\n savingsBalance = actual;\n break;\n }\n } catch { /* retry */ }\n await new Promise(r => setTimeout(r, 2000));\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.saveApy,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n savingsBalance,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; 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._signer, 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 if (target.asset !== 'USDC') {\n try {\n const postBal = await queryBalance(this.client, this._address);\n await this._convertWalletStablesToUsdc(postBal);\n } catch {\n // Best-effort: if swap fails the user still has the stablecoins\n }\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._signer, 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 return lastTx!;\n });\n\n if (hasNonUsdc) {\n try {\n const postBal = await queryBalance(this.client, this._address);\n await this._convertWalletStablesToUsdc(postBal);\n } catch {\n // Best-effort: if swap fails the user still has the stablecoins\n }\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\n if (all.length > 0) {\n this._lastFundDigest = undefined;\n return all;\n }\n\n // Chain-direct fallback: getCoins (indexer) returned nothing but we\n // recently did an auto-fund. Read the TX's objectChanges to discover\n // coin IDs, then fetch their current state via multiGetObjects — both\n // are chain-direct queries unaffected by indexer lag.\n // Keeps _lastFundDigest for subsequent resolveGas retries.\n if (this._lastFundDigest && coinType === SUPPORTED_ASSETS.USDC.type) {\n const txInfo = await this.client.getTransactionBlock({\n digest: this._lastFundDigest,\n options: { showObjectChanges: true },\n });\n const coinIds = (txInfo.objectChanges ?? [])\n .filter((c): c is typeof c & { objectId: string } =>\n (c.type === 'created' || c.type === 'mutated') &&\n 'objectType' in c &&\n typeof c.objectType === 'string' &&\n c.objectType.includes('0x2::coin::Coin') &&\n c.objectType.includes(coinType),\n )\n .map(c => c.objectId);\n\n if (coinIds.length > 0) {\n const objects = await this.client.multiGetObjects({\n ids: coinIds,\n options: { showContent: true, showOwner: true },\n });\n for (const obj of objects) {\n if (\n obj.data?.content?.dataType === 'moveObject' &&\n obj.data.owner &&\n typeof obj.data.owner === 'object' &&\n 'AddressOwner' in obj.data.owner &&\n obj.data.owner.AddressOwner === this._address\n ) {\n const fields = obj.data.content.fields as Record<string, unknown>;\n all.push({ coinObjectId: obj.data.objectId!, balance: String(fields.balance ?? '0') });\n }\n }\n }\n }\n\n return all;\n }\n\n private _mergeCoinsInTx(tx: Transaction, coins: Array<{ coinObjectId: string; balance: string }>): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n }\n\n private 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._signer, 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._signer, 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 /**\n * Auto-withdraw from savings when checking balance is insufficient for an\n * operation. Handles non-USDC savings (e.g. USDe) via the standard withdraw\n * path which swaps back to USDC. Throws if savings are also insufficient.\n */\n private _lastFundDigest: string | undefined;\n\n private async _autoFundFromSavings(shortfall: number): Promise<void> {\n const positions = await this.positions();\n const savingsTotal = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n if (savingsTotal < shortfall * 0.95) {\n const bal = await queryBalance(this.client, this._address);\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. Available: $${bal.available.toFixed(2)}, savings: $${savingsTotal.toFixed(2)}, requested shortfall: $${shortfall.toFixed(2)}`,\n );\n }\n\n const result = await this.withdraw({ amount: shortfall });\n if (result.amount < shortfall * 0.5) {\n throw new T2000Error(\n 'WITHDRAW_FAILED',\n `Auto-withdraw from savings returned $${result.amount.toFixed(2)} — expected ~$${shortfall.toFixed(2)}. Try withdrawing manually first.`,\n );\n }\n\n // Verify via chain query (not indexer) that the withdraw TX produced\n // USDC. Store the digest so _fetchCoins can fall back to reading the\n // TX's objectChanges directly if the indexer hasn't caught up yet.\n const txInfo = await this.client.getTransactionBlock({\n digest: result.tx,\n options: { showBalanceChanges: true },\n });\n const usdcReceived = (txInfo.balanceChanges ?? []).some(\n c => c.coinType === SUPPORTED_ASSETS.USDC.type &&\n Number(c.amount) > 0 &&\n typeof c.owner === 'object' && 'AddressOwner' in c.owner &&\n c.owner.AddressOwner === this._address,\n );\n if (!usdcReceived) {\n throw new T2000Error('WITHDRAW_FAILED', 'Withdraw TX did not produce USDC');\n }\n this._lastFundDigest = result.tx;\n }\n\n 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._signer, async () => {\n const { tx } = await adapter.buildBorrowTx(this._address, borrowAmount, asset, { collectFee: true });\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n reportFee(this._address, 'borrow', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(asset, borrowAmount, 'borrow', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: borrowAmount,\n fee: fee.amount,\n healthFactor: hf.healthFactor,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async repay(params: { amount: number | 'all'; protocol?: string }): Promise<RepayResult> {\n this.enforcer.assertNotLocked();\n // 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._signer, 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._signer, 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 // -- Swap (formerly Exchange) --\n\n async swap(params: { from: string; to: string; amount: number; maxSlippage?: number }): 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 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 ? Math.round(params.maxSlippage * 10000) : undefined;\n\n let swapMeta: { estimatedOut: number; toDecimals: number } = { estimatedOut: 0, toDecimals: 0 };\n\n const gasResult = await executeWithGas(this.client, this._signer, 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 swapQuote(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 /** @deprecated Use swap() instead */\n async exchange(params: { from: string; to: string; amount: number; maxSlippage?: number; _bypassInvestmentGuard?: boolean }): Promise<SwapResult> {\n return this.swap(params);\n }\n\n /** @deprecated Use swapQuote() instead */\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 return this.swapQuote(params);\n }\n\n // -- Investment (strategies only — individual buy/sell deprecated, use swap()) --\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 const totalFunds = bal.available + bal.savings;\n if (params.usdAmount > totalFunds * 1.05) {\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. You have $${totalFunds.toFixed(2)} total (checking: $${bal.available.toFixed(2)}, savings: $${bal.savings.toFixed(2)}) but need $${params.usdAmount.toFixed(2)}.`,\n );\n }\n\n if (bal.available < params.usdAmount) {\n await this._autoFundFromSavings(params.usdAmount - bal.available);\n }\n\n let swapResult: Awaited<ReturnType<typeof this.swap>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.swap({\n from: 'USDC',\n to: params.asset,\n amount: params.usdAmount,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\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 let pos = this.portfolio.getPosition(params.asset);\n\n // Auto-unearn if the position is currently earning\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 pos = this.portfolio.getPosition(params.asset);\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 // If no position record exists at all (stale/missing portfolio file),\n // fall back to wallet balance so the sell can still proceed.\n // But if a position record exists with totalAmount 0, the user already\n // sold everything — don't fall back to wallet balance.\n const trackedAmount = pos\n ? pos.totalAmount\n : maxSellable;\n\n if (trackedAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${params.asset} position to sell`);\n }\n\n let sellAmountAsset: number;\n if (params.usdAmount === 'all') {\n sellAmountAsset = Math.min(trackedAmount, 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 const maxPosition = params._strategyOnly ? maxSellable : trackedAmount;\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.swap>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.swap({\n from: params.asset,\n to: 'USDC',\n amount: sellAmountAsset,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\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 directAmountBeforeSell = this.portfolio.getDirectAmount(params.asset);\n\n let realizedPnL = 0;\n try {\n 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 } catch {\n // Position already zeroed in local portfolio (stale state) — sell still valid\n }\n\n if (params.usdAmount === 'all' && !params._strategyOnly) {\n this.portfolio.closePosition(params.asset);\n this.portfolio.deductFromStrategies(params.asset, sellAmountAsset);\n } else if (!params._strategyOnly && sellAmountAsset > 0) {\n const overflowIntoStrategy = sellAmountAsset - directAmountBeforeSell;\n if (overflowIntoStrategy > 0) {\n this.portfolio.deductFromStrategies(params.asset, overflowIntoStrategy);\n }\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) {\n throw new T2000Error('INVEST_ALREADY_EARNING', `${params.asset} is already earning via ${pos.earningProtocol ?? 'lending'}`);\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._signer, 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 let pos = this.portfolio.getPosition(params.asset);\n let adapter: import('./adapters/types.js').LendingAdapter | undefined;\n let withdrawAmount: number;\n\n if (pos?.earning && pos.earningProtocol) {\n adapter = this.registry.getLending(pos.earningProtocol);\n withdrawAmount = pos.totalAmount;\n } else {\n // Local portfolio disagrees — check on-chain to recover from stale state.\n const onChain = await this.registry.allPositions(this._address);\n let found: { protocolId: string; amount: number } | undefined;\n for (const entry of onChain) {\n const supply = entry.positions.supplies.find(s => s.asset === params.asset);\n if (supply && supply.amount > 1e-10) {\n found = { protocolId: entry.protocolId, amount: supply.amount };\n break;\n }\n }\n if (!found) {\n throw new T2000Error('INVEST_NOT_EARNING', `${params.asset} is not currently earning (checked on-chain)`);\n }\n adapter = this.registry.getLending(found.protocolId);\n withdrawAmount = found.amount;\n }\n\n if (!adapter) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Lending protocol not found for ${params.asset}`);\n }\n\n const protocolName = adapter.name;\n let effectiveAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n const result = await adapter.buildWithdrawTx(this._address, withdrawAmount, params.asset);\n effectiveAmount = result.effectiveAmount;\n return result.tx;\n });\n\n try {\n this.portfolio.recordUnearn(params.asset);\n } catch {\n // Portfolio may not have the position tracked — safe to ignore\n }\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._signer, 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._signer, 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._signer, 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._signer, 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 const totalFunds = bal.available + bal.savings;\n if (params.usdAmount > totalFunds * 1.05) {\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. You have $${totalFunds.toFixed(2)} total (checking: $${bal.available.toFixed(2)}, savings: $${bal.savings.toFixed(2)}) but need $${params.usdAmount.toFixed(2)}.`,\n );\n }\n\n if (bal.available < params.usdAmount && !params.dryRun) {\n await this._autoFundFromSavings(params.usdAmount - bal.available);\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._signer, 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 // Always attempt unearn — investUnearn checks on-chain state as fallback\n // when local portfolio is stale.\n const unearnFailures: Array<{ asset: string; error: string }> = [];\n for (const pos of stratPositions) {\n try {\n await this.investUnearn({ asset: pos.asset as InvestmentAsset });\n await new Promise(r => setTimeout(r, 1500));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // \"not currently earning\" is expected for assets already in wallet — not a failure\n if (!msg.includes('not currently earning')) {\n unearnFailures.push({ asset: pos.asset, error: msg });\n }\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._signer, 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 let pnl = 0;\n try {\n 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 } catch {\n // Portfolio position already zeroed (stale state) — still a valid sell\n }\n\n try {\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 } catch {\n // Portfolio position already zeroed (stale state) — still a valid sell\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 strategy tracking. If some assets failed to unearn they're still in\n // lending and we keep the strategy so the user can retry, otherwise wipe it.\n if (this.portfolio.hasStrategyPositions(params.strategy)) {\n if (unearnFailures.length === 0) {\n this.portfolio.clearStrategy(params.strategy);\n } else {\n // Remove only the positions that were successfully sold\n for (const s of sells) {\n this.portfolio.closeStrategyPosition(params.strategy, s.asset);\n }\n }\n }\n\n const failed = unearnFailures.map(f => ({ asset: f.asset, reason: f.error }));\n\n return {\n success: true,\n strategy: params.strategy,\n totalProceeds,\n realizedPnL: totalPnL,\n sells,\n failed: failed.length > 0 ? failed : undefined,\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._signer, 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 // Direct positions already include strategy buy amounts.\n // Use direct as the source of truth for totals; subtract strategy\n // amounts from direct to show only non-strategy \"Direct\" holdings.\n const strategyAmountByAsset: Record<string, { amount: number; costBasis: number }> = {};\n for (const strats of Object.values(strategyPositions)) {\n for (const sp of strats) {\n const prev = strategyAmountByAsset[sp.asset] ?? { amount: 0, costBasis: 0 };\n strategyAmountByAsset[sp.asset] = {\n amount: prev.amount + sp.totalAmount,\n costBasis: prev.costBasis + sp.costBasis,\n };\n }\n }\n\n const directOnly = enriched\n .map(pos => {\n const strat = strategyAmountByAsset[pos.asset];\n if (!strat) return pos;\n const directAmt = pos.totalAmount - strat.amount;\n if (directAmt <= 0.000001) return null;\n const directCost = pos.costBasis - strat.costBasis;\n const currentValue = directAmt * (pos.currentPrice ?? 0);\n return {\n ...pos,\n totalAmount: directAmt,\n costBasis: directCost,\n currentValue,\n unrealizedPnL: currentValue - directCost,\n unrealizedPnLPct: directCost > 0 ? ((currentValue - directCost) / directCost) * 100 : 0,\n };\n })\n .filter((p): p is InvestmentPosition => p !== null);\n\n // Totals from direct (source of truth — includes strategy amounts)\n const totalInvested = enriched.reduce((sum, p) => sum + p.costBasis, 0);\n const totalValue = enriched.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: directOnly,\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._signer, 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._signer, 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._signer, 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._signer, 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._address);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this._address);\n }\n\n // -- 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._signer, 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 // Direct positions are the source of truth (include strategy amounts).\n const pos = this.portfolio.getPosition(asset);\n const walletInvested = (pos && pos.totalAmount > 0 && !pos.earning) ? pos.totalAmount : 0;\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/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.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/utils/base64.ts","../src/gas/gasStation.ts","../src/gas/autoTopUp.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","naviGetPools","updateOraclePriceBeforeUserOperationPTB","getLendingPositions","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 — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const 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 | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | '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 type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","import { 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 { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiJsonRpcClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\n","import 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\nconst SUI_TYPE = '0x2::sui::SUI';\n\nconst KNOWN_TARGETS: [RegExp, string][] = [\n [/::suilend|::obligation/, 'lending'],\n [/::navi|::incentive_v2/, 'lending'],\n [/::cetus|::pool/, 'swap'],\n [/::deepbook/, 'swap'],\n [/::transfer::public_transfer/, 'send'],\n];\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => parseTxRecord(tx as unknown as TxBlock, address));\n}\n\nexport async function queryTransaction(\n client: SuiJsonRpcClient,\n digest: string,\n senderAddress: string,\n): Promise<TransactionRecord | null> {\n try {\n const tx = await client.getTransactionBlock({\n digest,\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n });\n return parseTxRecord(tx as unknown as TxBlock, senderAddress);\n } catch {\n return null;\n }\n}\n\ninterface TxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: BalanceChange[];\n}\n\nfunction parseTxRecord(tx: TxBlock, address: string): TransactionRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n const { moveCallTargets, commandTypes } = extractCommands(tx.transaction);\n const { amount, asset, recipient } = extractTransferDetails(tx.balanceChanges, address);\n const action = classifyAction(moveCallTargets, commandTypes);\n\n return {\n digest: tx.digest,\n action,\n amount,\n asset,\n recipient,\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n}\n\ninterface BalanceChange {\n owner: { AddressOwner?: string } | string;\n coinType: string;\n amount: string;\n}\n\nfunction resolveOwner(owner: BalanceChange['owner']): string | null {\n if (typeof owner === 'object' && owner.AddressOwner) return owner.AddressOwner;\n if (typeof owner === 'string') return owner;\n return null;\n}\n\nfunction extractTransferDetails(\n changes: BalanceChange[] | undefined,\n sender: string,\n): { amount?: number; asset?: string; recipient?: string } {\n if (!changes || changes.length === 0) return {};\n\n const outflows = changes.filter((c) => resolveOwner(c.owner) === sender && BigInt(c.amount) < 0n);\n const inflows = changes.filter((c) => resolveOwner(c.owner) !== sender && BigInt(c.amount) > 0n);\n\n const primaryOutflow = outflows\n .filter((c) => c.coinType !== SUI_TYPE)\n .sort((a, b) => Number(BigInt(a.amount) - BigInt(b.amount)))[0]\n ?? outflows[0];\n\n if (!primaryOutflow) return {};\n\n const coinType = primaryOutflow.coinType;\n const decimals = coinType.includes('::usdc::') ? 6 : 9;\n const amount = Math.abs(Number(BigInt(primaryOutflow.amount))) / 10 ** decimals;\n const asset = coinType === SUI_TYPE ? 'SUI' : coinType.includes('::usdc::') ? 'USDC' : coinType.split('::').pop() ?? 'unknown';\n\n const recipientChange = inflows.find((c) => c.coinType === coinType);\n const recipient = recipientChange ? resolveOwner(recipientChange.owner) ?? undefined : undefined;\n\n return { amount, asset, recipient };\n}\n\ninterface CommandInfo {\n moveCallTargets: string[];\n commandTypes: string[];\n}\n\nfunction extractCommands(txBlock: unknown): CommandInfo {\n const result: CommandInfo = { moveCallTargets: [], commandTypes: [] };\n try {\n if (!txBlock || typeof txBlock !== 'object') return result;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return result;\n const inner = 'transaction' in (data as Record<string, unknown>)\n ? (data as Record<string, unknown>).transaction\n : undefined;\n if (!inner || typeof inner !== 'object') return result;\n const commands = 'commands' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).commands\n : undefined;\n if (!Array.isArray(commands)) return result;\n\n for (const cmd of commands as Record<string, unknown>[]) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n result.moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n result.commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n result.commandTypes.push('TransferObjects');\n }\n }\n } catch { /* best effort */ }\n return result;\n}\n\nfunction classifyAction(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of KNOWN_TARGETS) {\n if (pattern.test(target)) return label;\n }\n }\n\n const hasTransfer = commandTypes.includes('TransferObjects');\n const hasMoveCall = commandTypes.includes('MoveCall');\n\n if (hasTransfer && !hasMoveCall) return 'send';\n if (hasMoveCall) return 'transaction';\n\n return 'transaction';\n}\n","import { 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 { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, 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 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; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean },\n): Promise<void> {\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n // Pyth update uses tx.splitCoins(tx.gas, ...) which is incompatible\n // with sponsored transactions where tx.gas belongs to the sponsor.\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0');\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of 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 address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const 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 buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address);\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; collectFee?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address);\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string; sponsored?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin as TransactionObjectArgument, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\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 await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n } catch {\n return [];\n }\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n const claimed = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n\n return claimed.map((c) => ({\n protocol: 'navi',\n asset: '',\n coinType: '',\n symbol: 'REWARD',\n amount: 0,\n estimatedValueUsd: 0,\n }));\n } catch {\n return [];\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, address);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy / 100;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n const totalYieldEarned = dailyEarning * 30;\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, address);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\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 { TransactionSigner } from '../signer.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: TransactionSigner,\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 address = signer.getAddress();\n const tx = new Transaction();\n tx.setSender(address);\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 tx.transferObjects([attack], address);\n\n const built = await tx.build({ client });\n const { signature } = await signer.signTransaction(built);\n const result = await client.executeTransactionBlock({\n transactionBlock: built,\n signature,\n options: { showObjectChanges: true, showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const attackObj = result.objectChanges?.find(\n (c: Record<string, unknown>) => c.type === 'created' && (c.objectType as string)?.includes('::sentinel::Attack'),\n );\n\n const attackObjectId = attackObj && 'objectId' in attackObj ? (attackObj as Record<string, string>).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: TransactionSigner,\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 address = signer.getAddress();\n const tx = new Transaction();\n tx.setSender(address);\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 built = await tx.build({ client });\n const { signature } = await signer.signTransaction(built);\n const result = await client.executeTransactionBlock({\n transactionBlock: built,\n signature,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const txSuccess = (result.effects as { status?: { status?: string } })?.status?.status === 'success';\n\n return { digest: result.digest, success: txSuccess };\n}\n\nexport async function attack(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\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; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\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 { 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 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\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\nasync function quietSuilend<T>(fn: () => Promise<T>): Promise<T> {\n const origLog = console.log;\n const origWarn = console.warn;\n const filter = (...args: unknown[]) =>\n typeof args[0] === 'string' && (args[0].includes('PythEndpoint') || args[0].includes('PythConnection'));\n console.log = (...args: unknown[]) => { if (!filter(...args)) origLog.apply(console, args); };\n console.warn = (...args: unknown[]) => { if (!filter(...args)) origWarn.apply(console, args); };\n return fn().finally(() => { console.log = origLog; console.warn = origWarn; });\n}\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 quietSuilend(() => 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 quietSuilend(() => 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 (amountUsd > 0.01) {\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 (amountUsd > 0.01) {\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 quietSuilend(() => 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 const rawValue = stableToRaw(amount, assetInfo.decimals).toString();\n\n if (caps.length > 0) {\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 await sdk.depositIntoObligation(address, assetInfo.type, rawValue, tx, caps[0].id);\n } else {\n const newCap = sdk.createObligation(tx);\n\n let depositCoin: TransactionObjectArgument;\n if (assetKey === 'SUI') {\n [depositCoin] = tx.splitCoins(tx.gas, [rawValue]);\n } else {\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 primaryCoin = tx.object(allCoins[0].coinObjectId);\n if (allCoins.length > 1) {\n tx.mergeCoins(primaryCoin, allCoins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n [depositCoin] = tx.splitCoins(primaryCoin, [rawValue]);\n }\n\n if (options?.collectFee) {\n addCollectFeeToTx(tx, depositCoin, 'save');\n }\n\n sdk.deposit(depositCoin, assetInfo.type, newCap as unknown as string, tx);\n tx.transferObjects([newCap], 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\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 { ctokenRaw, effectiveAmount, obligationIndex } = await this.resolveWithdrawCTokens(sdk, address, assetKey, assetInfo, amount);\n const cap = caps[obligationIndex] ?? caps[0];\n const tx = new Transaction();\n tx.setSender(address);\n\n await sdk.withdrawAndSendToUser(address, cap.id, cap.obligationId, assetInfo.type, ctokenRaw, 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 { ctokenRaw, effectiveAmount, obligationIndex } = await this.resolveWithdrawCTokens(sdk, address, assetKey, assetInfo, amount);\n const cap = caps[obligationIndex] ?? caps[0];\n const coin = await sdk.withdraw(cap.id, cap.obligationId, assetInfo.type, ctokenRaw, 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 private async resolveWithdrawCTokens(\n sdk: SuilendClient,\n address: string,\n assetKey: string,\n assetInfo: (typeof SUPPORTED_ASSETS)[keyof typeof SUPPORTED_ASSETS],\n amount: number,\n ): Promise<{ ctokenRaw: string; effectiveAmount: number; obligationIndex: number }> {\n const { reserveMap, refreshedRawReserves } = await quietSuilend(() => initializeSuilend(this.client, sdk));\n const { obligations } = await initializeObligations(\n this.client, sdk, refreshedRawReserves, reserveMap, address,\n );\n if (obligations.length === 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on Suilend — no obligations found`);\n\n // Search ALL obligations, not just the first (user may have multiple obligation caps)\n let dep: (typeof obligations)[0]['deposits'][0] | undefined;\n let matchedObligation = 0;\n for (let oi = 0; oi < obligations.length; oi++) {\n dep = obligations[oi].deposits.find(d => {\n const resolved = this.resolveSymbol(d.coinType);\n if (resolved === assetKey) return true;\n try {\n return normalizeStructTag(d.coinType) === normalizeStructTag(assetInfo.type);\n } catch { return false; }\n });\n if (dep && dep.depositedAmount.toNumber() > 1e-10) {\n matchedObligation = oi;\n break;\n }\n dep = undefined;\n }\n\n if (!dep) {\n const foundDeposits = obligations.flatMap((o, i) =>\n o.deposits.map(d => `ob${i}:${this.resolveSymbol(d.coinType)}=${d.depositedAmount.toFixed(8)}`),\n );\n throw new T2000Error(\n 'NO_COLLATERAL',\n `Nothing to withdraw for ${assetInfo.displayName} (${assetKey}) on Suilend. Found deposits: [${foundDeposits.join(', ')}]`,\n );\n }\n\n const deposited = dep.depositedAmount.toNumber();\n const effectiveAmount = Math.min(amount, deposited);\n const proportion = effectiveAmount / deposited;\n\n const ctokenRaw = proportion >= 0.999\n ? dep.depositedCtokenAmount.toFixed(0)\n : dep.depositedCtokenAmount.times(proportion).integerValue(1).toFixed(0);\n\n return { ctokenRaw, effectiveAmount, obligationIndex: matchedObligation };\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 quietSuilend(() => 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 quietSuilend(() => 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","/** Cross-platform (Node + browser) base64 helpers. */\n\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nexport function fromBase64(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { toBase64 } from '../utils/base64.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\n/**\n * Request gas sponsorship from the gas station.\n *\n * Sends `txJson` (preferred) or `txBcsBytes` (base64-encoded BCS from tx.build(),\n * used when serialize() fails due to v1/v2 SDK mismatch with aggregator).\n */\nexport async function requestGasSponsorship(\n txJson: string,\n sender: string,\n type?: GasRequestType,\n txBcsBytes?: string,\n): Promise<GasSponsorResponse> {\n const payload: Record<string, unknown> = { sender, type };\n if (txBcsBytes) {\n payload.txBcsBytes = txBcsBytes;\n } else {\n payload.txJson = txJson;\n payload.txBytes = toBase64(new TextEncoder().encode(txJson));\n }\n\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED' || errorCode === 'PRICE_STALE') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter, reason: errorCode },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n { reason: errorCode },\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SUPPORTED_ASSETS,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_AMOUNT,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport { buildSwapTx } from '../protocols/cetus.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport { T2000Error } from '../errors.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n return suiRaw < GAS_RESERVE_TARGET && usdcRaw >= AUTO_TOPUP_MIN_USDC;\n}\n\n/**\n * Swap USDC→SUI to replenish gas. Tries self-funding first; if the agent\n * doesn't have enough SUI to pay for the swap itself, falls back to\n * gas station sponsorship — eliminating the chicken-and-egg problem.\n */\nexport async function executeAutoTopUp(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n): Promise<AutoTopUpResult> {\n const address = signer.getAddress();\n const topupAmountHuman = Number(AUTO_TOPUP_AMOUNT) / 1e6;\n\n const { tx } = await buildSwapTx({\n client,\n address,\n fromAsset: 'USDC',\n toAsset: 'SUI',\n amount: topupAmountHuman,\n });\n tx.setSender(address);\n\n let result;\n try {\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n } catch {\n // Not enough SUI to self-fund the swap — sponsor it via gas station\n const { tx: freshTx } = await buildSwapTx({\n client, address, fromAsset: 'USDC', toAsset: 'SUI', amount: topupAmountHuman,\n });\n freshTx.setSender(address);\n\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = freshTx.serialize();\n } catch {\n const bcsBytes = await freshTx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsored = await requestGasSponsorship(\n txJson ?? '', address, 'auto-topup', txBcsBase64,\n );\n const sponsoredTxBytes = fromBase64(sponsored.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n result = await client.executeTransactionBlock({\n transactionBlock: sponsored.txBytes,\n signature: [agentSig, sponsored.sponsorSignature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n reportGasUsage(address, result.digest, 0, 0, 'auto-topup');\n }\n\n await client.waitForTransaction({ digest: result.digest });\n\n const eff = result.effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n throw new T2000Error(\n 'TRANSACTION_FAILED',\n `Auto-topup swap failed on-chain: ${eff.status.error ?? 'unknown'}`,\n );\n }\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 type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error, isMoveAbort, parseMoveAbortMessage } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport type { SafeguardEnforcer } from '../safeguards/enforcer.js';\nimport type { TxMetadata } from '../safeguards/types.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n gasMethod: GasMethod;\n gasCostSui: number;\n /** Pre-TX SUI balance in MIST — used internally for proactive gas maintenance. */\n preTxSuiMist?: bigint;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nasync function getSuiBalance(client: SuiJsonRpcClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function assertTxSuccess(effects: unknown, digest: string): Promise<void> {\n const eff = effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n const errMsg = eff.status.error ?? 'unknown on-chain error';\n if (isMoveAbort(errMsg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(errMsg));\n }\n throw new T2000Error('TRANSACTION_FAILED', `Transaction ${digest} failed on-chain: ${errMsg}`);\n }\n}\n\nasync function trySelfFunded(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiBalance,\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, signer);\n\n // Rebuild the transaction with fresh object versions (auto-topup changed coin state)\n const tx = await buildTx();\n tx.setSender(address);\n\n const suiAfterTopUp = await getSuiBalance(client, address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiAfterTopUp,\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n tx.setSender(address);\n\n // Use serialize() for pure v2 transactions, fall back to build() for\n // mixed v1/v2 transactions (e.g. Cetus aggregator adds v1 commands).\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = tx.serialize();\n } catch {\n const bcsBytes = await tx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = fromBase64(sponsoredResult.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n preTxSuiMist: suiBalance,\n };\n}\n\n/**\n * Best-effort indexer readiness check after transaction finalization.\n * Verifies the TX effects are queryable. Note: aggregate indices\n * (getBalance, getDynamicFields) may still lag — callers that need\n * consistent reads should poll their expected state separately.\n */\nasync function waitForIndexer(client: SuiJsonRpcClient, digest: string): Promise<void> {\n for (let i = 0; i < 3; i++) {\n try {\n await client.getTransactionBlock({ digest, options: { showObjectChanges: true } });\n return;\n } catch {\n await new Promise(r => setTimeout(r, 500));\n }\n }\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n *\n * After every successful transaction, proactively tops up SUI if it\n * dropped below threshold — so the user never hits a \"no gas\" wall.\n */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n options?: { metadata?: TxMetadata; enforcer?: SafeguardEnforcer },\n): Promise<GasExecutionResult> {\n if (options?.enforcer && options?.metadata) {\n options.enforcer.check(options.metadata);\n }\n\n const result = await resolveGas(client, signer, buildTx);\n\n // Proactive gas maintenance — compute remaining SUI from the TX result\n // instead of querying the indexer (which may still show stale balances).\n try {\n if (result.preTxSuiMist !== undefined) {\n const gasCostMist = result.gasMethod === 'sponsored'\n ? 0n\n : BigInt(Math.round(result.gasCostSui * 1e9));\n const estimatedRemaining = result.preTxSuiMist - gasCostMist;\n if (estimatedRemaining < GAS_RESERVE_TARGET) {\n const address = signer.getAddress();\n const usdcBal = await client.getBalance({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n if (BigInt(usdcBal.totalBalance) >= AUTO_TOPUP_MIN_USDC) {\n await executeAutoTopUp(client, signer);\n }\n }\n }\n } catch { /* best-effort — don't fail the main operation */ }\n\n return result;\n}\n\nconst GAS_RESOLUTION_CODES: Set<string> = new Set([\n 'INSUFFICIENT_GAS',\n 'GAS_STATION_UNAVAILABLE',\n 'GAS_FEE_EXCEEDED',\n 'AUTO_TOPUP_FAILED',\n 'SPONSOR_UNAVAILABLE',\n]);\n\nfunction isBuildError(err: unknown): err is T2000Error {\n return err instanceof T2000Error && !GAS_RESOLUTION_CODES.has(err.code);\n}\n\nasync function resolveGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n let lastBuildError: T2000Error | undefined;\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (swap USDC→SUI) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, signer, buildTx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2.5: Retry self-funded — auto-topup may have deposited SUI\n // even if the combined operation failed\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded-retry: ${msg}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('sponsored: returned null');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n if (lastBuildError) throw lastBuildError;\n\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and sponsorship unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","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 getStrategyAmountForAsset(asset: string): number {\n this.load();\n let total = 0;\n for (const bucket of Object.values(this.data.strategies)) {\n const pos = bucket[asset];\n if (pos && pos.totalAmount > 0) total += pos.totalAmount;\n }\n return total;\n }\n\n getDirectAmount(asset: string): number {\n this.load();\n const aggregate = this.data.positions[asset]?.totalAmount ?? 0;\n const strategyAmount = this.getStrategyAmountForAsset(asset);\n return Math.max(0, aggregate - strategyAmount);\n }\n\n deductFromStrategies(asset: string, amount: number): void {\n this.load();\n let remaining = amount;\n for (const [stratKey, bucket] of Object.entries(this.data.strategies)) {\n if (remaining <= 0) break;\n const pos = bucket[asset];\n if (!pos || pos.totalAmount <= 0) continue;\n\n const deduct = Math.min(pos.totalAmount, remaining);\n const costDeduct = pos.avgPrice * deduct;\n pos.totalAmount -= deduct;\n pos.costBasis -= costDeduct;\n if (pos.totalAmount < 0.000001) {\n pos.totalAmount = 0;\n pos.costBasis = 0;\n pos.avgPrice = 0;\n }\n remaining -= deduct;\n\n const hasPositions = Object.values(bucket).some((p) => p.totalAmount > 0);\n if (!hasPositions) {\n delete this.data.strategies[stratKey];\n }\n }\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 closeStrategyPosition(strategyKey: string, asset: string): void {\n this.load();\n const bucket = this.data.strategies[strategyKey];\n if (!bucket?.[asset]) return;\n bucket[asset].totalAmount = 0;\n bucket[asset].costBasis = 0;\n bucket[asset].avgPrice = 0;\n const hasPositions = Object.values(bucket).some((p) => p.totalAmount > 0);\n if (!hasPositions) {\n delete this.data.strategies[strategyKey];\n }\n this.save();\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 type { TransactionSigner } from './signer.js';\nimport { KeypairSigner } from './wallet/keypairSigner.js';\nimport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory, queryTransaction } from './wallet/history.js';\nimport { 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 PayOptions,\n PayResult,\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 _signer: TransactionSigner;\n private readonly _keypair?: Ed25519Keypair;\n private readonly client: SuiJsonRpcClient;\n private readonly _address: string;\n private readonly registry: ProtocolRegistry;\n readonly enforcer: SafeguardEnforcer;\n readonly contacts: ContactManager;\n readonly portfolio: PortfolioManager;\n readonly strategies: StrategyManager;\n readonly autoInvest: AutoInvestManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string);\n private constructor(signer: TransactionSigner, client: SuiJsonRpcClient, registry: ProtocolRegistry | undefined, configDir: string | undefined, isSignerMode: true);\n private constructor(\n keypairOrSigner: Ed25519Keypair | TransactionSigner,\n client: SuiJsonRpcClient,\n registry?: ProtocolRegistry,\n configDir?: string,\n isSignerMode?: boolean,\n ) {\n super();\n if (isSignerMode) {\n this._signer = keypairOrSigner as TransactionSigner;\n this._keypair = undefined;\n this._address = this._signer.getAddress();\n } else {\n const kp = keypairOrSigner as Ed25519Keypair;\n this._keypair = kp;\n this._signer = new KeypairSigner(kp);\n this._address = getAddress(kp);\n }\n this.client = client;\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n 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 integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for CLI/MCP integrations. */\n get keypair(): Ed25519Keypair {\n if (!this._keypair) {\n throw new T2000Error('WALLET_NOT_FOUND', 'Keypair not available — this instance uses zkLogin');\n }\n return this._keypair;\n }\n\n /** Transaction signer (works for both keypair and zkLogin). */\n get signer(): TransactionSigner {\n return this._signer;\n }\n\n // -- MPP Payments --\n\n async pay(options: PayOptions): Promise<PayResult> {\n this.enforcer.assertNotLocked();\n this.enforcer.check({ operation: 'pay', amount: options.maxPrice ?? 1.0 });\n\n const { Mppx } = await import('mppx/client');\n const { sui } = await import('@t2000/mpp-sui/client');\n\n const client = this.client;\n const signer = this._signer;\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [sui({\n client,\n signer,\n execute: async (tx) => {\n const result = await executeWithGas(client, signer, () => tx);\n return { digest: result.digest, effects: result.effects };\n },\n })],\n });\n\n const method = (options.method ?? 'GET').toUpperCase();\n const canHaveBody = method !== 'GET' && method !== 'HEAD';\n\n const response = await mppx.fetch(options.url, {\n method,\n headers: options.headers,\n body: canHaveBody ? options.body : undefined,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n let body: unknown;\n try {\n body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n } catch {\n body = null;\n }\n\n const receiptHeader = response.headers.get('x-payment-receipt');\n const paid = !!receiptHeader;\n\n if (paid) {\n this.enforcer.recordUsage(options.maxPrice ?? 1.0);\n }\n\n return {\n status: response.status,\n body,\n paid,\n cost: paid ? (options.maxPrice ?? undefined) : undefined,\n receipt: receiptHeader\n ? { reference: receiptHeader, timestamp: new Date().toISOString() }\n : undefined,\n };\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n this.enforcer.assertNotLocked();\n\n const asset = (params.asset ?? 'USDC') as keyof typeof SUPPORTED_ASSETS;\n if (!(asset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n\n const resolved = this.contacts.resolve(params.to);\n const sendAmount = params.amount;\n const sendTo = resolved.address;\n\n const gasResult = await executeWithGas(this.client, this._signer, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n { metadata: { operation: 'send', amount: sendAmount }, enforcer: this.enforcer },\n );\n\n this.enforcer.recordUsage(sendAmount);\n const balance = await this.balance();\n\n this.emitBalanceChange(asset, sendAmount, 'send', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: sendAmount,\n to: resolved.address,\n contactName: resolved.contactName,\n gasCost: gasResult.gasCostSui,\n gasCostUnit: 'SUI',\n gasMethod: gasResult.gasMethod,\n balance,\n };\n }\n\n async balance(): Promise<BalanceResponse> {\n const bal = await queryBalance(this.client, this._address);\n\n 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 // Direct positions already include strategy buy amounts — don't add\n // strategy positions again or the investment total will be double-counted.\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\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 transactionDetail(digest: string): Promise<TransactionRecord | null> {\n return queryTransaction(this.client, digest, this._address);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: '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 /** Create a T2000 instance from zkLogin credentials (for web app). */\n static fromZkLogin(opts: {\n ephemeralKeypair: Ed25519Keypair;\n zkProof: ZkLoginProof;\n userAddress: string;\n maxEpoch: number;\n rpcUrl?: string;\n }): T2000 {\n const signer = new ZkLoginSigner(opts.ephemeralKeypair, opts.zkProof, opts.userAddress, opts.maxEpoch);\n const client = getSuiClient(opts.rpcUrl);\n return new T2000(signer, client, undefined, undefined, true);\n }\n\n async registerAdapter(adapter: LendingAdapter | 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._signer, 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 // Verify the deposit is visible on-chain before returning.\n // With NAVI cache disabled this usually succeeds on the first try;\n // the retry handles rare indexer propagation lag.\n let savingsBalance = saveAmount;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const positions = await this.positions();\n const actual = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n if (actual > 0) {\n savingsBalance = actual;\n break;\n }\n } catch { /* retry */ }\n await new Promise(r => setTimeout(r, 2000));\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.saveApy,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n savingsBalance,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; 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._signer, 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 if (target.asset !== 'USDC') {\n try {\n const postBal = await queryBalance(this.client, this._address);\n await this._convertWalletStablesToUsdc(postBal);\n } catch {\n // Best-effort: if swap fails the user still has the stablecoins\n }\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._signer, 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 return lastTx!;\n });\n\n if (hasNonUsdc) {\n try {\n const postBal = await queryBalance(this.client, this._address);\n await this._convertWalletStablesToUsdc(postBal);\n } catch {\n // Best-effort: if swap fails the user still has the stablecoins\n }\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\n if (all.length > 0) {\n this._lastFundDigest = undefined;\n return all;\n }\n\n // Chain-direct fallback: getCoins (indexer) returned nothing but we\n // recently did an auto-fund. Read the TX's objectChanges to discover\n // coin IDs, then fetch their current state via multiGetObjects — both\n // are chain-direct queries unaffected by indexer lag.\n // Keeps _lastFundDigest for subsequent resolveGas retries.\n if (this._lastFundDigest && coinType === SUPPORTED_ASSETS.USDC.type) {\n const txInfo = await this.client.getTransactionBlock({\n digest: this._lastFundDigest,\n options: { showObjectChanges: true },\n });\n const coinIds = (txInfo.objectChanges ?? [])\n .filter((c): c is typeof c & { objectId: string } =>\n (c.type === 'created' || c.type === 'mutated') &&\n 'objectType' in c &&\n typeof c.objectType === 'string' &&\n c.objectType.includes('0x2::coin::Coin') &&\n c.objectType.includes(coinType),\n )\n .map(c => c.objectId);\n\n if (coinIds.length > 0) {\n const objects = await this.client.multiGetObjects({\n ids: coinIds,\n options: { showContent: true, showOwner: true },\n });\n for (const obj of objects) {\n if (\n obj.data?.content?.dataType === 'moveObject' &&\n obj.data.owner &&\n typeof obj.data.owner === 'object' &&\n 'AddressOwner' in obj.data.owner &&\n obj.data.owner.AddressOwner === this._address\n ) {\n const fields = obj.data.content.fields as Record<string, unknown>;\n all.push({ coinObjectId: obj.data.objectId!, balance: String(fields.balance ?? '0') });\n }\n }\n }\n }\n\n return all;\n }\n\n private _mergeCoinsInTx(tx: Transaction, coins: Array<{ coinObjectId: string; balance: string }>): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n }\n\n private 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._signer, 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._signer, 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 /**\n * Auto-withdraw from savings when checking balance is insufficient for an\n * operation. Handles non-USDC savings (e.g. USDe) via the standard withdraw\n * path which swaps back to USDC. Throws if savings are also insufficient.\n */\n private _lastFundDigest: string | undefined;\n\n private async _autoFundFromSavings(shortfall: number): Promise<void> {\n const positions = await this.positions();\n const savingsTotal = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n if (savingsTotal < shortfall * 0.95) {\n const bal = await queryBalance(this.client, this._address);\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. Available: $${bal.available.toFixed(2)}, savings: $${savingsTotal.toFixed(2)}, requested shortfall: $${shortfall.toFixed(2)}`,\n );\n }\n\n const result = await this.withdraw({ amount: shortfall });\n if (result.amount < shortfall * 0.5) {\n throw new T2000Error(\n 'WITHDRAW_FAILED',\n `Auto-withdraw from savings returned $${result.amount.toFixed(2)} — expected ~$${shortfall.toFixed(2)}. Try withdrawing manually first.`,\n );\n }\n\n // Verify via chain query (not indexer) that the withdraw TX produced\n // USDC. Store the digest so _fetchCoins can fall back to reading the\n // TX's objectChanges directly if the indexer hasn't caught up yet.\n const txInfo = await this.client.getTransactionBlock({\n digest: result.tx,\n options: { showBalanceChanges: true },\n });\n const usdcReceived = (txInfo.balanceChanges ?? []).some(\n c => c.coinType === SUPPORTED_ASSETS.USDC.type &&\n Number(c.amount) > 0 &&\n typeof c.owner === 'object' && 'AddressOwner' in c.owner &&\n c.owner.AddressOwner === this._address,\n );\n if (!usdcReceived) {\n throw new T2000Error('WITHDRAW_FAILED', 'Withdraw TX did not produce USDC');\n }\n this._lastFundDigest = result.tx;\n }\n\n 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._signer, async () => {\n const { tx } = await adapter.buildBorrowTx(this._address, borrowAmount, asset, { collectFee: true });\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n reportFee(this._address, 'borrow', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange(asset, borrowAmount, 'borrow', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: borrowAmount,\n fee: fee.amount,\n healthFactor: hf.healthFactor,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async repay(params: { amount: number | 'all'; protocol?: string }): Promise<RepayResult> {\n this.enforcer.assertNotLocked();\n // 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._signer, 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._signer, 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 // -- Swap (formerly Exchange) --\n\n async swap(params: { from: string; to: string; amount: number; maxSlippage?: number; _skipPortfolioRecord?: 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 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 ? Math.round(params.maxSlippage * 10000) : undefined;\n\n let swapMeta: { estimatedOut: number; toDecimals: number } = { estimatedOut: 0, toDecimals: 0 };\n\n const gasResult = await executeWithGas(this.client, this._signer, 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 const stableSet = new Set<string>(STABLE_ASSETS);\n if (!params._skipPortfolioRecord && stableSet.has(fromAsset) && toAsset in INVESTMENT_ASSETS && actualReceived > 0) {\n const price = swapAmount / actualReceived;\n this.portfolio.recordBuy({\n id: `swap_${Date.now()}`,\n type: 'buy',\n asset: toAsset,\n amount: actualReceived,\n price,\n usdValue: swapAmount,\n fee: fee.amount,\n tx: gasResult.digest,\n timestamp: new Date().toISOString(),\n });\n } else if (!params._skipPortfolioRecord && fromAsset in INVESTMENT_ASSETS && stableSet.has(toAsset) && actualReceived > 0) {\n const price = actualReceived / swapAmount;\n this.portfolio.recordSell({\n id: `swap_${Date.now()}`,\n type: 'sell',\n asset: fromAsset,\n amount: swapAmount,\n price,\n usdValue: actualReceived,\n fee: fee.amount,\n tx: gasResult.digest,\n timestamp: new Date().toISOString(),\n });\n }\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 swapQuote(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 /** @deprecated Use swap() instead */\n async exchange(params: { from: string; to: string; amount: number; maxSlippage?: number; _bypassInvestmentGuard?: boolean }): Promise<SwapResult> {\n return this.swap(params);\n }\n\n /** @deprecated Use swapQuote() instead */\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 return this.swapQuote(params);\n }\n\n // -- Investment (strategies only — individual buy/sell deprecated, use swap()) --\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 const totalFunds = bal.available + bal.savings;\n if (params.usdAmount > totalFunds * 1.05) {\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. You have $${totalFunds.toFixed(2)} total (checking: $${bal.available.toFixed(2)}, savings: $${bal.savings.toFixed(2)}) but need $${params.usdAmount.toFixed(2)}.`,\n );\n }\n\n if (bal.available < params.usdAmount) {\n await this._autoFundFromSavings(params.usdAmount - bal.available);\n }\n\n let swapResult: Awaited<ReturnType<typeof this.swap>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.swap({\n from: 'USDC',\n to: params.asset,\n amount: params.usdAmount,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\n _skipPortfolioRecord: 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 let pos = this.portfolio.getPosition(params.asset);\n\n // Auto-unearn if the position is currently earning\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 pos = this.portfolio.getPosition(params.asset);\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 // If no position record exists at all (stale/missing portfolio file),\n // fall back to wallet balance so the sell can still proceed.\n // But if a position record exists with totalAmount 0, the user already\n // sold everything — don't fall back to wallet balance.\n const trackedAmount = pos\n ? pos.totalAmount\n : maxSellable;\n\n if (trackedAmount <= 0) {\n throw new T2000Error('INSUFFICIENT_INVESTMENT', `No ${params.asset} position to sell`);\n }\n\n let sellAmountAsset: number;\n if (params.usdAmount === 'all') {\n sellAmountAsset = Math.min(trackedAmount, 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 const maxPosition = params._strategyOnly ? maxSellable : trackedAmount;\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.swap>>;\n const maxRetries = 3;\n for (let attempt = 0; ; attempt++) {\n try {\n swapResult = await this.swap({\n from: params.asset,\n to: 'USDC',\n amount: sellAmountAsset,\n maxSlippage: params.maxSlippage ?? defaultSlippage(params.asset),\n _skipPortfolioRecord: 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 directAmountBeforeSell = this.portfolio.getDirectAmount(params.asset);\n\n let realizedPnL = 0;\n try {\n 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 } catch {\n // Position already zeroed in local portfolio (stale state) — sell still valid\n }\n\n if (params.usdAmount === 'all' && !params._strategyOnly) {\n this.portfolio.closePosition(params.asset);\n this.portfolio.deductFromStrategies(params.asset, sellAmountAsset);\n } else if (!params._strategyOnly && sellAmountAsset > 0) {\n const overflowIntoStrategy = sellAmountAsset - directAmountBeforeSell;\n if (overflowIntoStrategy > 0) {\n this.portfolio.deductFromStrategies(params.asset, overflowIntoStrategy);\n }\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) {\n throw new T2000Error('INVEST_ALREADY_EARNING', `${params.asset} is already earning via ${pos.earningProtocol ?? 'lending'}`);\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._signer, 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 let pos = this.portfolio.getPosition(params.asset);\n let adapter: import('./adapters/types.js').LendingAdapter | undefined;\n let withdrawAmount: number;\n\n if (pos?.earning && pos.earningProtocol) {\n adapter = this.registry.getLending(pos.earningProtocol);\n withdrawAmount = pos.totalAmount;\n } else {\n // Local portfolio disagrees — check on-chain to recover from stale state.\n const onChain = await this.registry.allPositions(this._address);\n let found: { protocolId: string; amount: number } | undefined;\n for (const entry of onChain) {\n const supply = entry.positions.supplies.find(s => s.asset === params.asset);\n if (supply && supply.amount > 1e-10) {\n found = { protocolId: entry.protocolId, amount: supply.amount };\n break;\n }\n }\n if (!found) {\n throw new T2000Error('INVEST_NOT_EARNING', `${params.asset} is not currently earning (checked on-chain)`);\n }\n adapter = this.registry.getLending(found.protocolId);\n withdrawAmount = found.amount;\n }\n\n if (!adapter) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Lending protocol not found for ${params.asset}`);\n }\n\n const protocolName = adapter.name;\n let effectiveAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this._signer, async () => {\n const result = await adapter.buildWithdrawTx(this._address, withdrawAmount, params.asset);\n effectiveAmount = result.effectiveAmount;\n return result.tx;\n });\n\n try {\n this.portfolio.recordUnearn(params.asset);\n } catch {\n // Portfolio may not have the position tracked — safe to ignore\n }\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._signer, 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._signer, 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._signer, 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._signer, 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 const totalFunds = bal.available + bal.savings;\n if (params.usdAmount > totalFunds * 1.05) {\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. You have $${totalFunds.toFixed(2)} total (checking: $${bal.available.toFixed(2)}, savings: $${bal.savings.toFixed(2)}) but need $${params.usdAmount.toFixed(2)}.`,\n );\n }\n\n if (bal.available < params.usdAmount && !params.dryRun) {\n await this._autoFundFromSavings(params.usdAmount - bal.available);\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._signer, 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 // Always attempt unearn — investUnearn checks on-chain state as fallback\n // when local portfolio is stale.\n const unearnFailures: Array<{ asset: string; error: string }> = [];\n for (const pos of stratPositions) {\n try {\n await this.investUnearn({ asset: pos.asset as InvestmentAsset });\n await new Promise(r => setTimeout(r, 1500));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // \"not currently earning\" is expected for assets already in wallet — not a failure\n if (!msg.includes('not currently earning')) {\n unearnFailures.push({ asset: pos.asset, error: msg });\n }\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._signer, 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 let pnl = 0;\n try {\n 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 } catch {\n // Portfolio position already zeroed (stale state) — still a valid sell\n }\n\n try {\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 } catch {\n // Portfolio position already zeroed (stale state) — still a valid sell\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 strategy tracking. If some assets failed to unearn they're still in\n // lending and we keep the strategy so the user can retry, otherwise wipe it.\n if (this.portfolio.hasStrategyPositions(params.strategy)) {\n if (unearnFailures.length === 0) {\n this.portfolio.clearStrategy(params.strategy);\n } else {\n // Remove only the positions that were successfully sold\n for (const s of sells) {\n this.portfolio.closeStrategyPosition(params.strategy, s.asset);\n }\n }\n }\n\n const failed = unearnFailures.map(f => ({ asset: f.asset, reason: f.error }));\n\n return {\n success: true,\n strategy: params.strategy,\n totalProceeds,\n realizedPnL: totalPnL,\n sells,\n failed: failed.length > 0 ? failed : undefined,\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._signer, 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 // Direct positions already include strategy buy amounts.\n // Use direct as the source of truth for totals; subtract strategy\n // amounts from direct to show only non-strategy \"Direct\" holdings.\n const strategyAmountByAsset: Record<string, { amount: number; costBasis: number }> = {};\n for (const strats of Object.values(strategyPositions)) {\n for (const sp of strats) {\n const prev = strategyAmountByAsset[sp.asset] ?? { amount: 0, costBasis: 0 };\n strategyAmountByAsset[sp.asset] = {\n amount: prev.amount + sp.totalAmount,\n costBasis: prev.costBasis + sp.costBasis,\n };\n }\n }\n\n const directOnly = enriched\n .map(pos => {\n const strat = strategyAmountByAsset[pos.asset];\n if (!strat) return pos;\n const directAmt = pos.totalAmount - strat.amount;\n if (directAmt <= 0.000001) return null;\n const directCost = pos.costBasis - strat.costBasis;\n const currentValue = directAmt * (pos.currentPrice ?? 0);\n return {\n ...pos,\n totalAmount: directAmt,\n costBasis: directCost,\n currentValue,\n unrealizedPnL: currentValue - directCost,\n unrealizedPnLPct: directCost > 0 ? ((currentValue - directCost) / directCost) * 100 : 0,\n };\n })\n .filter((p): p is InvestmentPosition => p !== null);\n\n // Totals from direct (source of truth — includes strategy amounts)\n const totalInvested = enriched.reduce((sum, p) => sum + p.costBasis, 0);\n const totalValue = enriched.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: directOnly,\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._signer, 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._signer, 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._signer, 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._signer, 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._address);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this._address);\n }\n\n // -- 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._signer, 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 // Direct positions are the source of truth (include strategy amounts).\n const pos = this.portfolio.getPosition(asset);\n const walletInvested = (pos && pos.totalAmount > 0 && !pos.earning) ? pos.totalAmount : 0;\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"]}
|