@t2000/sdk 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/utils/format.ts","../src/wallet/send.ts","../src/wallet/balance.ts","../src/wallet/history.ts","../src/protocols/navi.ts","../src/protocols/cetus.ts","../src/protocols/protocolFee.ts","../src/protocols/yieldTracker.ts","../src/utils/hashcash.ts","../src/gas/gasStation.ts","../src/gas/autoTopUp.ts","../src/gas/manager.ts","../src/t2000.ts","../src/utils/simulate.ts"],"names":["Transaction","naviGetHealthFactor","keypair","hf"],"mappings":"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","file":"index.js","sourcesContent":["export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const SWAP_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0x51c44bb2ad3ba608cf9adbc6e37ee67268ef9313a4ff70957d4c6e7955dc7eef';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0xd30408960ac38eced670acc102df9e178b5b46b3a8c0e96a53ec2fd3f39b5936';\nexport const T2000_ADMIN_CAP_ID = '0x8f8a1147f9e52738485817ee499736d878546f079fc99d5560cdd570fec7d13e';\nexport const T2000_UPGRADE_CAP_ID = '0x9627206ae0265afaae354864116b1cd152cb872ca28dfb4cd8d50ad46f69d7fa';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x2398c2759cfce40f1b0f2b3e524eeba9e8f6428fcb1d1e39235dd042d48defc8';\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","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'SLIPPAGE_EXCEEDED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'FACILITATOR_TIMEOUT'\n | '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 };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n","import { SuiClient, getFullnodeUrl } from '@mysten/sui/client';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiClient({ url });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiClient {\n return new SuiClient({ url: getFullnodeUrl(network) });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'node:crypto';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from '../errors.js';\nimport { DEFAULT_KEY_PATH } from '../constants.js';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst SCRYPT_N = 2 ** 14; // 16384 — secure and fast enough\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SALT_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst TAG_LENGTH = 16;\n\ninterface EncryptedKey {\n version: 1;\n algorithm: typeof ALGORITHM;\n salt: string;\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, 32, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P });\n}\n\nfunction encrypt(data: Buffer, passphrase: string): EncryptedKey {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 1,\n algorithm: ALGORITHM,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: tag.toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n };\n}\n\nfunction decrypt(encrypted: EncryptedKey, passphrase: string): Buffer {\n const salt = Buffer.from(encrypted.salt, 'hex');\n const key = deriveKey(passphrase, salt);\n const iv = Buffer.from(encrypted.iv, 'hex');\n const tag = Buffer.from(encrypted.tag, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n try {\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n } catch {\n throw new T2000Error('WALLET_LOCKED', 'Invalid PIN');\n }\n}\n\nexport function generateKeypair(): Ed25519Keypair {\n return Ed25519Keypair.generate();\n}\n\nexport function keypairFromPrivateKey(privateKey: string): Ed25519Keypair {\n if (privateKey.startsWith('suiprivkey')) {\n const decoded = decodeSuiPrivateKey(privateKey);\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n }\n const bytes = Buffer.from(privateKey.replace(/^0x/, ''), 'hex');\n return Ed25519Keypair.fromSecretKey(bytes);\n}\n\nexport async function saveKey(\n keypair: Ed25519Keypair,\n passphrase: string,\n keyPath?: string,\n): Promise<string> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n try {\n await access(filePath);\n throw new T2000Error('WALLET_EXISTS', `Wallet already exists at ${filePath}`);\n } catch (error) {\n if (error instanceof T2000Error) throw error;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const bech32Key = keypair.getSecretKey();\n const encrypted = encrypt(Buffer.from(bech32Key, 'utf-8'), passphrase);\n\n await writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n\n return filePath;\n}\n\nexport async function loadKey(passphrase: string, keyPath?: string): Promise<Ed25519Keypair> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n throw new T2000Error('WALLET_NOT_FOUND', `No wallet found at ${filePath}`);\n }\n\n const encrypted: EncryptedKey = JSON.parse(content);\n const decrypted = decrypt(encrypted, passphrase);\n const bech32Key = decrypted.toString('utf-8');\n const decoded = decodeSuiPrivateKey(bech32Key);\n\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n}\n\nexport async function walletExists(keyPath?: string): Promise<boolean> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function exportPrivateKey(keypair: Ed25519Keypair): string {\n return keypair.getSecretKey();\n}\n\nexport function getAddress(keypair: Ed25519Keypair): string {\n return keypair.getPublicKey().toSuiAddress();\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport interface SendParams {\n client: SuiClient;\n keypair: Ed25519Keypair;\n to: string;\n amount: number;\n asset?: SupportedAsset;\n}\n\nexport interface SendTxResult {\n digest: string;\n gasCost: number;\n}\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\nexport async function buildAndExecuteSend({\n client,\n keypair,\n to,\n amount,\n asset = 'USDC',\n}: SendParams): Promise<SendTxResult> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n if (amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n }\n\n const senderAddress = keypair.getPublicKey().toSuiAddress();\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n\n const tx = new Transaction();\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({\n owner: senderAddress,\n coinType: assetInfo.type,\n });\n\n if (coins.data.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n }\n\n const totalBalance = coins.data.reduce(\n (sum, c) => sum + BigInt(c.balance),\n 0n,\n );\n\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals,\n required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n\n if (coins.data.length > 1) {\n tx.mergeCoins(\n primaryCoin,\n coins.data.slice(1).map((c) => tx.object(c.coinObjectId)),\n );\n }\n\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const gasUsed = result.effects?.gasUsed;\n const gasCost = gasUsed\n ? Math.abs(\n (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n )\n : 0;\n\n return {\n digest: result.digest,\n gasCost,\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { BalanceResponse } from '../types.js';\n\nlet _cachedSuiPrice = 3.5;\nlet _priceLastFetched = 0;\nconst PRICE_CACHE_TTL_MS = 60_000;\n\nasync function fetchSuiPrice(client: SuiClient): Promise<number> {\n const now = Date.now();\n if (now - _priceLastFetched < PRICE_CACHE_TTL_MS) return _cachedSuiPrice;\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 // Adjust for decimal difference: USDC(6) vs SUI(9) → multiply by 1e3\n const price = rawPrice * 1e3;\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;\n}\n\nexport async function queryBalance(\n client: SuiClient,\n address: string,\n): Promise<BalanceResponse> {\n const [usdcBalance, suiBalance, suiPriceUsd] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ]);\n\n const usdcAmount = Number(usdcBalance.totalBalance) / 10 ** SUPPORTED_ASSETS.USDC.decimals;\n const suiAmount = Number(suiBalance.totalBalance) / Number(MIST_PER_SUI);\n\n const savings = 0; // Merged from NAVI in T2000.balance()\n const usdEquiv = suiAmount * suiPriceUsd;\n const total = usdcAmount + savings + usdEquiv;\n\n return {\n available: usdcAmount,\n savings,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n assets: {\n USDC: usdcAmount,\n SUI: suiAmount,\n },\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { TransactionRecord } from '../types.js';\n\nexport async function queryHistory(\n client: SuiClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n return {\n digest: tx.digest,\n action: inferAction(tx.transaction),\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n });\n}\n\nfunction inferAction(txBlock: unknown): string {\n if (!txBlock || typeof txBlock !== 'object') return 'unknown';\n const data = 'data' in txBlock ? (txBlock as { data?: unknown }).data : undefined;\n if (!data || typeof data !== 'object') return 'unknown';\n const inner = 'transaction' in data ? (data as { transaction?: unknown }).transaction : undefined;\n if (!inner || typeof inner !== 'object') return 'unknown';\n\n const kind = 'kind' in inner ? (inner as { kind: string }).kind : undefined;\n if (kind === 'ProgrammableTransaction') return 'transaction';\n return kind ?? 'unknown';\n}\n","import {\n getPool,\n getLendingState,\n getHealthFactor as naviGetHealthFactor,\n getCoins,\n mergeCoinsPTB,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getPriceFeeds,\n filterPriceFeeds,\n updateOraclePricesPTB,\n} from '@naviprotocol/lending';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SUPPORTED_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { usdcToRaw } from '../utils/format.js';\nimport type {\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n GasMethod,\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst ENV = { env: 'prod' as const };\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst RATE_DECIMALS = 27;\nconst LTV_DECIMALS = 27;\nconst MIN_HEALTH_FACTOR = 1.5;\nconst WITHDRAW_DUST_BUFFER = 0.001;\n\n// NAVI normalizes all internal balances (supplyBalance, borrowBalance) to 9 decimal\n// places regardless of the token's native decimals. USDC is 6 on-chain, but NAVI\n// reports it with 3 extra decimals of precision. Verified empirically: depositing\n// 2_000_000 raw USDC (6-dec = $2) results in supplyBalance ≈ 2_000_000_000 (9-dec).\n// PTB functions (deposit/withdraw/borrow/repay) still use native 6-dec amounts.\nconst NAVI_BALANCE_DECIMALS = 9;\n\nfunction clientOpt(client: SuiClient, fresh = false) {\n return { client, ...ENV, ...(fresh ? { disableCache: true } : {}) };\n}\n\nfunction extractGasCost(effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null): number {\n if (!effects?.gasUsed) return 0;\n return Math.abs(\n (Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)) /\n 1e9\n );\n}\n\nfunction rateToApy(rawRate: string): number {\n if (!rawRate || rawRate === '0') return 0;\n return Number(BigInt(rawRate)) / 10 ** RATE_DECIMALS * 100;\n}\n\nfunction parseLtv(rawLtv: string): number {\n if (!rawLtv || rawLtv === '0') return 0.75;\n return Number(BigInt(rawLtv)) / 10 ** LTV_DECIMALS;\n}\n\nfunction parseLiqThreshold(val: string | number): number {\n if (typeof val === 'number') return val;\n // NAVI returns thresholds as 27-decimal BigInt strings (e.g. \"850000000000000000000000000\"\n // for 0.85). If parseFloat yields > 1, it's a raw BigInt string needing conversion.\n const n = Number(val);\n if (n > 1) return Number(BigInt(val)) / 10 ** LTV_DECIMALS;\n return n;\n}\n\nfunction findUsdcPosition<T extends { pool: { token: { symbol: string }; coinType: string } }>(\n state: T[],\n): T | undefined {\n return state.find(\n (p) => p.pool.token.symbol === 'USDC' || p.pool.coinType.toLowerCase().includes('usdc'),\n );\n}\n\nasync function updateOracle(tx: Transaction, client: SuiClient, address: string): Promise<void> {\n try {\n const [feeds, state] = await Promise.all([\n getPriceFeeds(ENV),\n getLendingState(address, clientOpt(client)),\n ]);\n const relevant = filterPriceFeeds(feeds, { lendingState: state });\n if (relevant.length > 0) {\n await updateOraclePricesPTB(tx, relevant, { ...ENV, updatePythPriceFeeds: true });\n }\n } catch {\n // Oracle update failure is non-fatal — transaction may still succeed\n }\n}\n\nexport async function buildSaveTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n\n const coins = await getCoins(address, { coinType: USDC_TYPE, client });\n if (!coins || coins.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoinsPTB(tx, coins, { balance: rawAmount });\n await depositCoinPTB(tx, USDC_TYPE, coinObj, ENV);\n\n return tx;\n}\n\nexport async function save(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<SaveResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildSaveTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const rates = await getRates(client);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n apy: rates.USDC.saveApy,\n fee: 0,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildWithdrawTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const state = await getLendingState(address, clientOpt(client, true));\n const usdcPos = findUsdcPosition(state);\n const deposited = usdcPos ? Number(usdcPos.supplyBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - WITHDRAW_DUST_BUFFER));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', 'Nothing to withdraw');\n\n const rawAmount = Number(usdcToRaw(effectiveAmount));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await updateOracle(tx, client, address);\n\n const withdrawnCoin = await withdrawCoinPTB(tx, USDC_TYPE, rawAmount, ENV);\n tx.transferObjects([withdrawnCoin], address);\n\n return { tx, effectiveAmount };\n}\n\nexport async function withdraw(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<WithdrawResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const { tx, effectiveAmount } = await buildWithdrawTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n success: true,\n tx: result.digest,\n amount: effectiveAmount,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildBorrowTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await updateOracle(tx, client, address);\n\n const borrowedCoin = await borrowCoinPTB(tx, USDC_TYPE, rawAmount, ENV);\n tx.transferObjects([borrowedCoin], address);\n\n return tx;\n}\n\nexport async function borrow(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<BorrowResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildBorrowTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const hf = await naviGetHealthFactor(address, clientOpt(client, true));\n\n return {\n success: true,\n tx: result.digest,\n amount,\n fee: 0,\n healthFactor: hf,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildRepayTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n\n const coins = await getCoins(address, { coinType: USDC_TYPE, client });\n if (!coins || coins.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins to repay with');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoinsPTB(tx, coins, { balance: rawAmount });\n await repayCoinPTB(tx, USDC_TYPE, coinObj, { ...ENV, amount: rawAmount });\n\n return tx;\n}\n\nexport async function repay(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<RepayResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildRepayTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const state = await getLendingState(address, clientOpt(client, true));\n const usdcPos = findUsdcPosition(state);\n const remainingDebt = usdcPos ? Number(usdcPos.borrowBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n\n return {\n success: true,\n tx: result.digest,\n amount,\n remainingDebt,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function getHealthFactor(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<HealthFactorResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const [healthFactor, state, pool] = await Promise.all([\n naviGetHealthFactor(address, clientOpt(client, true)),\n getLendingState(address, clientOpt(client, true)),\n getPool(USDC_TYPE, ENV),\n ]);\n\n const usdcPos = findUsdcPosition(state);\n\n const supplied = usdcPos ? Number(usdcPos.supplyBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n const borrowed = usdcPos ? Number(usdcPos.borrowBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n\n const ltv = parseLtv(pool.ltv);\n const liqThreshold = parseLiqThreshold(pool.liquidationFactor.threshold);\n const maxBorrowVal = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor: borrowed > 0 ? healthFactor : Infinity,\n supplied,\n borrowed,\n maxBorrow: maxBorrowVal,\n liquidationThreshold: liqThreshold,\n };\n}\n\nexport async function getRates(client: SuiClient): Promise<RatesResult> {\n try {\n const pool = await getPool(USDC_TYPE, ENV);\n\n let saveApy = rateToApy(pool.currentSupplyRate);\n let borrowApy = rateToApy(pool.currentBorrowRate);\n\n if (saveApy <= 0 || saveApy > 100) saveApy = 4.0;\n if (borrowApy <= 0 || borrowApy > 100) borrowApy = 6.0;\n\n return { USDC: { saveApy, borrowApy } };\n } catch {\n return { USDC: { saveApy: 4.0, borrowApy: 6.0 } };\n }\n}\n\nexport async function getPositions(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<PositionsResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const state = await getLendingState(address, clientOpt(client, true));\n const positions: PositionEntry[] = [];\n\n for (const pos of state) {\n const symbol = pos.pool.token?.symbol ?? 'UNKNOWN';\n const supplyBal = Number(pos.supplyBalance) / 10 ** NAVI_BALANCE_DECIMALS;\n const borrowBal = Number(pos.borrowBalance) / 10 ** NAVI_BALANCE_DECIMALS;\n\n if (supplyBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'save',\n amount: supplyBal,\n apy: rateToApy(pos.pool.currentSupplyRate),\n });\n }\n\n if (borrowBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'borrow',\n amount: borrowBal,\n apy: rateToApy(pos.pool.currentBorrowRate),\n });\n }\n }\n\n return { positions };\n}\n\nexport async function maxWithdrawAmount(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, keypair);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? remainingSupply / hf.borrowed : Infinity;\n\n return {\n maxAmount,\n healthFactorAfter: hfAfter,\n currentHF: hf.healthFactor,\n };\n}\n\nexport async function maxBorrowAmount(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, keypair);\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 {\n maxAmount,\n healthFactorAfter: MIN_HEALTH_FACTOR,\n currentHF: hf.healthFactor,\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { CetusClmmSDK } from '@cetusprotocol/sui-clmm-sdk';\nimport { SUPPORTED_ASSETS, CLOCK_ID, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { GasMethod } from '../types.js';\n\nconst DEFAULT_SLIPPAGE_BPS = 300; // 3%\n\nexport interface SwapParams {\n client: SuiClient;\n keypair: Ed25519Keypair;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}\n\nexport interface SwapTxResult {\n digest: string;\n fromAmount: number;\n fromAsset: string;\n toAmount: number;\n toAsset: string;\n priceImpact: number;\n gasCost: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\n/**\n * In the Cetus USDC/SUI pool, the type ordering is:\n * - coin_a = USDC (smaller type string)\n * - coin_b = SUI\n * So USDC → SUI = a2b, SUI → USDC = b2a\n */\nfunction isA2B(from: string): boolean {\n return from === 'USDC';\n}\n\nlet _cetusSDK: CetusClmmSDK | null = null;\n\nfunction getCetusSDK(): CetusClmmSDK {\n if (!_cetusSDK) {\n _cetusSDK = CetusClmmSDK.createSDK({ env: 'mainnet' });\n }\n return _cetusSDK;\n}\n\nimport type { Transaction } from '@mysten/sui/transactions';\n\nexport interface SwapBuildResult {\n tx: Transaction;\n estimatedOut: number;\n toDecimals: number;\n}\n\nexport async function buildSwapTx(params: {\n client: SuiClient;\n address: string;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const a2b = isA2B(fromAsset);\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const sdk = getCetusSDK();\n sdk.setSenderAddress(address);\n\n const pool = await sdk.Pool.getPool(CETUS_USDC_SUI_POOL);\n\n const preSwapResult = await sdk.Swap.preSwap({\n pool,\n current_sqrt_price: pool.current_sqrt_price,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n decimals_a: 6,\n decimals_b: 9,\n a2b,\n by_amount_in: true,\n amount: rawAmount.toString(),\n });\n\n const estimatedOut = Number(preSwapResult.estimated_amount_out);\n const slippageFactor = (10000 - maxSlippageBps) / 10000;\n const amountLimit = Math.floor(estimatedOut * slippageFactor);\n\n const swapPayload = await sdk.Swap.createSwapPayload({\n pool_id: pool.id,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n a2b,\n by_amount_in: true,\n amount: preSwapResult.amount.toString(),\n amount_limit: amountLimit.toString(),\n });\n\n return {\n tx: swapPayload as unknown as Transaction,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\nexport async function executeSwap(params: SwapParams): Promise<SwapTxResult> {\n const { client, keypair, fromAsset, toAsset, amount, maxSlippageBps } = params;\n const address = keypair.getPublicKey().toSuiAddress();\n const toInfo = SUPPORTED_ASSETS[toAsset];\n\n const { tx, estimatedOut, toDecimals } = await buildSwapTx({\n client,\n address,\n fromAsset,\n toAsset,\n amount,\n maxSlippageBps,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let actualReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = estimatedOut / 10 ** toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n return {\n digest: result.digest,\n fromAmount: amount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n gasCost: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nexport async function getPoolPrice(client: SuiClient): 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 // rawPrice = SUI_smallest / USDC_smallest (token1 per token0 in raw units)\n // Human conversion: 1 USDC = rawPrice * 10^(6-9) SUI\n // SUI price in USD = 1 / (rawPrice * 10^(6-9)) = 10^3 / rawPrice\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: SuiClient,\n fromAsset: 'USDC' | 'SUI',\n toAsset: 'USDC' | 'SUI',\n amount: number,\n): Promise<{ expectedOutput: number; priceImpact: number; poolPrice: number }> {\n const a2b = isA2B(fromAsset);\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const poolPrice = await getPoolPrice(client);\n\n try {\n const sdk = getCetusSDK();\n const pool = await sdk.Pool.getPool(CETUS_USDC_SUI_POOL);\n\n const preSwapResult = await sdk.Swap.preSwap({\n pool,\n current_sqrt_price: pool.current_sqrt_price,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n decimals_a: 6,\n decimals_b: 9,\n a2b,\n by_amount_in: true,\n amount: rawAmount.toString(),\n });\n\n const expectedOutput = Number(preSwapResult.estimated_amount_out) / 10 ** toInfo.decimals;\n\n return { expectedOutput, priceImpact: 0, poolPrice };\n } catch {\n let expectedOutput: number;\n if (fromAsset === 'USDC') {\n expectedOutput = amount / poolPrice;\n } else {\n expectedOutput = amount * poolPrice;\n }\n return { expectedOutput, priceImpact: 0, poolPrice };\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport type { SuiClient } from '@mysten/sui/client';\nimport {\n SAVE_FEE_BPS,\n SWAP_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_TREASURY_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; // as percentage, e.g. 0.1\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\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 protocol fee collection to an existing PTB.\n * Splits the fee from the agent's USDC coins and sends to the treasury.\n * Returns the fee coin for inclusion in the atomic transaction.\n */\nexport async function addFeeToTransaction(\n tx: Transaction,\n client: SuiClient,\n senderAddress: string,\n operation: FeeOperation,\n amount: number,\n): Promise<ProtocolFeeInfo> {\n const fee = calculateFee(operation, amount);\n\n if (fee.rawAmount <= 0n) return fee;\n\n const coins = await client.getCoins({\n owner: senderAddress,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n\n if (coins.data.length === 0) return fee;\n\n const primary = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primary, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n const [feeCoin] = tx.splitCoins(primary, [fee.rawAmount]);\n\n // Transfer fee directly to treasury\n tx.transferObjects([feeCoin], T2000_TREASURY_ID);\n\n return fee;\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 { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, keypair);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy / 100;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n // Estimate total yield earned based on position age\n // For MVP, use a simple approximation\n const totalYieldEarned = dailyEarning * 30; // rough monthly estimate\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, keypair);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\n","import { createHash } from 'node:crypto';\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n\n return true;\n}\n\nexport function solveHashcash(challenge: string): string {\n const bits = parseInt(challenge.split(':')[1], 10);\n let counter = 0;\n while (true) {\n const stamp = `${challenge}${counter.toString(16)}`;\n const hash = createHash('sha256').update(stamp).digest();\n if (hasLeadingZeroBits(hash, bits)) return stamp;\n counter++;\n }\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\nexport async function requestGasSponsorship(\n txBytesBase64: string,\n sender: string,\n type?: GasRequestType,\n): Promise<GasSponsorResponse> {\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ txBytes: txBytesBase64, sender, type }),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n undefined,\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n AUTO_TOPUP_AMOUNT,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n CLOCK_ID,\n CETUS_USDC_SUI_POOL,\n CETUS_GLOBAL_CONFIG,\n CETUS_PACKAGE,\n} from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\n\n// Max slippage: 3% enforced on-chain via sqrt_price_limit\nconst MAX_SLIPPAGE_BPS = 300;\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n return suiRaw < AUTO_TOPUP_THRESHOLD && usdcRaw >= AUTO_TOPUP_MIN_USDC;\n}\n\nexport async function executeAutoTopUp(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<AutoTopUpResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n // Build the USDC → SUI swap transaction\n const tx = new Transaction();\n tx.setSender(address);\n\n const usdcCoins = await client.getCoins({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n\n if (usdcCoins.data.length === 0) {\n throw new T2000Error('AUTO_TOPUP_FAILED', 'No USDC coins available for auto-topup');\n }\n\n // Merge USDC coins if needed, then split the topup amount\n const coinIds = usdcCoins.data.map((c) => c.coinObjectId);\n let usdcCoin;\n if (coinIds.length === 1) {\n usdcCoin = tx.splitCoins(tx.object(coinIds[0]), [AUTO_TOPUP_AMOUNT]);\n } else {\n const primary = tx.object(coinIds[0]);\n if (coinIds.length > 1) {\n tx.mergeCoins(primary, coinIds.slice(1).map((id) => tx.object(id)));\n }\n usdcCoin = tx.splitCoins(primary, [AUTO_TOPUP_AMOUNT]);\n }\n\n // Cetus swap: USDC → SUI (a2b = true since USDC < SUI in type ordering)\n // sqrt_price_limit for a2b swap = MIN_SQRT_PRICE (going down)\n // This is the Cetus minimum sqrt_price for a2b swaps\n const MIN_SQRT_PRICE = '4295048016';\n\n const [receivedCoin, returnedCoin] = tx.moveCall({\n target: `${CETUS_PACKAGE}::pool_script::swap_a2b`,\n arguments: [\n tx.object(CETUS_GLOBAL_CONFIG),\n tx.object(CETUS_USDC_SUI_POOL),\n usdcCoin,\n tx.pure.bool(true), // by_amount_in\n tx.pure.u64(AUTO_TOPUP_AMOUNT),\n tx.pure.u128(MIN_SQRT_PRICE),\n tx.object(CLOCK_ID),\n ],\n typeArguments: [SUPPORTED_ASSETS.USDC.type, SUPPORTED_ASSETS.SUI.type],\n });\n\n // Transfer received SUI and return any remaining USDC\n tx.transferObjects([receivedCoin], address);\n tx.transferObjects([returnedCoin], address);\n\n // Serialize for gas station sponsorship (auto-topup gas is always sponsored)\n const txBytes = await tx.build({ client, onlyTransactionKind: true });\n const txBytesBase64 = Buffer.from(txBytes).toString('base64');\n\n let sponsoredResult;\n try {\n sponsoredResult = await requestGasSponsorship(txBytesBase64, address, 'auto-topup');\n } catch {\n throw new T2000Error('AUTO_TOPUP_FAILED', 'Gas station unavailable for auto-topup sponsorship');\n }\n\n // Sign with agent key and submit\n const sponsoredTxBytes = Buffer.from(sponsoredResult.txBytes, 'base64');\n const { signature: agentSig } = await keypair.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n // Calculate SUI received from balance changes\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 // Best-effort: report gas usage\n reportGasUsage(address, result.digest, 0, 0, 'auto-topup');\n\n return {\n success: true,\n tx: result.digest,\n usdcSpent: Number(AUTO_TOPUP_AMOUNT) / 1e6,\n suiReceived: Math.abs(suiReceived),\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n gasMethod: GasMethod;\n gasCostSui: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nasync function getSuiBalance(client: SuiClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function trySelfFunded(\n client: SuiClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n // Need at least 0.05 SUI for gas\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n try {\n await executeAutoTopUp(client, keypair);\n } catch {\n return null;\n }\n\n // After top-up, try self-funded again\n tx.setSender(address);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function trySponsored(\n client: SuiClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n tx.setSender(address);\n\n let txBytes: Uint8Array;\n try {\n txBytes = await tx.build({ client, onlyTransactionKind: true });\n } catch {\n return null;\n }\n\n const txBytesBase64 = Buffer.from(txBytes).toString('base64');\n\n let sponsoredResult;\n try {\n sponsoredResult = await requestGasSponsorship(txBytesBase64, address);\n } catch {\n return null;\n }\n\n const sponsoredTxBytes = Buffer.from(sponsoredResult.txBytes, 'base64');\n const { signature: agentSig } = await keypair.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n // Report gas usage (best-effort)\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n };\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n */\nexport async function executeWithGas(\n client: SuiClient,\n keypair: Ed25519Keypair,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, keypair, tx);\n if (result) return result;\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n errors.push(`self-funded: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2: Try auto-topup then self-fund\n try {\n const tx = await buildTx();\n const result = await tryAutoTopUpThenSelfFund(client, keypair, tx);\n if (result) return result;\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, keypair, tx);\n if (result) return result;\n errors.push('sponsored: returned null');\n } catch (err) {\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and Gas Station unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","import { EventEmitter } from 'eventemitter3';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { getSuiClient } from './utils/sui.js';\nimport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory } from './wallet/history.js';\nimport * as navi from './protocols/navi.js';\nimport * as cetus from './protocols/cetus.js';\nimport { calculateFee, reportFee } from './protocols/protocolFee.js';\nimport * as yieldTracker from './protocols/yieldTracker.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} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, DEFAULT_NETWORK, API_BASE_URL } from './constants.js';\nimport { truncateAddress } from './utils/sui.js';\n\ninterface T2000Events {\n balanceChange: (event: { asset: string; previous: number; current: number; cause: string; tx?: string }) => void;\n healthWarning: (event: { healthFactor: number; threshold: number; severity: 'warning' }) => void;\n healthCritical: (event: { healthFactor: number; threshold: number; severity: 'critical' }) => void;\n yield: (event: { earned: number; total: number; apy: number; timestamp: number }) => void;\n gasAutoTopUp: (result: { usdcSpent: number; suiReceived: number }) => void;\n gasStationFallback: (event: { reason: string; method: string; suiUsed: number }) => void;\n error: (error: T2000Error) => void;\n}\n\nexport class T2000 extends EventEmitter<T2000Events> {\n private readonly keypair: Ed25519Keypair;\n private readonly client: SuiClient;\n private readonly _address: string;\n\n\n private constructor(keypair: Ed25519Keypair, client: SuiClient) {\n super();\n this.keypair = keypair;\n this.client = client;\n this._address = getAddress(keypair);\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);\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);\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);\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 /** SuiClient used by this agent — exposed for x402 and other integrations. */\n get suiClient(): SuiClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for x402 and other integrations. */\n get signer(): Ed25519Keypair {\n return this.keypair;\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n 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 sendAmount = params.amount;\n const sendTo = params.to;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n );\n\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: params.to,\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 try {\n const positions = await this.positions();\n const savings = positions.positions\n .filter((p) => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n bal.savings = savings;\n bal.total = bal.available + savings + bal.gasReserve.usdEquiv;\n } catch {\n // NAVI unavailable — show basic balance\n }\n\n return bal;\n }\n\n async history(params?: { limit?: number }): Promise<TransactionRecord[]> {\n return queryHistory(this.client, this._address, params?.limit);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'Sui (mainnet)',\n supportedAssets: ['USDC'],\n instructions: [\n `Send USDC on Sui to: ${this._address}`,\n '',\n 'From a CEX (Coinbase, Binance):',\n ` 1. Withdraw USDC`,\n ` 2. Select \"Sui\" network`,\n ` 3. Paste address: ${truncateAddress(this._address)}`,\n '',\n 'From another Sui wallet:',\n ` Transfer USDC to ${truncateAddress(this._address)}`,\n ].join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; asset?: string }): Promise<SaveResult> {\n let amount: number;\n if (params.amount === 'all') {\n const bal = await queryBalance(this.client, this._address);\n const GAS_RESERVE_USDC = 1.0;\n amount = bal.available - GAS_RESERVE_USDC;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'Balance too low to save after $1 gas reserve', {\n reason: 'gas_reserve_required',\n available: bal.available,\n });\n }\n } else {\n amount = params.amount;\n }\n const fee = calculateFee('save', amount);\n const saveAmount = amount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n navi.buildSaveTx(this.client, this._address, saveAmount),\n );\n\n const rates = await navi.getRates(this.client);\n reportFee(this._address, 'save', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange('USDC', saveAmount, 'save', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.USDC.saveApy,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; asset?: string }): Promise<WithdrawResult> {\n let amount: number;\n if (params.amount === 'all') {\n const maxResult = await this.maxWithdraw();\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 // Risk check: would this withdrawal drop HF below minimum?\n const hf = await this.healthFactor();\n if (hf.borrowed > 0) {\n const maxResult = await this.maxWithdraw();\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 const withdrawAmount = amount;\n let effectiveAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await navi.buildWithdrawTx(this.client, this._address, withdrawAmount);\n effectiveAmount = built.effectiveAmount;\n return built.tx;\n });\n\n this.emitBalanceChange('USDC', effectiveAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: effectiveAmount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async maxWithdraw(): Promise<MaxWithdrawResult> {\n return navi.maxWithdrawAmount(this.client, this.keypair);\n }\n\n // -- Borrowing --\n\n async borrow(params: { amount: number; asset?: string }): Promise<BorrowResult> {\n const maxResult = await this.maxBorrow();\n if (params.amount > maxResult.maxAmount) {\n throw new T2000Error('HEALTH_FACTOR_TOO_LOW', `Max safe borrow: $${maxResult.maxAmount.toFixed(2)}`, {\n maxBorrow: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n });\n }\n const fee = calculateFee('borrow', params.amount);\n\n const borrowAmount = params.amount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n navi.buildBorrowTx(this.client, this._address, borrowAmount),\n );\n\n const hf = await navi.getHealthFactor(this.client, this.keypair);\n reportFee(this._address, 'borrow', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange('USDC', 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'; asset?: string }): Promise<RepayResult> {\n let amount: number;\n if (params.amount === 'all') {\n const hf = await this.healthFactor();\n amount = hf.borrowed;\n if (amount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No outstanding borrow to repay');\n }\n } else {\n amount = params.amount;\n }\n const repayAmount = amount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n navi.buildRepayTx(this.client, this._address, repayAmount),\n );\n\n const hf = await navi.getHealthFactor(this.client, this.keypair);\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 async maxBorrow(): Promise<MaxBorrowResult> {\n return navi.maxBorrowAmount(this.client, this.keypair);\n }\n\n async healthFactor(): Promise<HealthFactorResult> {\n const hf = await navi.getHealthFactor(this.client, this.keypair);\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 --\n\n async swap(params: { from: string; to: string; amount: number; maxSlippage?: number }): Promise<SwapResult> {\n const fromAsset = params.from.toUpperCase() as 'USDC' | 'SUI';\n const toAsset = params.to.toUpperCase() as 'USDC' | 'SUI';\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 fee = calculateFee('swap', params.amount);\n const swapAmount = params.amount;\n const slippageBps = params.maxSlippage ? params.maxSlippage * 100 : undefined;\n\n let swapMeta: { estimatedOut: number; toDecimals: number } = { estimatedOut: 0, toDecimals: 0 };\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await cetus.buildSwapTx({\n client: this.client,\n address: this._address,\n fromAsset,\n toAsset,\n amount: swapAmount,\n maxSlippageBps: slippageBps,\n });\n swapMeta = { estimatedOut: built.estimatedOut, toDecimals: built.toDecimals };\n return built.tx;\n });\n\n const toInfo = SUPPORTED_ASSETS[toAsset];\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.toUpperCase() as 'USDC' | 'SUI';\n const toAsset = params.to.toUpperCase() as 'USDC' | 'SUI';\n const quote = await cetus.getSwapQuote(this.client, fromAsset, toAsset, params.amount);\n const fee = calculateFee('swap', params.amount);\n return { ...quote, fee: { amount: fee.amount, rate: fee.rate } };\n }\n\n // -- Info --\n\n async positions(): Promise<PositionsResult> {\n return navi.getPositions(this.client, this.keypair);\n }\n\n async rates(): Promise<RatesResult> {\n return navi.getRates(this.client);\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this.keypair);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this.keypair);\n }\n\n // -- Helpers --\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 { SuiClient } from '@mysten/sui/client';\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: SuiClient,\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/utils/sui.ts","../src/wallet/keyManager.ts","../src/utils/format.ts","../src/wallet/send.ts","../src/wallet/balance.ts","../src/wallet/history.ts","../src/protocols/navi.ts","../src/protocols/cetus.ts","../src/protocols/protocolFee.ts","../src/protocols/yieldTracker.ts","../src/utils/hashcash.ts","../src/gas/gasStation.ts","../src/gas/autoTopUp.ts","../src/gas/manager.ts","../src/t2000.ts","../src/utils/simulate.ts"],"names":["Transaction","naviGetHealthFactor","keypair","hf"],"mappings":"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","file":"index.js","sourcesContent":["export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const SWAP_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0x51c44bb2ad3ba608cf9adbc6e37ee67268ef9313a4ff70957d4c6e7955dc7eef';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0xd30408960ac38eced670acc102df9e178b5b46b3a8c0e96a53ec2fd3f39b5936';\nexport const T2000_ADMIN_CAP_ID = '0x8f8a1147f9e52738485817ee499736d878546f079fc99d5560cdd570fec7d13e';\nexport const T2000_UPGRADE_CAP_ID = '0x9627206ae0265afaae354864116b1cd152cb872ca28dfb4cd8d50ad46f69d7fa';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x2398c2759cfce40f1b0f2b3e524eeba9e8f6428fcb1d1e39235dd042d48defc8';\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","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'SLIPPAGE_EXCEEDED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'FACILITATOR_TIMEOUT'\n | '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 };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n","import { SuiClient, getFullnodeUrl } from '@mysten/sui/client';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiClient({ url });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiClient {\n return new SuiClient({ url: getFullnodeUrl(network) });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'node:crypto';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from '../errors.js';\nimport { DEFAULT_KEY_PATH } from '../constants.js';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst SCRYPT_N = 2 ** 14; // 16384 — secure and fast enough\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SALT_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst TAG_LENGTH = 16;\n\ninterface EncryptedKey {\n version: 1;\n algorithm: typeof ALGORITHM;\n salt: string;\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, 32, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P });\n}\n\nfunction encrypt(data: Buffer, passphrase: string): EncryptedKey {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 1,\n algorithm: ALGORITHM,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: tag.toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n };\n}\n\nfunction decrypt(encrypted: EncryptedKey, passphrase: string): Buffer {\n const salt = Buffer.from(encrypted.salt, 'hex');\n const key = deriveKey(passphrase, salt);\n const iv = Buffer.from(encrypted.iv, 'hex');\n const tag = Buffer.from(encrypted.tag, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n try {\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n } catch {\n throw new T2000Error('WALLET_LOCKED', 'Invalid PIN');\n }\n}\n\nexport function generateKeypair(): Ed25519Keypair {\n return Ed25519Keypair.generate();\n}\n\nexport function keypairFromPrivateKey(privateKey: string): Ed25519Keypair {\n if (privateKey.startsWith('suiprivkey')) {\n const decoded = decodeSuiPrivateKey(privateKey);\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n }\n const bytes = Buffer.from(privateKey.replace(/^0x/, ''), 'hex');\n return Ed25519Keypair.fromSecretKey(bytes);\n}\n\nexport async function saveKey(\n keypair: Ed25519Keypair,\n passphrase: string,\n keyPath?: string,\n): Promise<string> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n try {\n await access(filePath);\n throw new T2000Error('WALLET_EXISTS', `Wallet already exists at ${filePath}`);\n } catch (error) {\n if (error instanceof T2000Error) throw error;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const bech32Key = keypair.getSecretKey();\n const encrypted = encrypt(Buffer.from(bech32Key, 'utf-8'), passphrase);\n\n await writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n\n return filePath;\n}\n\nexport async function loadKey(passphrase: string, keyPath?: string): Promise<Ed25519Keypair> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n throw new T2000Error('WALLET_NOT_FOUND', `No wallet found at ${filePath}`);\n }\n\n const encrypted: EncryptedKey = JSON.parse(content);\n const decrypted = decrypt(encrypted, passphrase);\n const bech32Key = decrypted.toString('utf-8');\n const decoded = decodeSuiPrivateKey(bech32Key);\n\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n}\n\nexport async function walletExists(keyPath?: string): Promise<boolean> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function exportPrivateKey(keypair: Ed25519Keypair): string {\n return keypair.getSecretKey();\n}\n\nexport function getAddress(keypair: Ed25519Keypair): string {\n return keypair.getPublicKey().toSuiAddress();\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport interface SendParams {\n client: SuiClient;\n keypair: Ed25519Keypair;\n to: string;\n amount: number;\n asset?: SupportedAsset;\n}\n\nexport interface SendTxResult {\n digest: string;\n gasCost: number;\n}\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\nexport async function buildAndExecuteSend({\n client,\n keypair,\n to,\n amount,\n asset = 'USDC',\n}: SendParams): Promise<SendTxResult> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n if (amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n }\n\n const senderAddress = keypair.getPublicKey().toSuiAddress();\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n\n const tx = new Transaction();\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({\n owner: senderAddress,\n coinType: assetInfo.type,\n });\n\n if (coins.data.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n }\n\n const totalBalance = coins.data.reduce(\n (sum, c) => sum + BigInt(c.balance),\n 0n,\n );\n\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals,\n required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n\n if (coins.data.length > 1) {\n tx.mergeCoins(\n primaryCoin,\n coins.data.slice(1).map((c) => tx.object(c.coinObjectId)),\n );\n }\n\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n const gasUsed = result.effects?.gasUsed;\n const gasCost = gasUsed\n ? Math.abs(\n (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n )\n : 0;\n\n return {\n digest: result.digest,\n gasCost,\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { BalanceResponse } from '../types.js';\n\nlet _cachedSuiPrice = 3.5;\nlet _priceLastFetched = 0;\nconst PRICE_CACHE_TTL_MS = 60_000;\n\nasync function fetchSuiPrice(client: SuiClient): Promise<number> {\n const now = Date.now();\n if (now - _priceLastFetched < PRICE_CACHE_TTL_MS) return _cachedSuiPrice;\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 // Adjust for decimal difference: USDC(6) vs SUI(9) → multiply by 1e3\n const price = rawPrice * 1e3;\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;\n}\n\nexport async function queryBalance(\n client: SuiClient,\n address: string,\n): Promise<BalanceResponse> {\n const [usdcBalance, suiBalance, suiPriceUsd] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ]);\n\n const usdcAmount = Number(usdcBalance.totalBalance) / 10 ** SUPPORTED_ASSETS.USDC.decimals;\n const suiAmount = Number(suiBalance.totalBalance) / Number(MIST_PER_SUI);\n\n const savings = 0; // Merged from NAVI in T2000.balance()\n const usdEquiv = suiAmount * suiPriceUsd;\n const total = usdcAmount + savings + usdEquiv;\n\n return {\n available: usdcAmount,\n savings,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n assets: {\n USDC: usdcAmount,\n SUI: suiAmount,\n },\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { TransactionRecord } from '../types.js';\n\nexport async function queryHistory(\n client: SuiClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n return {\n digest: tx.digest,\n action: inferAction(tx.transaction),\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n });\n}\n\nfunction inferAction(txBlock: unknown): string {\n if (!txBlock || typeof txBlock !== 'object') return 'unknown';\n const data = 'data' in txBlock ? (txBlock as { data?: unknown }).data : undefined;\n if (!data || typeof data !== 'object') return 'unknown';\n const inner = 'transaction' in data ? (data as { transaction?: unknown }).transaction : undefined;\n if (!inner || typeof inner !== 'object') return 'unknown';\n\n const kind = 'kind' in inner ? (inner as { kind: string }).kind : undefined;\n if (kind === 'ProgrammableTransaction') return 'transaction';\n return kind ?? 'unknown';\n}\n","import {\n getPool,\n getLendingState,\n getHealthFactor as naviGetHealthFactor,\n getCoins,\n mergeCoinsPTB,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getPriceFeeds,\n filterPriceFeeds,\n updateOraclePricesPTB,\n} from '@naviprotocol/lending';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SUPPORTED_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { usdcToRaw } from '../utils/format.js';\nimport type {\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n GasMethod,\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst ENV = { env: 'prod' as const };\nconst USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\nconst RATE_DECIMALS = 27;\nconst LTV_DECIMALS = 27;\nconst MIN_HEALTH_FACTOR = 1.5;\nconst WITHDRAW_DUST_BUFFER = 0.001;\n\n// NAVI normalizes all internal balances (supplyBalance, borrowBalance) to 9 decimal\n// places regardless of the token's native decimals. USDC is 6 on-chain, but NAVI\n// reports it with 3 extra decimals of precision. Verified empirically: depositing\n// 2_000_000 raw USDC (6-dec = $2) results in supplyBalance ≈ 2_000_000_000 (9-dec).\n// PTB functions (deposit/withdraw/borrow/repay) still use native 6-dec amounts.\nconst NAVI_BALANCE_DECIMALS = 9;\n\nfunction clientOpt(client: SuiClient, fresh = false) {\n return { client, ...ENV, ...(fresh ? { disableCache: true } : {}) };\n}\n\nfunction extractGasCost(effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null): number {\n if (!effects?.gasUsed) return 0;\n return Math.abs(\n (Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)) /\n 1e9\n );\n}\n\nfunction rateToApy(rawRate: string): number {\n if (!rawRate || rawRate === '0') return 0;\n return Number(BigInt(rawRate)) / 10 ** RATE_DECIMALS * 100;\n}\n\nfunction parseLtv(rawLtv: string): number {\n if (!rawLtv || rawLtv === '0') return 0.75;\n return Number(BigInt(rawLtv)) / 10 ** LTV_DECIMALS;\n}\n\nfunction parseLiqThreshold(val: string | number): number {\n if (typeof val === 'number') return val;\n // NAVI returns thresholds as 27-decimal BigInt strings (e.g. \"850000000000000000000000000\"\n // for 0.85). If parseFloat yields > 1, it's a raw BigInt string needing conversion.\n const n = Number(val);\n if (n > 1) return Number(BigInt(val)) / 10 ** LTV_DECIMALS;\n return n;\n}\n\nfunction findUsdcPosition<T extends { pool: { token: { symbol: string }; coinType: string } }>(\n state: T[],\n): T | undefined {\n return state.find(\n (p) => p.pool.token.symbol === 'USDC' || p.pool.coinType.toLowerCase().includes('usdc'),\n );\n}\n\nasync function updateOracle(tx: Transaction, client: SuiClient, address: string): Promise<void> {\n try {\n const [feeds, state] = await Promise.all([\n getPriceFeeds(ENV),\n getLendingState(address, clientOpt(client)),\n ]);\n const relevant = filterPriceFeeds(feeds, { lendingState: state });\n if (relevant.length > 0) {\n await updateOraclePricesPTB(tx, relevant, { ...ENV, updatePythPriceFeeds: true });\n }\n } catch {\n // Oracle update failure is non-fatal — transaction may still succeed\n }\n}\n\nexport async function buildSaveTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n\n const coins = await getCoins(address, { coinType: USDC_TYPE, client });\n if (!coins || coins.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins found');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoinsPTB(tx, coins, { balance: rawAmount });\n await depositCoinPTB(tx, USDC_TYPE, coinObj, ENV);\n\n return tx;\n}\n\nexport async function save(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<SaveResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildSaveTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const rates = await getRates(client);\n\n return {\n success: true,\n tx: result.digest,\n amount,\n apy: rates.USDC.saveApy,\n fee: 0,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildWithdrawTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const state = await getLendingState(address, clientOpt(client, true));\n const usdcPos = findUsdcPosition(state);\n const deposited = usdcPos ? Number(usdcPos.supplyBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - WITHDRAW_DUST_BUFFER));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', 'Nothing to withdraw');\n\n const rawAmount = Number(usdcToRaw(effectiveAmount));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await updateOracle(tx, client, address);\n\n const withdrawnCoin = await withdrawCoinPTB(tx, USDC_TYPE, rawAmount, ENV);\n tx.transferObjects([withdrawnCoin], address);\n\n return { tx, effectiveAmount };\n}\n\nexport async function withdraw(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<WithdrawResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const { tx, effectiveAmount } = await buildWithdrawTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n success: true,\n tx: result.digest,\n amount: effectiveAmount,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildBorrowTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await updateOracle(tx, client, address);\n\n const borrowedCoin = await borrowCoinPTB(tx, USDC_TYPE, rawAmount, ENV);\n tx.transferObjects([borrowedCoin], address);\n\n return tx;\n}\n\nexport async function borrow(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<BorrowResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildBorrowTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const hf = await naviGetHealthFactor(address, clientOpt(client, true));\n\n return {\n success: true,\n tx: result.digest,\n amount,\n fee: 0,\n healthFactor: hf,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function buildRepayTx(\n client: SuiClient,\n address: string,\n amount: number,\n): Promise<Transaction> {\n const rawAmount = Number(usdcToRaw(amount));\n\n const coins = await getCoins(address, { coinType: USDC_TYPE, client });\n if (!coins || coins.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins to repay with');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoinsPTB(tx, coins, { balance: rawAmount });\n await repayCoinPTB(tx, USDC_TYPE, coinObj, { ...ENV, amount: rawAmount });\n\n return tx;\n}\n\nexport async function repay(\n client: SuiClient,\n keypair: Ed25519Keypair,\n amount: number,\n): Promise<RepayResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n const tx = await buildRepayTx(client, address, amount);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n const state = await getLendingState(address, clientOpt(client, true));\n const usdcPos = findUsdcPosition(state);\n const remainingDebt = usdcPos ? Number(usdcPos.borrowBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n\n return {\n success: true,\n tx: result.digest,\n amount,\n remainingDebt,\n gasCost: extractGasCost(result.effects),\n gasMethod: 'self-funded' as GasMethod,\n };\n}\n\nexport async function getHealthFactor(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<HealthFactorResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const [healthFactor, state, pool] = await Promise.all([\n naviGetHealthFactor(address, clientOpt(client, true)),\n getLendingState(address, clientOpt(client, true)),\n getPool(USDC_TYPE, ENV),\n ]);\n\n const usdcPos = findUsdcPosition(state);\n\n const supplied = usdcPos ? Number(usdcPos.supplyBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n const borrowed = usdcPos ? Number(usdcPos.borrowBalance) / 10 ** NAVI_BALANCE_DECIMALS : 0;\n\n const ltv = parseLtv(pool.ltv);\n const liqThreshold = parseLiqThreshold(pool.liquidationFactor.threshold);\n const maxBorrowVal = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor: borrowed > 0 ? healthFactor : Infinity,\n supplied,\n borrowed,\n maxBorrow: maxBorrowVal,\n liquidationThreshold: liqThreshold,\n };\n}\n\nexport async function getRates(client: SuiClient): Promise<RatesResult> {\n try {\n const pool = await getPool(USDC_TYPE, ENV);\n\n let saveApy = rateToApy(pool.currentSupplyRate);\n let borrowApy = rateToApy(pool.currentBorrowRate);\n\n if (saveApy <= 0 || saveApy > 100) saveApy = 4.0;\n if (borrowApy <= 0 || borrowApy > 100) borrowApy = 6.0;\n\n return { USDC: { saveApy, borrowApy } };\n } catch {\n return { USDC: { saveApy: 4.0, borrowApy: 6.0 } };\n }\n}\n\nexport async function getPositions(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<PositionsResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const state = await getLendingState(address, clientOpt(client, true));\n const positions: PositionEntry[] = [];\n\n for (const pos of state) {\n const symbol = pos.pool.token?.symbol ?? 'UNKNOWN';\n const supplyBal = Number(pos.supplyBalance) / 10 ** NAVI_BALANCE_DECIMALS;\n const borrowBal = Number(pos.borrowBalance) / 10 ** NAVI_BALANCE_DECIMALS;\n\n if (supplyBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'save',\n amount: supplyBal,\n apy: rateToApy(pos.pool.currentSupplyRate),\n });\n }\n\n if (borrowBal > 0.0001) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: 'borrow',\n amount: borrowBal,\n apy: rateToApy(pos.pool.currentBorrowRate),\n });\n }\n }\n\n return { positions };\n}\n\nexport async function maxWithdrawAmount(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, keypair);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? remainingSupply / hf.borrowed : Infinity;\n\n return {\n maxAmount,\n healthFactorAfter: hfAfter,\n currentHF: hf.healthFactor,\n };\n}\n\nexport async function maxBorrowAmount(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, keypair);\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 {\n maxAmount,\n healthFactorAfter: MIN_HEALTH_FACTOR,\n currentHF: hf.healthFactor,\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { CetusClmmSDK } from '@cetusprotocol/sui-clmm-sdk';\nimport { SUPPORTED_ASSETS, CLOCK_ID, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport type { GasMethod } from '../types.js';\n\nconst DEFAULT_SLIPPAGE_BPS = 300; // 3%\n\nexport interface SwapParams {\n client: SuiClient;\n keypair: Ed25519Keypair;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}\n\nexport interface SwapTxResult {\n digest: string;\n fromAmount: number;\n fromAsset: string;\n toAmount: number;\n toAsset: string;\n priceImpact: number;\n gasCost: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\n/**\n * In the Cetus USDC/SUI pool, the type ordering is:\n * - coin_a = USDC (smaller type string)\n * - coin_b = SUI\n * So USDC → SUI = a2b, SUI → USDC = b2a\n */\nfunction isA2B(from: string): boolean {\n return from === 'USDC';\n}\n\nlet _cetusSDK: CetusClmmSDK | null = null;\n\nfunction getCetusSDK(): CetusClmmSDK {\n if (!_cetusSDK) {\n _cetusSDK = CetusClmmSDK.createSDK({ env: 'mainnet' });\n }\n return _cetusSDK;\n}\n\nimport type { Transaction } from '@mysten/sui/transactions';\n\nexport interface SwapBuildResult {\n tx: Transaction;\n estimatedOut: number;\n toDecimals: number;\n}\n\nexport async function buildSwapTx(params: {\n client: SuiClient;\n address: string;\n fromAsset: 'USDC' | 'SUI';\n toAsset: 'USDC' | 'SUI';\n amount: number;\n maxSlippageBps?: number;\n}): Promise<SwapBuildResult> {\n const { client, address, fromAsset, toAsset, amount, maxSlippageBps = DEFAULT_SLIPPAGE_BPS } = params;\n\n const a2b = isA2B(fromAsset);\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const sdk = getCetusSDK();\n sdk.setSenderAddress(address);\n\n const pool = await sdk.Pool.getPool(CETUS_USDC_SUI_POOL);\n\n const preSwapResult = await sdk.Swap.preSwap({\n pool,\n current_sqrt_price: pool.current_sqrt_price,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n decimals_a: 6,\n decimals_b: 9,\n a2b,\n by_amount_in: true,\n amount: rawAmount.toString(),\n });\n\n const estimatedOut = Number(preSwapResult.estimated_amount_out);\n const slippageFactor = (10000 - maxSlippageBps) / 10000;\n const amountLimit = Math.floor(estimatedOut * slippageFactor);\n\n const swapPayload = await sdk.Swap.createSwapPayload({\n pool_id: pool.id,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n a2b,\n by_amount_in: true,\n amount: preSwapResult.amount.toString(),\n amount_limit: amountLimit.toString(),\n });\n\n return {\n tx: swapPayload as unknown as Transaction,\n estimatedOut,\n toDecimals: toInfo.decimals,\n };\n}\n\nexport async function executeSwap(params: SwapParams): Promise<SwapTxResult> {\n const { client, keypair, fromAsset, toAsset, amount, maxSlippageBps } = params;\n const address = keypair.getPublicKey().toSuiAddress();\n const toInfo = SUPPORTED_ASSETS[toAsset];\n\n const { tx, estimatedOut, toDecimals } = await buildSwapTx({\n client,\n address,\n fromAsset,\n toAsset,\n amount,\n maxSlippageBps,\n });\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n let actualReceived = 0;\n if (result.balanceChanges) {\n for (const change of result.balanceChanges) {\n if (\n change.coinType === toInfo.type &&\n change.owner &&\n typeof change.owner === 'object' &&\n 'AddressOwner' in change.owner &&\n change.owner.AddressOwner === address\n ) {\n const amt = Number(change.amount) / 10 ** toInfo.decimals;\n if (amt > 0) actualReceived += amt;\n }\n }\n }\n\n const expectedOutput = estimatedOut / 10 ** toDecimals;\n if (actualReceived === 0) actualReceived = expectedOutput;\n\n const priceImpact = expectedOutput > 0\n ? Math.abs(actualReceived - expectedOutput) / expectedOutput\n : 0;\n\n return {\n digest: result.digest,\n fromAmount: amount,\n fromAsset,\n toAmount: actualReceived,\n toAsset,\n priceImpact,\n gasCost: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nexport async function getPoolPrice(client: SuiClient): 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 // rawPrice = SUI_smallest / USDC_smallest (token1 per token0 in raw units)\n // Human conversion: 1 USDC = rawPrice * 10^(6-9) SUI\n // SUI price in USD = 1 / (rawPrice * 10^(6-9)) = 10^3 / rawPrice\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: SuiClient,\n fromAsset: 'USDC' | 'SUI',\n toAsset: 'USDC' | 'SUI',\n amount: number,\n): Promise<{ expectedOutput: number; priceImpact: number; poolPrice: number }> {\n const a2b = isA2B(fromAsset);\n const fromInfo = SUPPORTED_ASSETS[fromAsset];\n const toInfo = SUPPORTED_ASSETS[toAsset];\n const rawAmount = BigInt(Math.floor(amount * 10 ** fromInfo.decimals));\n\n const poolPrice = await getPoolPrice(client);\n\n try {\n const sdk = getCetusSDK();\n const pool = await sdk.Pool.getPool(CETUS_USDC_SUI_POOL);\n\n const preSwapResult = await sdk.Swap.preSwap({\n pool,\n current_sqrt_price: pool.current_sqrt_price,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n decimals_a: 6,\n decimals_b: 9,\n a2b,\n by_amount_in: true,\n amount: rawAmount.toString(),\n });\n\n const expectedOutput = Number(preSwapResult.estimated_amount_out) / 10 ** toInfo.decimals;\n\n return { expectedOutput, priceImpact: 0, poolPrice };\n } catch {\n let expectedOutput: number;\n if (fromAsset === 'USDC') {\n expectedOutput = amount / poolPrice;\n } else {\n expectedOutput = amount * poolPrice;\n }\n return { expectedOutput, priceImpact: 0, poolPrice };\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport type { SuiClient } from '@mysten/sui/client';\nimport {\n SAVE_FEE_BPS,\n SWAP_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_TREASURY_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; // as percentage, e.g. 0.1\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\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 protocol fee collection to an existing PTB.\n * Splits the fee from the agent's USDC coins and sends to the treasury.\n * Returns the fee coin for inclusion in the atomic transaction.\n */\nexport async function addFeeToTransaction(\n tx: Transaction,\n client: SuiClient,\n senderAddress: string,\n operation: FeeOperation,\n amount: number,\n): Promise<ProtocolFeeInfo> {\n const fee = calculateFee(operation, amount);\n\n if (fee.rawAmount <= 0n) return fee;\n\n const coins = await client.getCoins({\n owner: senderAddress,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n\n if (coins.data.length === 0) return fee;\n\n const primary = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primary, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n const [feeCoin] = tx.splitCoins(primary, [fee.rawAmount]);\n\n // Transfer fee directly to treasury\n tx.transferObjects([feeCoin], T2000_TREASURY_ID);\n\n return fee;\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 { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, keypair);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy / 100;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n // Estimate total yield earned based on position age\n // For MVP, use a simple approximation\n const totalYieldEarned = dailyEarning * 30; // rough monthly estimate\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, keypair);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\n","import { createHash } from 'node:crypto';\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n\n return true;\n}\n\nexport function solveHashcash(challenge: string): string {\n const bits = parseInt(challenge.split(':')[1], 10);\n let counter = 0;\n while (true) {\n const stamp = `${challenge}${counter.toString(16)}`;\n const hash = createHash('sha256').update(stamp).digest();\n if (hasLeadingZeroBits(hash, bits)) return stamp;\n counter++;\n }\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\nexport async function requestGasSponsorship(\n txBytesBase64: string,\n sender: string,\n type?: GasRequestType,\n): Promise<GasSponsorResponse> {\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ txBytes: txBytesBase64, sender, type }),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n undefined,\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n AUTO_TOPUP_AMOUNT,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n CLOCK_ID,\n CETUS_USDC_SUI_POOL,\n CETUS_GLOBAL_CONFIG,\n CETUS_PACKAGE,\n} from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\n\n// Max slippage: 3% enforced on-chain via sqrt_price_limit\nconst MAX_SLIPPAGE_BPS = 300;\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n return suiRaw < AUTO_TOPUP_THRESHOLD && usdcRaw >= AUTO_TOPUP_MIN_USDC;\n}\n\nexport async function executeAutoTopUp(\n client: SuiClient,\n keypair: Ed25519Keypair,\n): Promise<AutoTopUpResult> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n // Build the USDC → SUI swap transaction\n const tx = new Transaction();\n tx.setSender(address);\n\n const usdcCoins = await client.getCoins({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n\n if (usdcCoins.data.length === 0) {\n throw new T2000Error('AUTO_TOPUP_FAILED', 'No USDC coins available for auto-topup');\n }\n\n // Merge USDC coins if needed, then split the topup amount\n const coinIds = usdcCoins.data.map((c) => c.coinObjectId);\n let usdcCoin;\n if (coinIds.length === 1) {\n usdcCoin = tx.splitCoins(tx.object(coinIds[0]), [AUTO_TOPUP_AMOUNT]);\n } else {\n const primary = tx.object(coinIds[0]);\n if (coinIds.length > 1) {\n tx.mergeCoins(primary, coinIds.slice(1).map((id) => tx.object(id)));\n }\n usdcCoin = tx.splitCoins(primary, [AUTO_TOPUP_AMOUNT]);\n }\n\n // Cetus swap: USDC → SUI (a2b = true since USDC < SUI in type ordering)\n // sqrt_price_limit for a2b swap = MIN_SQRT_PRICE (going down)\n // This is the Cetus minimum sqrt_price for a2b swaps\n const MIN_SQRT_PRICE = '4295048016';\n\n const [receivedCoin, returnedCoin] = tx.moveCall({\n target: `${CETUS_PACKAGE}::pool_script::swap_a2b`,\n arguments: [\n tx.object(CETUS_GLOBAL_CONFIG),\n tx.object(CETUS_USDC_SUI_POOL),\n usdcCoin,\n tx.pure.bool(true), // by_amount_in\n tx.pure.u64(AUTO_TOPUP_AMOUNT),\n tx.pure.u128(MIN_SQRT_PRICE),\n tx.object(CLOCK_ID),\n ],\n typeArguments: [SUPPORTED_ASSETS.USDC.type, SUPPORTED_ASSETS.SUI.type],\n });\n\n // Transfer received SUI and return any remaining USDC\n tx.transferObjects([receivedCoin], address);\n tx.transferObjects([returnedCoin], address);\n\n // Serialize for gas station sponsorship (auto-topup gas is always sponsored)\n const txBytes = await tx.build({ client, onlyTransactionKind: true });\n const txBytesBase64 = Buffer.from(txBytes).toString('base64');\n\n let sponsoredResult;\n try {\n sponsoredResult = await requestGasSponsorship(txBytesBase64, address, 'auto-topup');\n } catch {\n throw new T2000Error('AUTO_TOPUP_FAILED', 'Gas station unavailable for auto-topup sponsorship');\n }\n\n // Sign with agent key and submit\n const sponsoredTxBytes = Buffer.from(sponsoredResult.txBytes, 'base64');\n const { signature: agentSig } = await keypair.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n // Calculate SUI received from balance changes\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 // Best-effort: report gas usage\n reportGasUsage(address, result.digest, 0, 0, 'auto-topup');\n\n return {\n success: true,\n tx: result.digest,\n usdcSpent: Number(AUTO_TOPUP_AMOUNT) / 1e6,\n suiReceived: Math.abs(suiReceived),\n };\n}\n","import type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n gasMethod: GasMethod;\n gasCostSui: number;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nasync function getSuiBalance(client: SuiClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function trySelfFunded(\n client: SuiClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n // Need at least 0.05 SUI for gas\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n // Let errors propagate so executeWithGas captures the real reason\n await executeAutoTopUp(client, keypair);\n\n // After top-up, try self-funded again\n tx.setSender(address);\n\n const result = await client.signAndExecuteTransaction({\n signer: keypair,\n transaction: tx,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n };\n}\n\nasync function trySponsored(\n client: SuiClient,\n keypair: Ed25519Keypair,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = keypair.getPublicKey().toSuiAddress();\n tx.setSender(address);\n\n // Let build/sponsorship errors propagate for diagnostics\n const txBytes = await tx.build({ client, onlyTransactionKind: true });\n const txBytesBase64 = Buffer.from(txBytes).toString('base64');\n const sponsoredResult = await requestGasSponsorship(txBytesBase64, address);\n\n const sponsoredTxBytes = Buffer.from(sponsoredResult.txBytes, 'base64');\n const { signature: agentSig } = await keypair.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n\n // Report gas usage (best-effort)\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n };\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n */\nexport async function executeWithGas(\n client: SuiClient,\n keypair: Ed25519Keypair,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, keypair, tx);\n if (result) return result;\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n errors.push(`self-funded: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2: Try auto-topup then self-fund\n try {\n const tx = await buildTx();\n const result = await tryAutoTopUpThenSelfFund(client, keypair, tx);\n if (result) return result;\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, keypair, tx);\n if (result) return result;\n errors.push('sponsored: returned null');\n } catch (err) {\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and Gas Station unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","import { EventEmitter } from 'eventemitter3';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { getSuiClient } from './utils/sui.js';\nimport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory } from './wallet/history.js';\nimport * as navi from './protocols/navi.js';\nimport * as cetus from './protocols/cetus.js';\nimport { calculateFee, reportFee } from './protocols/protocolFee.js';\nimport * as yieldTracker from './protocols/yieldTracker.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} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, DEFAULT_NETWORK, API_BASE_URL } from './constants.js';\nimport { truncateAddress } from './utils/sui.js';\n\ninterface T2000Events {\n balanceChange: (event: { asset: string; previous: number; current: number; cause: string; tx?: string }) => void;\n healthWarning: (event: { healthFactor: number; threshold: number; severity: 'warning' }) => void;\n healthCritical: (event: { healthFactor: number; threshold: number; severity: 'critical' }) => void;\n yield: (event: { earned: number; total: number; apy: number; timestamp: number }) => void;\n gasAutoTopUp: (result: { usdcSpent: number; suiReceived: number }) => void;\n gasStationFallback: (event: { reason: string; method: string; suiUsed: number }) => void;\n error: (error: T2000Error) => void;\n}\n\nexport class T2000 extends EventEmitter<T2000Events> {\n private readonly keypair: Ed25519Keypair;\n private readonly client: SuiClient;\n private readonly _address: string;\n\n\n private constructor(keypair: Ed25519Keypair, client: SuiClient) {\n super();\n this.keypair = keypair;\n this.client = client;\n this._address = getAddress(keypair);\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);\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);\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);\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 /** SuiClient used by this agent — exposed for x402 and other integrations. */\n get suiClient(): SuiClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for x402 and other integrations. */\n get signer(): Ed25519Keypair {\n return this.keypair;\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n 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 sendAmount = params.amount;\n const sendTo = params.to;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n );\n\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: params.to,\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 try {\n const positions = await this.positions();\n const savings = positions.positions\n .filter((p) => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n bal.savings = savings;\n bal.total = bal.available + savings + bal.gasReserve.usdEquiv;\n } catch {\n // NAVI unavailable — show basic balance\n }\n\n return bal;\n }\n\n async history(params?: { limit?: number }): Promise<TransactionRecord[]> {\n return queryHistory(this.client, this._address, params?.limit);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'Sui (mainnet)',\n supportedAssets: ['USDC'],\n instructions: [\n `Send USDC on Sui to: ${this._address}`,\n '',\n 'From a CEX (Coinbase, Binance):',\n ` 1. Withdraw USDC`,\n ` 2. Select \"Sui\" network`,\n ` 3. Paste address: ${truncateAddress(this._address)}`,\n '',\n 'From another Sui wallet:',\n ` Transfer USDC to ${truncateAddress(this._address)}`,\n ].join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; asset?: string }): Promise<SaveResult> {\n let amount: number;\n if (params.amount === 'all') {\n const bal = await queryBalance(this.client, this._address);\n const GAS_RESERVE_USDC = 1.0;\n amount = bal.available - GAS_RESERVE_USDC;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', 'Balance too low to save after $1 gas reserve', {\n reason: 'gas_reserve_required',\n available: bal.available,\n });\n }\n } else {\n amount = params.amount;\n }\n const fee = calculateFee('save', amount);\n const saveAmount = amount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n navi.buildSaveTx(this.client, this._address, saveAmount),\n );\n\n const rates = await navi.getRates(this.client);\n reportFee(this._address, 'save', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange('USDC', saveAmount, 'save', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.USDC.saveApy,\n fee: fee.amount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; asset?: string }): Promise<WithdrawResult> {\n let amount: number;\n if (params.amount === 'all') {\n const maxResult = await this.maxWithdraw();\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 // Risk check: would this withdrawal drop HF below minimum?\n const hf = await this.healthFactor();\n if (hf.borrowed > 0) {\n const maxResult = await this.maxWithdraw();\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 const withdrawAmount = amount;\n let effectiveAmount = withdrawAmount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await navi.buildWithdrawTx(this.client, this._address, withdrawAmount);\n effectiveAmount = built.effectiveAmount;\n return built.tx;\n });\n\n this.emitBalanceChange('USDC', effectiveAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: effectiveAmount,\n gasCost: gasResult.gasCostSui,\n gasMethod: gasResult.gasMethod,\n };\n }\n\n async maxWithdraw(): Promise<MaxWithdrawResult> {\n return navi.maxWithdrawAmount(this.client, this.keypair);\n }\n\n // -- Borrowing --\n\n async borrow(params: { amount: number; asset?: string }): Promise<BorrowResult> {\n const maxResult = await this.maxBorrow();\n if (params.amount > maxResult.maxAmount) {\n throw new T2000Error('HEALTH_FACTOR_TOO_LOW', `Max safe borrow: $${maxResult.maxAmount.toFixed(2)}`, {\n maxBorrow: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n });\n }\n const fee = calculateFee('borrow', params.amount);\n\n const borrowAmount = params.amount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n navi.buildBorrowTx(this.client, this._address, borrowAmount),\n );\n\n const hf = await navi.getHealthFactor(this.client, this.keypair);\n reportFee(this._address, 'borrow', fee.amount, fee.rate, gasResult.digest);\n this.emitBalanceChange('USDC', 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'; asset?: string }): Promise<RepayResult> {\n let amount: number;\n if (params.amount === 'all') {\n const hf = await this.healthFactor();\n amount = hf.borrowed;\n if (amount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No outstanding borrow to repay');\n }\n } else {\n amount = params.amount;\n }\n const repayAmount = amount;\n\n const gasResult = await executeWithGas(this.client, this.keypair, () =>\n navi.buildRepayTx(this.client, this._address, repayAmount),\n );\n\n const hf = await navi.getHealthFactor(this.client, this.keypair);\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 async maxBorrow(): Promise<MaxBorrowResult> {\n return navi.maxBorrowAmount(this.client, this.keypair);\n }\n\n async healthFactor(): Promise<HealthFactorResult> {\n const hf = await navi.getHealthFactor(this.client, this.keypair);\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 --\n\n async swap(params: { from: string; to: string; amount: number; maxSlippage?: number }): Promise<SwapResult> {\n const fromAsset = params.from.toUpperCase() as 'USDC' | 'SUI';\n const toAsset = params.to.toUpperCase() as 'USDC' | 'SUI';\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 fee = calculateFee('swap', params.amount);\n const swapAmount = params.amount;\n const slippageBps = params.maxSlippage ? params.maxSlippage * 100 : undefined;\n\n let swapMeta: { estimatedOut: number; toDecimals: number } = { estimatedOut: 0, toDecimals: 0 };\n\n const gasResult = await executeWithGas(this.client, this.keypair, async () => {\n const built = await cetus.buildSwapTx({\n client: this.client,\n address: this._address,\n fromAsset,\n toAsset,\n amount: swapAmount,\n maxSlippageBps: slippageBps,\n });\n swapMeta = { estimatedOut: built.estimatedOut, toDecimals: built.toDecimals };\n return built.tx;\n });\n\n const toInfo = SUPPORTED_ASSETS[toAsset];\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.toUpperCase() as 'USDC' | 'SUI';\n const toAsset = params.to.toUpperCase() as 'USDC' | 'SUI';\n const quote = await cetus.getSwapQuote(this.client, fromAsset, toAsset, params.amount);\n const fee = calculateFee('swap', params.amount);\n return { ...quote, fee: { amount: fee.amount, rate: fee.rate } };\n }\n\n // -- Info --\n\n async positions(): Promise<PositionsResult> {\n return navi.getPositions(this.client, this.keypair);\n }\n\n async rates(): Promise<RatesResult> {\n return navi.getRates(this.client);\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this.keypair);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this.keypair);\n }\n\n // -- Helpers --\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 { SuiClient } from '@mysten/sui/client';\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: SuiClient,\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"]}
|