@t2000/sdk 0.21.6 → 0.21.8

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/browser.js CHANGED
@@ -318,13 +318,14 @@ async function trySelfFunded(client, signer, tx) {
318
318
  const result = await client.executeTransactionBlock({
319
319
  transactionBlock: toBase64(builtBytes),
320
320
  signature: [signature],
321
- options: { showEffects: true }
321
+ options: { showEffects: true, showBalanceChanges: true }
322
322
  });
323
323
  await client.waitForTransaction({ digest: result.digest });
324
324
  await assertTxSuccess(result.effects, result.digest);
325
325
  return {
326
326
  digest: result.digest,
327
327
  effects: result.effects,
328
+ balanceChanges: result.balanceChanges,
328
329
  gasMethod: "self-funded",
329
330
  gasCostSui: extractGasCost(result.effects),
330
331
  preTxSuiMist: suiBalance
@@ -343,13 +344,14 @@ async function tryAutoTopUpThenSelfFund(client, signer, buildTx) {
343
344
  const result = await client.executeTransactionBlock({
344
345
  transactionBlock: toBase64(builtBytes),
345
346
  signature: [signature],
346
- options: { showEffects: true }
347
+ options: { showEffects: true, showBalanceChanges: true }
347
348
  });
348
349
  await client.waitForTransaction({ digest: result.digest });
349
350
  await assertTxSuccess(result.effects, result.digest);
350
351
  return {
351
352
  digest: result.digest,
352
353
  effects: result.effects,
354
+ balanceChanges: result.balanceChanges,
353
355
  gasMethod: "auto-topup",
354
356
  gasCostSui: extractGasCost(result.effects),
355
357
  preTxSuiMist: suiAfterTopUp
@@ -373,7 +375,7 @@ async function trySponsored(client, signer, tx) {
373
375
  const result = await client.executeTransactionBlock({
374
376
  transactionBlock: sponsoredResult.txBytes,
375
377
  signature: [agentSig, sponsoredResult.sponsorSignature],
376
- options: { showEffects: true }
378
+ options: { showEffects: true, showBalanceChanges: true }
377
379
  });
378
380
  await client.waitForTransaction({ digest: result.digest });
379
381
  await assertTxSuccess(result.effects, result.digest);
@@ -382,6 +384,7 @@ async function trySponsored(client, signer, tx) {
382
384
  return {
383
385
  digest: result.digest,
384
386
  effects: result.effects,
387
+ balanceChanges: result.balanceChanges,
385
388
  gasMethod: "sponsored",
386
389
  gasCostSui: gasCost,
387
390
  preTxSuiMist: suiBalance
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.ts","../src/errors.ts","../src/constants.ts","../src/gas/autoTopUp.ts","../src/utils/base64.ts","../src/gas/gasStation.ts","../src/gas/manager.ts","../src/utils/sui.ts","../src/utils/format.ts","../src/protocols/protocolFee.ts","../src/safeguards/errors.ts","../src/safeguards/types.ts"],"names":[],"mappings":"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","file":"browser.js","sourcesContent":["import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'USDC_SPONSOR_FAILED'\n | 'USDC_SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC' | 'USDT' | 'USDe' | 'USDsui';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC', 'USDT', 'USDe', 'USDsui'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SUPPORTED_ASSETS,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n} from '../constants.js';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n // Auto top-up requires a DEX swap (USDC→SUI) which is not available\n // without a swap adapter. Gas station sponsorship is the fallback.\n if (suiRaw < GAS_RESERVE_TARGET && usdcRaw >= AUTO_TOPUP_MIN_USDC) {\n return false;\n }\n return false;\n}\n\nexport async function executeAutoTopUp(\n _client: SuiJsonRpcClient,\n _signer: TransactionSigner,\n): Promise<AutoTopUpResult> {\n // Auto top-up requires USDC→SUI swap via DEX. Currently unavailable —\n // gas station sponsorship handles gas funding instead.\n return { success: false, tx: '', usdcSpent: 0, suiReceived: 0 };\n}\n","/** Cross-platform (Node + browser) base64 helpers. */\n\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nexport function fromBase64(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { toBase64 } from '../utils/base64.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\n/**\n * Request gas sponsorship from the gas station.\n *\n * Sends `txJson` (preferred) or `txBcsBytes` (base64-encoded BCS from tx.build(),\n * used when serialize() fails due to v1/v2 SDK mismatch with aggregator).\n */\nexport async function requestGasSponsorship(\n txJson: string,\n sender: string,\n type?: GasRequestType,\n txBcsBytes?: string,\n): Promise<GasSponsorResponse> {\n const payload: Record<string, unknown> = { sender, type };\n if (txBcsBytes) {\n payload.txBcsBytes = txBcsBytes;\n } else {\n payload.txJson = txJson;\n payload.txBytes = toBase64(new TextEncoder().encode(txJson));\n }\n\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED' || errorCode === 'PRICE_STALE') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter, reason: errorCode },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n { reason: errorCode },\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error, isMoveAbort, parseMoveAbortMessage } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport type { SafeguardEnforcer } from '../safeguards/enforcer.js';\nimport type { TxMetadata } from '../safeguards/types.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n gasMethod: GasMethod;\n gasCostSui: number;\n /** Pre-TX SUI balance in MIST — used internally for proactive gas maintenance. */\n preTxSuiMist?: bigint;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nasync function getSuiBalance(client: SuiJsonRpcClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function assertTxSuccess(effects: unknown, digest: string): Promise<void> {\n const eff = effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n const errMsg = eff.status.error ?? 'unknown on-chain error';\n if (isMoveAbort(errMsg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(errMsg));\n }\n throw new T2000Error('TRANSACTION_FAILED', `Transaction ${digest} failed on-chain: ${errMsg}`);\n }\n}\n\nasync function trySelfFunded(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiBalance,\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, signer);\n\n // Rebuild the transaction with fresh object versions (auto-topup changed coin state)\n const tx = await buildTx();\n tx.setSender(address);\n\n const suiAfterTopUp = await getSuiBalance(client, address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiAfterTopUp,\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n tx.setSender(address);\n\n // Use serialize() for pure v2 transactions, fall back to build() for\n // mixed v1/v2 transactions (e.g. Cetus aggregator adds v1 commands).\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = tx.serialize();\n } catch {\n const bcsBytes = await tx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = fromBase64(sponsoredResult.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n preTxSuiMist: suiBalance,\n };\n}\n\n/**\n * Best-effort indexer readiness check after transaction finalization.\n * Verifies the TX effects are queryable. Note: aggregate indices\n * (getBalance, getDynamicFields) may still lag — callers that need\n * consistent reads should poll their expected state separately.\n */\nasync function waitForIndexer(client: SuiJsonRpcClient, digest: string): Promise<void> {\n for (let i = 0; i < 3; i++) {\n try {\n await client.getTransactionBlock({ digest, options: { showObjectChanges: true } });\n return;\n } catch {\n await new Promise(r => setTimeout(r, 500));\n }\n }\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n *\n * After every successful transaction, proactively tops up SUI if it\n * dropped below threshold — so the user never hits a \"no gas\" wall.\n */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n options?: { metadata?: TxMetadata; enforcer?: SafeguardEnforcer },\n): Promise<GasExecutionResult> {\n if (options?.enforcer && options?.metadata) {\n options.enforcer.check(options.metadata);\n }\n\n const result = await resolveGas(client, signer, buildTx);\n\n // Proactive gas maintenance — compute remaining SUI from the TX result\n // instead of querying the indexer (which may still show stale balances).\n try {\n if (result.preTxSuiMist !== undefined) {\n const gasCostMist = result.gasMethod === 'sponsored'\n ? 0n\n : BigInt(Math.round(result.gasCostSui * 1e9));\n const estimatedRemaining = result.preTxSuiMist - gasCostMist;\n if (estimatedRemaining < GAS_RESERVE_TARGET) {\n const address = signer.getAddress();\n const usdcBal = await client.getBalance({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n if (BigInt(usdcBal.totalBalance) >= AUTO_TOPUP_MIN_USDC) {\n await executeAutoTopUp(client, signer);\n }\n }\n }\n } catch { /* best-effort — don't fail the main operation */ }\n\n return result;\n}\n\nconst GAS_RESOLUTION_CODES: Set<string> = new Set([\n 'INSUFFICIENT_GAS',\n 'GAS_STATION_UNAVAILABLE',\n 'GAS_FEE_EXCEEDED',\n 'AUTO_TOPUP_FAILED',\n 'SPONSOR_UNAVAILABLE',\n]);\n\nfunction isBuildError(err: unknown): err is T2000Error {\n return err instanceof T2000Error && !GAS_RESOLUTION_CODES.has(err.code);\n}\n\nasync function resolveGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n let lastBuildError: T2000Error | undefined;\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (swap USDC→SUI) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, signer, buildTx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2.5: Retry self-funded — auto-topup may have deposited SUI\n // even if the combined operation failed\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded-retry: ${msg}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('sponsored: returned null');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n if (lastBuildError) throw lastBuildError;\n\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and sponsorship unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","import { SuiJsonRpcClient, getJsonRpcFullnodeUrl } from '@mysten/sui/jsonRpc';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiJsonRpcClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiJsonRpcClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiJsonRpcClient({ url, network: 'mainnet' });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiJsonRpcClient {\n return new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl(network), network });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'borrow';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n borrow: 2,\n};\n\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import { T2000Error } from '../errors.js';\n\nexport type SafeguardRule = 'locked' | 'maxPerTx' | 'maxDailySend';\n\nexport interface SafeguardErrorDetails {\n attempted?: number;\n limit?: number;\n current?: number;\n}\n\nexport class SafeguardError extends T2000Error {\n readonly rule: SafeguardRule;\n readonly details: SafeguardErrorDetails;\n\n constructor(rule: SafeguardRule, details: SafeguardErrorDetails, message?: string) {\n const msg = message ?? buildMessage(rule, details);\n super('SAFEGUARD_BLOCKED' as any, msg, { rule, ...details });\n this.name = 'SafeguardError';\n this.rule = rule;\n this.details = details;\n }\n\n override toJSON() {\n return {\n error: 'SAFEGUARD_BLOCKED' as const,\n message: this.message,\n retryable: this.retryable,\n data: { rule: this.rule, ...this.details },\n };\n }\n}\n\nfunction buildMessage(rule: SafeguardRule, details: SafeguardErrorDetails): string {\n switch (rule) {\n case 'locked':\n return 'Agent is locked. All operations are frozen.';\n case 'maxPerTx':\n return `Amount $${(details.attempted ?? 0).toFixed(2)} exceeds per-transaction limit ($${(details.limit ?? 0).toFixed(2)})`;\n case 'maxDailySend':\n return `Daily send limit reached ($${(details.current ?? 0).toFixed(2)}/$${(details.limit ?? 0).toFixed(2)} used today)`;\n }\n}\n","export interface SafeguardConfig {\n locked: boolean;\n maxPerTx: number;\n maxDailySend: number;\n dailyUsed: number;\n dailyResetDate: string;\n maxLeverage?: number;\n maxPositionSize?: number;\n}\n\nexport interface TxMetadata {\n operation:\n | 'send'\n | 'save'\n | 'withdraw'\n | 'borrow'\n | 'repay'\n | 'pay';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n]);\n\nexport const DEFAULT_SAFEGUARD_CONFIG: SafeguardConfig = {\n locked: false,\n maxPerTx: 0,\n maxDailySend: 0,\n dailyUsed: 0,\n dailyResetDate: '',\n};\n"]}
1
+ {"version":3,"sources":["../src/wallet/keypairSigner.ts","../src/wallet/zkLoginSigner.ts","../src/errors.ts","../src/constants.ts","../src/gas/autoTopUp.ts","../src/utils/base64.ts","../src/gas/gasStation.ts","../src/gas/manager.ts","../src/utils/sui.ts","../src/utils/format.ts","../src/protocols/protocolFee.ts","../src/safeguards/errors.ts","../src/safeguards/types.ts"],"names":[],"mappings":"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","file":"browser.js","sourcesContent":["import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'USDC_SPONSOR_FAILED'\n | 'USDC_SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC' | 'USDT' | 'USDe' | 'USDsui';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC', 'USDT', 'USDe', 'USDsui'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SUPPORTED_ASSETS,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n} from '../constants.js';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface AutoTopUpResult {\n success: boolean;\n tx: string;\n usdcSpent: number;\n suiReceived: number;\n}\n\nexport async function shouldAutoTopUp(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<boolean> {\n const [suiBalance, usdcBalance] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.USDC.type }),\n ]);\n\n const suiRaw = BigInt(suiBalance.totalBalance);\n const usdcRaw = BigInt(usdcBalance.totalBalance);\n\n // Auto top-up requires a DEX swap (USDC→SUI) which is not available\n // without a swap adapter. Gas station sponsorship is the fallback.\n if (suiRaw < GAS_RESERVE_TARGET && usdcRaw >= AUTO_TOPUP_MIN_USDC) {\n return false;\n }\n return false;\n}\n\nexport async function executeAutoTopUp(\n _client: SuiJsonRpcClient,\n _signer: TransactionSigner,\n): Promise<AutoTopUpResult> {\n // Auto top-up requires USDC→SUI swap via DEX. Currently unavailable —\n // gas station sponsorship handles gas funding instead.\n return { success: false, tx: '', usdcSpent: 0, suiReceived: 0 };\n}\n","/** Cross-platform (Node + browser) base64 helpers. */\n\nexport function toBase64(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nexport function fromBase64(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","import { API_BASE_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { toBase64 } from '../utils/base64.js';\n\nexport type GasRequestType = 'bootstrap' | 'auto-topup' | 'fallback';\n\nexport interface GasSponsorResponse {\n txBytes: string;\n sponsorSignature: string;\n gasEstimateUsd: number;\n type: GasRequestType;\n}\n\nexport interface GasStatusResponse {\n circuitBreaker: boolean;\n suiPrice: number;\n bootstrapUsed?: number;\n bootstrapRemaining?: number;\n}\n\n/**\n * Request gas sponsorship from the gas station.\n *\n * Sends `txJson` (preferred) or `txBcsBytes` (base64-encoded BCS from tx.build(),\n * used when serialize() fails due to v1/v2 SDK mismatch with aggregator).\n */\nexport async function requestGasSponsorship(\n txJson: string,\n sender: string,\n type?: GasRequestType,\n txBcsBytes?: string,\n): Promise<GasSponsorResponse> {\n const payload: Record<string, unknown> = { sender, type };\n if (txBcsBytes) {\n payload.txBcsBytes = txBcsBytes;\n } else {\n payload.txJson = txJson;\n payload.txBytes = toBase64(new TextEncoder().encode(txJson));\n }\n\n const res = await fetch(`${API_BASE_URL}/api/gas`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const errorCode = data.error as string;\n\n if (errorCode === 'CIRCUIT_BREAKER' || errorCode === 'POOL_DEPLETED' || errorCode === 'PRICE_STALE') {\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas station temporarily unavailable',\n { retryAfter: data.retryAfter, reason: errorCode },\n true,\n );\n }\n if (errorCode === 'GAS_FEE_EXCEEDED') {\n throw new T2000Error(\n 'GAS_FEE_EXCEEDED',\n (data.message as string) ?? 'Gas fee exceeds ceiling',\n { retryAfter: data.retryAfter },\n true,\n );\n }\n\n throw new T2000Error(\n 'GAS_STATION_UNAVAILABLE',\n (data.message as string) ?? 'Gas sponsorship request failed',\n { reason: errorCode },\n true,\n );\n }\n\n return data as unknown as GasSponsorResponse;\n}\n\nexport async function reportGasUsage(\n sender: string,\n txDigest: string,\n gasCostSui: number,\n usdcCharged: number,\n type: GasRequestType,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/gas/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sender, txDigest, gasCostSui, usdcCharged, type }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n\nexport async function getGasStatus(address?: string): Promise<GasStatusResponse> {\n const url = new URL(`${API_BASE_URL}/api/gas/status`);\n if (address) url.searchParams.set('address', address);\n\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new T2000Error('GAS_STATION_UNAVAILABLE', 'Failed to fetch gas status', undefined, true);\n }\n\n return (await res.json()) as GasStatusResponse;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n SUPPORTED_ASSETS,\n AUTO_TOPUP_THRESHOLD,\n GAS_RESERVE_TARGET,\n AUTO_TOPUP_MIN_USDC,\n MIST_PER_SUI,\n} from '../constants.js';\nimport type { GasMethod } from '../types.js';\nimport { T2000Error, isMoveAbort, parseMoveAbortMessage } from '../errors.js';\nimport { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';\nimport { requestGasSponsorship, reportGasUsage } from './gasStation.js';\nimport type { SafeguardEnforcer } from '../safeguards/enforcer.js';\nimport type { TxMetadata } from '../safeguards/types.js';\nimport type { TransactionSigner } from '../signer.js';\nimport { toBase64, fromBase64 } from '../utils/base64.js';\n\nexport interface GasExecutionResult {\n digest: string;\n effects: unknown;\n balanceChanges?: unknown[];\n gasMethod: GasMethod;\n gasCostSui: number;\n /** Pre-TX SUI balance in MIST — used internally for proactive gas maintenance. */\n preTxSuiMist?: bigint;\n}\n\nfunction extractGasCost(\n effects: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } } | undefined | null,\n): number {\n if (!effects?.gasUsed) return 0;\n return (\n Number(effects.gasUsed.computationCost) +\n Number(effects.gasUsed.storageCost) -\n Number(effects.gasUsed.storageRebate)\n ) / 1e9;\n}\n\nasync function getSuiBalance(client: SuiJsonRpcClient, address: string): Promise<bigint> {\n const bal = await client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type });\n return BigInt(bal.totalBalance);\n}\n\nasync function assertTxSuccess(effects: unknown, digest: string): Promise<void> {\n const eff = effects as { status?: { status: string; error?: string } } | undefined;\n if (eff?.status?.status === 'failure') {\n const errMsg = eff.status.error ?? 'unknown on-chain error';\n if (isMoveAbort(errMsg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(errMsg));\n }\n throw new T2000Error('TRANSACTION_FAILED', `Transaction ${digest} failed on-chain: ${errMsg}`);\n }\n}\n\nasync function trySelfFunded(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n\n if (suiBalance < AUTO_TOPUP_THRESHOLD) return null;\n\n tx.setSender(address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'self-funded',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiBalance,\n };\n}\n\nasync function tryAutoTopUpThenSelfFund(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n\n const canTopUp = await shouldAutoTopUp(client, address);\n if (!canTopUp) return null;\n\n await executeAutoTopUp(client, signer);\n\n // Rebuild the transaction with fresh object versions (auto-topup changed coin state)\n const tx = await buildTx();\n tx.setSender(address);\n\n const suiAfterTopUp = await getSuiBalance(client, address);\n\n const builtBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(builtBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: toBase64(builtBytes),\n signature: [signature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'auto-topup',\n gasCostSui: extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]),\n preTxSuiMist: suiAfterTopUp,\n };\n}\n\nasync function trySponsored(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n tx: Transaction,\n): Promise<GasExecutionResult | null> {\n const address = signer.getAddress();\n const suiBalance = await getSuiBalance(client, address);\n tx.setSender(address);\n\n // Use serialize() for pure v2 transactions, fall back to build() for\n // mixed v1/v2 transactions (e.g. Cetus aggregator adds v1 commands).\n let txJson: string | undefined;\n let txBcsBase64: string | undefined;\n try {\n txJson = tx.serialize();\n } catch {\n const bcsBytes = await tx.build({ client });\n txBcsBase64 = toBase64(bcsBytes);\n }\n\n const sponsoredResult = await requestGasSponsorship(txJson ?? '', address, undefined, txBcsBase64);\n\n const sponsoredTxBytes = fromBase64(sponsoredResult.txBytes);\n const { signature: agentSig } = await signer.signTransaction(sponsoredTxBytes);\n\n const result = await client.executeTransactionBlock({\n transactionBlock: sponsoredResult.txBytes,\n signature: [agentSig, sponsoredResult.sponsorSignature],\n options: { showEffects: true, showBalanceChanges: true },\n });\n\n await client.waitForTransaction({ digest: result.digest });\n await assertTxSuccess(result.effects, result.digest);\n\n const gasCost = extractGasCost(result.effects as Parameters<typeof extractGasCost>[0]);\n reportGasUsage(address, result.digest, gasCost, 0, sponsoredResult.type);\n\n return {\n digest: result.digest,\n effects: result.effects,\n balanceChanges: (result as { balanceChanges?: unknown[] }).balanceChanges,\n gasMethod: 'sponsored',\n gasCostSui: gasCost,\n preTxSuiMist: suiBalance,\n };\n}\n\n/**\n * Best-effort indexer readiness check after transaction finalization.\n * Verifies the TX effects are queryable. Note: aggregate indices\n * (getBalance, getDynamicFields) may still lag — callers that need\n * consistent reads should poll their expected state separately.\n */\nasync function waitForIndexer(client: SuiJsonRpcClient, digest: string): Promise<void> {\n for (let i = 0; i < 3; i++) {\n try {\n await client.getTransactionBlock({ digest, options: { showObjectChanges: true } });\n return;\n } catch {\n await new Promise(r => setTimeout(r, 500));\n }\n }\n}\n\n/**\n * Gas resolution chain:\n * 1. Self-funded (agent has enough SUI)\n * 2. Auto-topup (swap USDC→SUI, then self-fund)\n * 3. Gas Station sponsored (fallback)\n * 4. Fail with INSUFFICIENT_GAS\n *\n * After every successful transaction, proactively tops up SUI if it\n * dropped below threshold — so the user never hits a \"no gas\" wall.\n */\nexport async function executeWithGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n options?: { metadata?: TxMetadata; enforcer?: SafeguardEnforcer },\n): Promise<GasExecutionResult> {\n if (options?.enforcer && options?.metadata) {\n options.enforcer.check(options.metadata);\n }\n\n const result = await resolveGas(client, signer, buildTx);\n\n // Proactive gas maintenance — compute remaining SUI from the TX result\n // instead of querying the indexer (which may still show stale balances).\n try {\n if (result.preTxSuiMist !== undefined) {\n const gasCostMist = result.gasMethod === 'sponsored'\n ? 0n\n : BigInt(Math.round(result.gasCostSui * 1e9));\n const estimatedRemaining = result.preTxSuiMist - gasCostMist;\n if (estimatedRemaining < GAS_RESERVE_TARGET) {\n const address = signer.getAddress();\n const usdcBal = await client.getBalance({\n owner: address,\n coinType: SUPPORTED_ASSETS.USDC.type,\n });\n if (BigInt(usdcBal.totalBalance) >= AUTO_TOPUP_MIN_USDC) {\n await executeAutoTopUp(client, signer);\n }\n }\n }\n } catch { /* best-effort — don't fail the main operation */ }\n\n return result;\n}\n\nconst GAS_RESOLUTION_CODES: Set<string> = new Set([\n 'INSUFFICIENT_GAS',\n 'GAS_STATION_UNAVAILABLE',\n 'GAS_FEE_EXCEEDED',\n 'AUTO_TOPUP_FAILED',\n 'SPONSOR_UNAVAILABLE',\n]);\n\nfunction isBuildError(err: unknown): err is T2000Error {\n return err instanceof T2000Error && !GAS_RESOLUTION_CODES.has(err.code);\n}\n\nasync function resolveGas(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Transaction | Promise<Transaction>,\n): Promise<GasExecutionResult> {\n const errors: string[] = [];\n let lastBuildError: T2000Error | undefined;\n\n // Step 1: Try self-funded\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('self-funded: SUI below threshold');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded: ${msg}`);\n }\n\n // Step 2: Try auto-topup (swap USDC→SUI) then self-fund the main tx\n try {\n const result = await tryAutoTopUpThenSelfFund(client, signer, buildTx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('auto-topup: not eligible (low USDC or sufficient SUI)');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n errors.push(`auto-topup: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 2.5: Retry self-funded — auto-topup may have deposited SUI\n // even if the combined operation failed\n try {\n const tx = await buildTx();\n const result = await trySelfFunded(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (isMoveAbort(msg)) {\n throw new T2000Error('TRANSACTION_FAILED', parseMoveAbortMessage(msg));\n }\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`self-funded-retry: ${msg}`);\n }\n\n // Step 3: Try gas station sponsored\n try {\n const tx = await buildTx();\n const result = await trySponsored(client, signer, tx);\n if (result) {\n await waitForIndexer(client, result.digest);\n return result;\n }\n errors.push('sponsored: returned null');\n } catch (err) {\n if (err instanceof T2000Error && err.code === 'TRANSACTION_FAILED') throw err;\n if (isBuildError(err)) lastBuildError = err;\n errors.push(`sponsored: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Step 4: All methods failed\n if (lastBuildError) throw lastBuildError;\n\n throw new T2000Error(\n 'INSUFFICIENT_GAS',\n `No SUI for gas and sponsorship unavailable. Fund your wallet with SUI or USDC. [${errors.join(' | ')}]`,\n { reason: 'all_gas_methods_exhausted', errors },\n );\n}\n","import { SuiJsonRpcClient, getJsonRpcFullnodeUrl } from '@mysten/sui/jsonRpc';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiJsonRpcClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiJsonRpcClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiJsonRpcClient({ url, network: 'mainnet' });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiJsonRpcClient {\n return new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl(network), network });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'borrow';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n borrow: 2,\n};\n\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import { T2000Error } from '../errors.js';\n\nexport type SafeguardRule = 'locked' | 'maxPerTx' | 'maxDailySend';\n\nexport interface SafeguardErrorDetails {\n attempted?: number;\n limit?: number;\n current?: number;\n}\n\nexport class SafeguardError extends T2000Error {\n readonly rule: SafeguardRule;\n readonly details: SafeguardErrorDetails;\n\n constructor(rule: SafeguardRule, details: SafeguardErrorDetails, message?: string) {\n const msg = message ?? buildMessage(rule, details);\n super('SAFEGUARD_BLOCKED' as any, msg, { rule, ...details });\n this.name = 'SafeguardError';\n this.rule = rule;\n this.details = details;\n }\n\n override toJSON() {\n return {\n error: 'SAFEGUARD_BLOCKED' as const,\n message: this.message,\n retryable: this.retryable,\n data: { rule: this.rule, ...this.details },\n };\n }\n}\n\nfunction buildMessage(rule: SafeguardRule, details: SafeguardErrorDetails): string {\n switch (rule) {\n case 'locked':\n return 'Agent is locked. All operations are frozen.';\n case 'maxPerTx':\n return `Amount $${(details.attempted ?? 0).toFixed(2)} exceeds per-transaction limit ($${(details.limit ?? 0).toFixed(2)})`;\n case 'maxDailySend':\n return `Daily send limit reached ($${(details.current ?? 0).toFixed(2)}/$${(details.limit ?? 0).toFixed(2)} used today)`;\n }\n}\n","export interface SafeguardConfig {\n locked: boolean;\n maxPerTx: number;\n maxDailySend: number;\n dailyUsed: number;\n dailyResetDate: string;\n maxLeverage?: number;\n maxPositionSize?: number;\n}\n\nexport interface TxMetadata {\n operation:\n | 'send'\n | 'save'\n | 'withdraw'\n | 'borrow'\n | 'repay'\n | 'pay';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n]);\n\nexport const DEFAULT_SAFEGUARD_CONFIG: SafeguardConfig = {\n locked: false,\n maxPerTx: 0,\n maxDailySend: 0,\n dailyUsed: 0,\n dailyResetDate: '',\n};\n"]}
package/dist/index.cjs CHANGED
@@ -313,6 +313,8 @@ var init_cetus_swap = __esm({
313
313
  AUSD: "0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD",
314
314
  BUCK: "0xce7ff77a83ea0cb6fd39bd8748e2ec89a3f41e8efdc3f4eb123e0ca37b184db2::buck::BUCK",
315
315
  USDe: "0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE",
316
+ USDSUI: "0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI",
317
+ MANIFEST: "0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST",
316
318
  NS: "0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS",
317
319
  BLUB: "0xfa7ac3951fdca12c1b6d18eb19e1aa2fbc31e4d45773c8e45b4ded3ef8d83f8a::blub::BLUB",
318
320
  SCA: "0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA",
@@ -1678,13 +1680,14 @@ async function trySelfFunded(client, signer, tx) {
1678
1680
  const result = await client.executeTransactionBlock({
1679
1681
  transactionBlock: toBase64(builtBytes),
1680
1682
  signature: [signature],
1681
- options: { showEffects: true }
1683
+ options: { showEffects: true, showBalanceChanges: true }
1682
1684
  });
1683
1685
  await client.waitForTransaction({ digest: result.digest });
1684
1686
  await assertTxSuccess(result.effects, result.digest);
1685
1687
  return {
1686
1688
  digest: result.digest,
1687
1689
  effects: result.effects,
1690
+ balanceChanges: result.balanceChanges,
1688
1691
  gasMethod: "self-funded",
1689
1692
  gasCostSui: extractGasCost(result.effects),
1690
1693
  preTxSuiMist: suiBalance
@@ -1703,13 +1706,14 @@ async function tryAutoTopUpThenSelfFund(client, signer, buildTx) {
1703
1706
  const result = await client.executeTransactionBlock({
1704
1707
  transactionBlock: toBase64(builtBytes),
1705
1708
  signature: [signature],
1706
- options: { showEffects: true }
1709
+ options: { showEffects: true, showBalanceChanges: true }
1707
1710
  });
1708
1711
  await client.waitForTransaction({ digest: result.digest });
1709
1712
  await assertTxSuccess(result.effects, result.digest);
1710
1713
  return {
1711
1714
  digest: result.digest,
1712
1715
  effects: result.effects,
1716
+ balanceChanges: result.balanceChanges,
1713
1717
  gasMethod: "auto-topup",
1714
1718
  gasCostSui: extractGasCost(result.effects),
1715
1719
  preTxSuiMist: suiAfterTopUp
@@ -1733,7 +1737,7 @@ async function trySponsored(client, signer, tx) {
1733
1737
  const result = await client.executeTransactionBlock({
1734
1738
  transactionBlock: sponsoredResult.txBytes,
1735
1739
  signature: [agentSig, sponsoredResult.sponsorSignature],
1736
- options: { showEffects: true }
1740
+ options: { showEffects: true, showBalanceChanges: true }
1737
1741
  });
1738
1742
  await client.waitForTransaction({ digest: result.digest });
1739
1743
  await assertTxSuccess(result.effects, result.digest);
@@ -1742,6 +1746,7 @@ async function trySponsored(client, signer, tx) {
1742
1746
  return {
1743
1747
  digest: result.digest,
1744
1748
  effects: result.effects,
1749
+ balanceChanges: result.balanceChanges,
1745
1750
  gasMethod: "sponsored",
1746
1751
  gasCostSui: gasCost,
1747
1752
  preTxSuiMist: suiBalance
@@ -2347,13 +2352,23 @@ var T2000 = class _T2000 extends eventemitter3.EventEmitter {
2347
2352
  const toEntry = Object.entries(SUPPORTED_ASSETS).find(([, v]) => v.type === toType);
2348
2353
  const toDecimals = toEntry ? toEntry[1].decimals : toType === "0x2::sui::SUI" ? 9 : 6;
2349
2354
  const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;
2350
- const toAmount = Number(route.amountOut) / 10 ** toDecimals;
2355
+ let toAmount = Number(route.amountOut) / 10 ** toDecimals;
2356
+ const changes = gasResult.balanceChanges ?? [];
2357
+ const received = changes.find(
2358
+ (c) => c.coinType === toType && BigInt(c.amount) > 0n && c.owner.AddressOwner === this._address
2359
+ );
2360
+ if (received) {
2361
+ const actual = Number(BigInt(received.amount)) / 10 ** toDecimals;
2362
+ if (actual > 0) toAmount = actual;
2363
+ }
2364
+ const fromName = fromEntry ? fromEntry[0] : this._resolveTokenName(fromType, params.from);
2365
+ const toName = toEntry ? toEntry[0] : this._resolveTokenName(toType, params.to);
2351
2366
  const routeDesc = route.routerData.paths?.map((p) => p.provider).filter(Boolean).slice(0, 3).join(" + ") ?? "Cetus Aggregator";
2352
2367
  return {
2353
2368
  success: true,
2354
2369
  tx: gasResult.digest,
2355
- fromToken: params.from,
2356
- toToken: params.to,
2370
+ fromToken: fromName,
2371
+ toToken: toName,
2357
2372
  fromAmount,
2358
2373
  toAmount,
2359
2374
  priceImpact: route.priceImpact,
@@ -2758,6 +2773,12 @@ var T2000 = class _T2000 extends eventemitter3.EventEmitter {
2758
2773
  }
2759
2774
  return all;
2760
2775
  }
2776
+ _resolveTokenName(coinType, fallback) {
2777
+ const entry = Object.entries(SUPPORTED_ASSETS).find(([, v]) => v.type === coinType);
2778
+ if (entry) return entry[0];
2779
+ const suffix = coinType.split("::").pop();
2780
+ return suffix && suffix !== coinType ? suffix : fallback;
2781
+ }
2761
2782
  _mergeCoinsInTx(tx, coins) {
2762
2783
  if (coins.length === 0) throw new exports.T2000Error("INSUFFICIENT_BALANCE", "No coins to merge");
2763
2784
  const primary = tx.object(coins[0].coinObjectId);