@t2000/sdk 0.22.2 → 0.22.3
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.cjs +1 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/browser.cjs
CHANGED
|
@@ -645,7 +645,7 @@ var COIN_REGISTRY = {
|
|
|
645
645
|
SUI: { type: "0x2::sui::SUI", decimals: 9, symbol: "SUI", tier: 2 },
|
|
646
646
|
wBTC: { type: "0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC", decimals: 8, symbol: "wBTC", tier: 2 },
|
|
647
647
|
ETH: { type: "0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH", decimals: 8, symbol: "ETH", tier: 2 },
|
|
648
|
-
GOLD: { type: "0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM", decimals:
|
|
648
|
+
GOLD: { type: "0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM", decimals: 9, symbol: "GOLD", tier: 2 },
|
|
649
649
|
DEEP: { type: "0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP", decimals: 6, symbol: "DEEP", tier: 2 },
|
|
650
650
|
WAL: { type: "0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL", decimals: 9, symbol: "WAL", tier: 2 },
|
|
651
651
|
NS: { type: "0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS", decimals: 6, symbol: "NS", tier: 2 },
|
package/dist/browser.cjs.map
CHANGED
|
@@ -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","../src/token-registry.ts"],"names":["normalizeSuiAddress","isValidSuiAddress"],"mappings":"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","file":"browser.cjs","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 | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import { T2000Error } from './errors.js';\n\nexport const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\n// ---------------------------------------------------------------------------\n// Operation → allowed asset rules (single source of truth)\n// ---------------------------------------------------------------------------\n\nexport const OPERATION_ASSETS = {\n save: ['USDC'],\n borrow: ['USDC'],\n withdraw: '*',\n repay: '*',\n send: '*',\n swap: '*',\n} as const;\n\nexport type Operation = keyof typeof OPERATION_ASSETS;\n\nexport function isAllowedAsset(op: Operation, asset: string): boolean {\n const allowed = OPERATION_ASSETS[op];\n if (allowed === '*') return true;\n return (allowed as readonly string[]).includes(asset.toUpperCase());\n}\n\n/**\n * Throws if the asset is not permitted for the given operation.\n * Passing `undefined` (omitted) is always valid — defaults to USDC.\n */\nexport function assertAllowedAsset(op: Operation, asset: string | undefined): void {\n if (!asset) return;\n if (!isAllowedAsset(op, asset)) {\n const allowed = OPERATION_ASSETS[op];\n const list = Array.isArray(allowed) ? allowed.join(', ') : 'any';\n throw new T2000Error(\n 'INVALID_ASSET',\n `${op} only supports ${list}. Cannot use ${asset}.${op === 'save' ? ' Swap to USDC first.' : ''}`,\n );\n }\n}\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import 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","/**\n * Unified token registry — single source of truth for coin types, decimals, symbols, and tiers.\n *\n * ZERO heavy dependencies. Safe to import from any context (server, browser, Edge).\n *\n * Tier 1: USDC — the financial layer (save, borrow, receive, yield, allowances, marketplace, MPP).\n * Tier 2: 13 curated swap assets — hold, trade, and send only.\n * No tier: Legacy tokens kept for display accuracy (existing NAVI positions). No new operations.\n *\n * To add a new token: add ONE entry to COIN_REGISTRY below. Everything else derives from it.\n * Gate for Tier 2 addition: confirmed deep Cetus liquidity + clear user need.\n */\n\nexport interface CoinMeta {\n type: string;\n decimals: number;\n symbol: string;\n tier?: 1 | 2;\n}\n\n/**\n * Canonical coin registry.\n * Key = user-friendly name (used in swap_execute, CLI, prompts).\n */\nexport const COIN_REGISTRY: Record<string, CoinMeta> = {\n // ── Tier 1 — Financial layer ──────────────────────────────────────────\n USDC: { type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', decimals: 6, symbol: 'USDC', tier: 1 },\n\n // ── Tier 2 — Swap assets (13 tokens) ──────────────────────────────────\n SUI: { type: '0x2::sui::SUI', decimals: 9, symbol: 'SUI', tier: 2 },\n wBTC: { type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC', decimals: 8, symbol: 'wBTC', tier: 2 },\n ETH: { type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH', decimals: 8, symbol: 'ETH', tier: 2 },\n GOLD: { type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM', decimals: 6, symbol: 'GOLD', tier: 2 },\n DEEP: { type: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP', decimals: 6, symbol: 'DEEP', tier: 2 },\n WAL: { type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL', decimals: 9, symbol: 'WAL', tier: 2 },\n NS: { type: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS', decimals: 6, symbol: 'NS', tier: 2 },\n IKA: { type: '0x7262fb2f7a3a14c888c438a3cd9b912469a58cf60f367352c46584262e8299aa::ika::IKA', decimals: 9, symbol: 'IKA', tier: 2 },\n CETUS: { type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS', decimals: 9, symbol: 'CETUS', tier: 2 },\n NAVX: { type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX', decimals: 9, symbol: 'NAVX', tier: 2 },\n vSUI: { type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT', decimals: 9, symbol: 'vSUI', tier: 2 },\n LOFI: { type: '0xf22da9a24ad027cccb5f2d496cbe91de953d363513db08a3a734d361c7c17503::LOFI::LOFI', decimals: 9, symbol: 'LOFI', tier: 2 },\n MANIFEST: { type: '0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST', decimals: 9, symbol: 'MANIFEST', tier: 2 },\n\n // ── Legacy — no tier, kept for display accuracy on existing positions ──\n USDT: { type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT', decimals: 6, symbol: 'USDT' },\n USDe: { type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE', decimals: 6, symbol: 'USDe' },\n USDSUI: { type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI', decimals: 6, symbol: 'USDsui' },\n};\n\n/** Reverse lookup: coin type → CoinMeta. Built once at import time. */\nconst BY_TYPE = new Map<string, CoinMeta>();\nfor (const meta of Object.values(COIN_REGISTRY)) {\n BY_TYPE.set(meta.type, meta);\n}\n\n// ── Tier helpers ─────────────────────────────────────────────────────────\n\n/** Returns true if the coin type is Tier 1 (USDC — the financial layer). */\nexport function isTier1(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 1;\n}\n\n/** Returns true if the coin type is Tier 2 (curated swap asset). */\nexport function isTier2(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 2;\n}\n\n/** Returns true if the coin type is actively supported (Tier 1 or Tier 2). */\nexport function isSupported(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier !== undefined;\n}\n\n/** Returns the tier for a coin type, or undefined if legacy/unknown. */\nexport function getTier(coinType: string): 1 | 2 | undefined {\n return BY_TYPE.get(coinType)?.tier;\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Get decimals for any coin type. Checks full type match, then suffix match, then defaults to 9.\n * Works for both tiered and legacy tokens.\n */\nexport function getDecimalsForCoinType(coinType: string): number {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.decimals;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.decimals;\n }\n }\n\n return 9;\n}\n\n/**\n * Resolve a full coin type to a user-friendly symbol.\n * Returns the last `::` segment if not in the registry.\n */\nexport function resolveSymbol(coinType: string): string {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.symbol;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.symbol;\n }\n }\n\n return coinType.split('::').pop() ?? coinType;\n}\n\n/**\n * Name → type map for swap resolution. Derived from COIN_REGISTRY.\n * Contains BOTH original-case and UPPERCASE keys for case-insensitive lookup.\n */\nexport const TOKEN_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const [name, meta] of Object.entries(COIN_REGISTRY)) {\n map[name] = meta.type;\n map[name.toUpperCase()] = meta.type;\n }\n return map;\n})();\n\n/**\n * Resolve a user-friendly token name to its full coin type.\n * Returns the input unchanged if already a full coin type (contains \"::\").\n * Case-insensitive: 'usde', 'USDe', 'USDE' all resolve correctly.\n */\nexport function resolveTokenType(nameOrType: string): string | null {\n if (nameOrType.includes('::')) return nameOrType;\n return TOKEN_MAP[nameOrType] ?? TOKEN_MAP[nameOrType.toUpperCase()] ?? null;\n}\n\n/** Common type constants for direct import. */\nexport const SUI_TYPE = COIN_REGISTRY.SUI.type;\nexport const USDC_TYPE = COIN_REGISTRY.USDC.type;\nexport const USDT_TYPE = COIN_REGISTRY.USDT.type;\nexport const USDSUI_TYPE = COIN_REGISTRY.USDSUI.type;\nexport const USDE_TYPE = COIN_REGISTRY.USDe.type;\nexport const ETH_TYPE = COIN_REGISTRY.ETH.type;\nexport const WBTC_TYPE = COIN_REGISTRY.wBTC.type;\nexport const WAL_TYPE = COIN_REGISTRY.WAL.type;\nexport const NAVX_TYPE = COIN_REGISTRY.NAVX.type;\nexport const IKA_TYPE = COIN_REGISTRY.IKA.type;\nexport const LOFI_TYPE = COIN_REGISTRY.LOFI.type;\nexport const MANIFEST_TYPE = COIN_REGISTRY.MANIFEST.type;\n"]}
|
|
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","../src/token-registry.ts"],"names":["normalizeSuiAddress","isValidSuiAddress"],"mappings":"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","file":"browser.cjs","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 | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import { T2000Error } from './errors.js';\n\nexport const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\n// ---------------------------------------------------------------------------\n// Operation → allowed asset rules (single source of truth)\n// ---------------------------------------------------------------------------\n\nexport const OPERATION_ASSETS = {\n save: ['USDC'],\n borrow: ['USDC'],\n withdraw: '*',\n repay: '*',\n send: '*',\n swap: '*',\n} as const;\n\nexport type Operation = keyof typeof OPERATION_ASSETS;\n\nexport function isAllowedAsset(op: Operation, asset: string): boolean {\n const allowed = OPERATION_ASSETS[op];\n if (allowed === '*') return true;\n return (allowed as readonly string[]).includes(asset.toUpperCase());\n}\n\n/**\n * Throws if the asset is not permitted for the given operation.\n * Passing `undefined` (omitted) is always valid — defaults to USDC.\n */\nexport function assertAllowedAsset(op: Operation, asset: string | undefined): void {\n if (!asset) return;\n if (!isAllowedAsset(op, asset)) {\n const allowed = OPERATION_ASSETS[op];\n const list = Array.isArray(allowed) ? allowed.join(', ') : 'any';\n throw new T2000Error(\n 'INVALID_ASSET',\n `${op} only supports ${list}. Cannot use ${asset}.${op === 'save' ? ' Swap to USDC first.' : ''}`,\n );\n }\n}\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import 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","/**\n * Unified token registry — single source of truth for coin types, decimals, symbols, and tiers.\n *\n * ZERO heavy dependencies. Safe to import from any context (server, browser, Edge).\n *\n * Tier 1: USDC — the financial layer (save, borrow, receive, yield, allowances, marketplace, MPP).\n * Tier 2: 13 curated swap assets — hold, trade, and send only.\n * No tier: Legacy tokens kept for display accuracy (existing NAVI positions). No new operations.\n *\n * To add a new token: add ONE entry to COIN_REGISTRY below. Everything else derives from it.\n * Gate for Tier 2 addition: confirmed deep Cetus liquidity + clear user need.\n */\n\nexport interface CoinMeta {\n type: string;\n decimals: number;\n symbol: string;\n tier?: 1 | 2;\n}\n\n/**\n * Canonical coin registry.\n * Key = user-friendly name (used in swap_execute, CLI, prompts).\n */\nexport const COIN_REGISTRY: Record<string, CoinMeta> = {\n // ── Tier 1 — Financial layer ──────────────────────────────────────────\n USDC: { type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', decimals: 6, symbol: 'USDC', tier: 1 },\n\n // ── Tier 2 — Swap assets (13 tokens) ──────────────────────────────────\n SUI: { type: '0x2::sui::SUI', decimals: 9, symbol: 'SUI', tier: 2 },\n wBTC: { type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC', decimals: 8, symbol: 'wBTC', tier: 2 },\n ETH: { type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH', decimals: 8, symbol: 'ETH', tier: 2 },\n GOLD: { type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM', decimals: 9, symbol: 'GOLD', tier: 2 },\n DEEP: { type: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP', decimals: 6, symbol: 'DEEP', tier: 2 },\n WAL: { type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL', decimals: 9, symbol: 'WAL', tier: 2 },\n NS: { type: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS', decimals: 6, symbol: 'NS', tier: 2 },\n IKA: { type: '0x7262fb2f7a3a14c888c438a3cd9b912469a58cf60f367352c46584262e8299aa::ika::IKA', decimals: 9, symbol: 'IKA', tier: 2 },\n CETUS: { type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS', decimals: 9, symbol: 'CETUS', tier: 2 },\n NAVX: { type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX', decimals: 9, symbol: 'NAVX', tier: 2 },\n vSUI: { type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT', decimals: 9, symbol: 'vSUI', tier: 2 },\n LOFI: { type: '0xf22da9a24ad027cccb5f2d496cbe91de953d363513db08a3a734d361c7c17503::LOFI::LOFI', decimals: 9, symbol: 'LOFI', tier: 2 },\n MANIFEST: { type: '0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST', decimals: 9, symbol: 'MANIFEST', tier: 2 },\n\n // ── Legacy — no tier, kept for display accuracy on existing positions ──\n USDT: { type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT', decimals: 6, symbol: 'USDT' },\n USDe: { type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE', decimals: 6, symbol: 'USDe' },\n USDSUI: { type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI', decimals: 6, symbol: 'USDsui' },\n};\n\n/** Reverse lookup: coin type → CoinMeta. Built once at import time. */\nconst BY_TYPE = new Map<string, CoinMeta>();\nfor (const meta of Object.values(COIN_REGISTRY)) {\n BY_TYPE.set(meta.type, meta);\n}\n\n// ── Tier helpers ─────────────────────────────────────────────────────────\n\n/** Returns true if the coin type is Tier 1 (USDC — the financial layer). */\nexport function isTier1(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 1;\n}\n\n/** Returns true if the coin type is Tier 2 (curated swap asset). */\nexport function isTier2(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 2;\n}\n\n/** Returns true if the coin type is actively supported (Tier 1 or Tier 2). */\nexport function isSupported(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier !== undefined;\n}\n\n/** Returns the tier for a coin type, or undefined if legacy/unknown. */\nexport function getTier(coinType: string): 1 | 2 | undefined {\n return BY_TYPE.get(coinType)?.tier;\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Get decimals for any coin type. Checks full type match, then suffix match, then defaults to 9.\n * Works for both tiered and legacy tokens.\n */\nexport function getDecimalsForCoinType(coinType: string): number {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.decimals;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.decimals;\n }\n }\n\n return 9;\n}\n\n/**\n * Resolve a full coin type to a user-friendly symbol.\n * Returns the last `::` segment if not in the registry.\n */\nexport function resolveSymbol(coinType: string): string {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.symbol;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.symbol;\n }\n }\n\n return coinType.split('::').pop() ?? coinType;\n}\n\n/**\n * Name → type map for swap resolution. Derived from COIN_REGISTRY.\n * Contains BOTH original-case and UPPERCASE keys for case-insensitive lookup.\n */\nexport const TOKEN_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const [name, meta] of Object.entries(COIN_REGISTRY)) {\n map[name] = meta.type;\n map[name.toUpperCase()] = meta.type;\n }\n return map;\n})();\n\n/**\n * Resolve a user-friendly token name to its full coin type.\n * Returns the input unchanged if already a full coin type (contains \"::\").\n * Case-insensitive: 'usde', 'USDe', 'USDE' all resolve correctly.\n */\nexport function resolveTokenType(nameOrType: string): string | null {\n if (nameOrType.includes('::')) return nameOrType;\n return TOKEN_MAP[nameOrType] ?? TOKEN_MAP[nameOrType.toUpperCase()] ?? null;\n}\n\n/** Common type constants for direct import. */\nexport const SUI_TYPE = COIN_REGISTRY.SUI.type;\nexport const USDC_TYPE = COIN_REGISTRY.USDC.type;\nexport const USDT_TYPE = COIN_REGISTRY.USDT.type;\nexport const USDSUI_TYPE = COIN_REGISTRY.USDSUI.type;\nexport const USDE_TYPE = COIN_REGISTRY.USDe.type;\nexport const ETH_TYPE = COIN_REGISTRY.ETH.type;\nexport const WBTC_TYPE = COIN_REGISTRY.wBTC.type;\nexport const WAL_TYPE = COIN_REGISTRY.WAL.type;\nexport const NAVX_TYPE = COIN_REGISTRY.NAVX.type;\nexport const IKA_TYPE = COIN_REGISTRY.IKA.type;\nexport const LOFI_TYPE = COIN_REGISTRY.LOFI.type;\nexport const MANIFEST_TYPE = COIN_REGISTRY.MANIFEST.type;\n"]}
|
package/dist/browser.js
CHANGED
|
@@ -643,7 +643,7 @@ var COIN_REGISTRY = {
|
|
|
643
643
|
SUI: { type: "0x2::sui::SUI", decimals: 9, symbol: "SUI", tier: 2 },
|
|
644
644
|
wBTC: { type: "0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC", decimals: 8, symbol: "wBTC", tier: 2 },
|
|
645
645
|
ETH: { type: "0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH", decimals: 8, symbol: "ETH", tier: 2 },
|
|
646
|
-
GOLD: { type: "0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM", decimals:
|
|
646
|
+
GOLD: { type: "0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM", decimals: 9, symbol: "GOLD", tier: 2 },
|
|
647
647
|
DEEP: { type: "0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP", decimals: 6, symbol: "DEEP", tier: 2 },
|
|
648
648
|
WAL: { type: "0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL", decimals: 9, symbol: "WAL", tier: 2 },
|
|
649
649
|
NS: { type: "0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS", decimals: 6, symbol: "NS", tier: 2 },
|