@one_deploy/sdk 1.2.0 → 1.2.2

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.
Files changed (43) hide show
  1. package/dist/{ForexPoolDataGenerator--__twRwl.d.mts → ForexPoolDataGenerator-JxTPpJPz.d.mts} +1 -1
  2. package/dist/{ForexPoolDataGenerator-eUgwsU_B.d.ts → ForexPoolDataGenerator-qwWv6sCE.d.ts} +1 -1
  3. package/dist/{OneForexTradeHistory-TlKxjbFF.d.ts → OneForexTradeHistory-BE4rJH5t.d.ts} +1 -1
  4. package/dist/{OneForexTradeHistory-iDySMcw0.d.mts → OneForexTradeHistory-DbuHXRy0.d.mts} +1 -1
  5. package/dist/components/index.d.mts +2 -2
  6. package/dist/components/index.d.ts +2 -2
  7. package/dist/config/index.d.mts +1 -1
  8. package/dist/config/index.d.ts +1 -1
  9. package/dist/{console-BfTMA7ah.d.mts → console-Dvf-N9Gr.d.mts} +7 -0
  10. package/dist/{console-BfTMA7ah.d.ts → console-Dvf-N9Gr.d.ts} +7 -0
  11. package/dist/hooks/index.d.mts +2 -2
  12. package/dist/hooks/index.d.ts +2 -2
  13. package/dist/hooks/index.js +399 -38
  14. package/dist/hooks/index.js.map +1 -1
  15. package/dist/hooks/index.mjs +399 -38
  16. package/dist/hooks/index.mjs.map +1 -1
  17. package/dist/index.d.mts +4 -4
  18. package/dist/index.d.ts +4 -4
  19. package/dist/index.js +399 -38
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +399 -38
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/providers/index.d.mts +1 -1
  24. package/dist/providers/index.d.ts +1 -1
  25. package/dist/react-native.d.mts +4 -4
  26. package/dist/react-native.d.ts +4 -4
  27. package/dist/react-native.js +239 -36
  28. package/dist/react-native.js.map +1 -1
  29. package/dist/react-native.mjs +239 -36
  30. package/dist/react-native.mjs.map +1 -1
  31. package/dist/services/index.d.mts +2 -2
  32. package/dist/services/index.d.ts +2 -2
  33. package/dist/services/index.js +239 -36
  34. package/dist/services/index.js.map +1 -1
  35. package/dist/services/index.mjs +239 -36
  36. package/dist/services/index.mjs.map +1 -1
  37. package/dist/types/index.d.mts +1 -1
  38. package/dist/types/index.d.ts +1 -1
  39. package/dist/{useForexTrading-ZgW_G40Q.d.ts → useForexTrading-CA2DPQVf.d.ts} +1 -1
  40. package/dist/{useForexTrading-BleeSor8.d.mts → useForexTrading-I7nIQyog.d.mts} +1 -1
  41. package/package.json +1 -1
  42. package/src/services/forex/BotSimulationEngine.ts +463 -35
  43. package/src/services/forex/index.ts +12 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/forex.ts","../../src/services/forex/ForexPoolDataGenerator.ts","../../src/config/index.ts","../../src/services/engine.ts","../../src/services/supabase.ts","../../src/services/price.ts","../../src/services/usage.ts","../../src/services/forex/ForexSimulationEngine.ts","../../src/services/forex/index.ts","../../src/services/forex/BotSimulationEngine.ts"],"names":["config","genId","rand","randInt","pick","ForexPoolDataGenerator","idCounter"],"mappings":"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","file":"index.mjs","sourcesContent":["// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - StableFX On-Chain Forex Types & Constants\n// Shared types for stablecoin foreign exchange pool trading\n// ══════════════════════════════════════════════════════════════════════════════\n\n// ── Capital Split ────────────────────────────────────────────────────────────\n\nexport const FOREX_CAPITAL_SPLIT = {\n poolReserves: 0.50,\n tradingCapital: 0.50,\n} as const;\n\nexport function computePoolAllocations(amount: number): {\n tradingCapital: number;\n totalPoolReserves: number;\n clearing: number;\n hedging: number;\n insurance: number;\n} {\n const totalPoolReserves = amount * FOREX_CAPITAL_SPLIT.poolReserves;\n const tradingCapital = amount * FOREX_CAPITAL_SPLIT.tradingCapital;\n return {\n tradingCapital,\n totalPoolReserves,\n clearing: totalPoolReserves * 0.50,\n hedging: totalPoolReserves * 0.30,\n insurance: totalPoolReserves * 0.20,\n };\n}\n\n// ── Cycle Options ────────────────────────────────────────────────────────────\n\nexport interface ForexCycleOption {\n days: number;\n feeRate: number;\n commissionRate: number;\n label: string;\n}\n\nexport const FOREX_CYCLE_OPTIONS: ForexCycleOption[] = [\n { days: 30, feeRate: 0.10, commissionRate: 0.60, label: '30D' },\n { days: 60, feeRate: 0.08, commissionRate: 0.70, label: '60D' },\n { days: 90, feeRate: 0.07, commissionRate: 0.75, label: '90D' },\n { days: 180, feeRate: 0.05, commissionRate: 0.85, label: '180D' },\n { days: 360, feeRate: 0.03, commissionRate: 0.90, label: '360D' },\n];\n\n// ── Currency Pairs ───────────────────────────────────────────────────────────\n\nexport interface ForexCurrencyPair {\n id: string;\n base: string;\n quote: string;\n symbol: string;\n flag: string;\n name: string;\n basePrice: number;\n pipSize: number;\n spreadPips: number;\n}\n\nexport const FOREX_CURRENCY_PAIRS: ForexCurrencyPair[] = [\n { id: 'USDC_EURC', base: 'USDC', quote: 'EURC', symbol: 'USDC/EURC', flag: '\\u{1F1EA}\\u{1F1FA}', name: 'Euro', basePrice: 0.9230, pipSize: 0.0001, spreadPips: 1.2 },\n { id: 'USDC_GBPC', base: 'USDC', quote: 'GBPC', symbol: 'USDC/GBPC', flag: '\\u{1F1EC}\\u{1F1E7}', name: 'British Pound', basePrice: 0.7890, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_JPYC', base: 'USDC', quote: 'JPYC', symbol: 'USDC/JPYC', flag: '\\u{1F1EF}\\u{1F1F5}', name: 'Japanese Yen', basePrice: 154.50, pipSize: 0.01, spreadPips: 1.0 },\n { id: 'USDC_AUDC', base: 'USDC', quote: 'AUDC', symbol: 'USDC/AUDC', flag: '\\u{1F1E6}\\u{1F1FA}', name: 'Australian Dollar', basePrice: 1.5380, pipSize: 0.0001, spreadPips: 1.8 },\n { id: 'USDC_CADC', base: 'USDC', quote: 'CADC', symbol: 'USDC/CADC', flag: '\\u{1F1E8}\\u{1F1E6}', name: 'Canadian Dollar', basePrice: 1.3640, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_CHFC', base: 'USDC', quote: 'CHFC', symbol: 'USDC/CHFC', flag: '\\u{1F1E8}\\u{1F1ED}', name: 'Swiss Franc', basePrice: 0.8750, pipSize: 0.0001, spreadPips: 1.3 },\n];\n\n// ── Pools ────────────────────────────────────────────────────────────────────\n\nexport type ForexPoolType = 'clearing' | 'hedging' | 'insurance';\n\nexport interface ForexPool {\n id: ForexPoolType;\n nameKey: string;\n descriptionKey: string;\n allocation: number;\n totalSize: number;\n utilization: number;\n color: string;\n apy7d: number;\n apy30d: number;\n netFlow24h: number;\n txCount24h: number;\n txCountTotal: number;\n totalDeposits: number;\n totalWithdrawals: number;\n profitDistributed: number;\n lastUpdated: number;\n}\n\nexport const FOREX_POOL_DEFAULTS: ForexPool[] = [\n { id: 'clearing', nameKey: 'forex.pool_clearing', descriptionKey: 'forex.pool_clearing_desc', allocation: 0.50, totalSize: 12500000, utilization: 0.78, color: '#3B82F6', apy7d: 12.8, apy30d: 11.5, netFlow24h: 185000, txCount24h: 42, txCountTotal: 12840, totalDeposits: 45200000, totalWithdrawals: 32700000, profitDistributed: 1850000, lastUpdated: Date.now() },\n { id: 'hedging', nameKey: 'forex.pool_hedging', descriptionKey: 'forex.pool_hedging_desc', allocation: 0.30, totalSize: 7500000, utilization: 0.65, color: '#F59E0B', apy7d: 8.1, apy30d: 7.6, netFlow24h: 72000, txCount24h: 24, txCountTotal: 7620, totalDeposits: 28500000, totalWithdrawals: 21000000, profitDistributed: 980000, lastUpdated: Date.now() },\n { id: 'insurance', nameKey: 'forex.pool_insurance', descriptionKey: 'forex.pool_insurance_desc', allocation: 0.20, totalSize: 5000000, utilization: 0.42, color: '#10B981', apy7d: 4.8, apy30d: 4.5, netFlow24h: 35000, txCount24h: 14, txCountTotal: 4280, totalDeposits: 15800000, totalWithdrawals: 10800000, profitDistributed: 520000, lastUpdated: Date.now() },\n];\n\n// ── Pool Transactions ────────────────────────────────────────────────────────\n\nexport type ForexPoolTransactionType =\n | 'deposit' | 'withdrawal' | 'profit_distribution'\n | 'loss_absorption' | 'inter_pool_transfer' | 'fee_collection' | 'reserve_rebalance';\n\nexport interface ForexPoolTransaction {\n id: string;\n poolId: ForexPoolType;\n type: ForexPoolTransactionType;\n amount: number;\n balanceBefore: number;\n balanceAfter: number;\n txHash: string;\n blockNumber: number;\n timestamp: number;\n description: string;\n}\n\n// ── Pool Daily Snapshots ────────────────────────────────────────────────────\n\nexport interface ForexPoolDailySnapshot {\n poolId: ForexPoolType;\n date: string;\n openBalance: number;\n closeBalance: number;\n deposits: number;\n withdrawals: number;\n netFlow: number;\n dailyPnl: number;\n dailyPnlPct: number;\n cumulativePnl: number;\n utilization: number;\n txCount: number;\n activeUsers: number;\n}\n\n// ── Positions ────────────────────────────────────────────────────────────────\n\nexport interface ForexPosition {\n id: string;\n pairId: string;\n side: 'BUY' | 'SELL';\n lots: number;\n pips: number;\n entryPrice: number;\n currentPrice: number;\n pnl: number;\n openTime: number;\n}\n\n// ── Investment ───────────────────────────────────────────────────────────────\n\nexport interface ForexInvestment {\n id: string;\n userId?: string;\n amount: number;\n currentValue: number;\n profit: number;\n status: 'active' | 'completed' | 'pending' | 'redeemed' | 'cancelled';\n selectedPairs: string[];\n cycleDays: number;\n cycleOption: ForexCycleOption;\n feeRate?: number;\n commissionRate?: number;\n startDate: string;\n endDate: string;\n tradingCapital: number;\n totalPoolReserves: number;\n poolAllocations: {\n clearing: number;\n hedging: number;\n insurance: number;\n };\n tradeWeight: number;\n totalLots: number;\n totalPips: number;\n totalTrades: number;\n positions: ForexPosition[];\n tradeHistory: ForexTradeRecord[];\n redeemedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// ── Trade Records ────────────────────────────────────────────────────────────\n\nexport type ForexTradeStatus = 'RFQ' | 'QUOTED' | 'MATCHED' | 'SETTLED' | 'FAILED';\n\nexport interface ForexTradeRecord {\n id: string;\n timestamp: number;\n pairId: string;\n pairSymbol: string;\n side: 'BUY' | 'SELL';\n rfqPrice: number;\n quotePrice: number;\n matchPrice: number;\n settlePrice: number;\n lots: number;\n pips: number;\n pnl: number;\n status: ForexTradeStatus;\n pvpSettled: boolean;\n clearingFee?: number;\n hedgingCost?: number;\n insuranceReserve?: number;\n txHash?: string;\n blockNumber?: number;\n cycleDay?: number;\n cumulativePnl?: number;\n}\n\n// ── Console Log Types ────────────────────────────────────────────────────────\n\nexport type ForexLogType =\n | 'RFQ' | 'QUOTE' | 'MATCH' | 'SETTLE' | 'PVP'\n | 'HEDGE' | 'CLEAR' | 'POSITION' | 'PNL' | 'SYSTEM';\n\nexport interface ForexLogEntry {\n id: string;\n timestamp: number;\n type: ForexLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n pairId?: string;\n}\n\n// ── Agent ────────────────────────────────────────────────────────────────────\n\nexport interface ForexAgent {\n id: string;\n nameKey: string;\n descriptionKey: string;\n icon: string;\n color: string;\n supportedPairs: string[];\n dailyRoiMin: number;\n dailyRoiMax: number;\n totalManaged: number;\n totalUsers: number;\n winRate: number;\n}\n\nexport const FOREX_AGENT: ForexAgent = {\n id: 'stablefx-01',\n nameKey: 'forex.agent_name',\n descriptionKey: 'forex.agent_description',\n icon: '\\u{1F4B1}',\n color: '#0EA5E9',\n supportedPairs: FOREX_CURRENCY_PAIRS.map(p => p.id),\n dailyRoiMin: 0.002,\n dailyRoiMax: 0.005,\n totalManaged: 25000000,\n totalUsers: 3847,\n winRate: 72.5,\n};\n\n// ── Profit Calculation ───────────────────────────────────────────────────────\n\nexport function calculateForexNetProfit(\n grossProfit: number,\n cycleOption: ForexCycleOption,\n): { feeAmount: number; postFeeProfit: number; netProfit: number } {\n const feeAmount = grossProfit * cycleOption.feeRate;\n const postFeeProfit = grossProfit - feeAmount;\n const netProfit = postFeeProfit * cycleOption.commissionRate;\n return { feeAmount, postFeeProfit, netProfit };\n}\n\nexport function estimateForexProfit(\n amount: number,\n cycleDays: number,\n agent: ForexAgent = FOREX_AGENT,\n): { grossProfit: number; feeAmount: number; netProfit: number; dailyRate: number } {\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[0];\n const estimatedApy = ((agent.dailyRoiMin + agent.dailyRoiMax) / 2) * 365 * 100;\n const dailyRate = estimatedApy / 100 / 365;\n const grossProfit = amount * dailyRate * cycleDays;\n const { feeAmount, netProfit } = calculateForexNetProfit(grossProfit, cycleOption);\n return { grossProfit, feeAmount, netProfit, dailyRate };\n}\n","// ForexPoolDataGenerator.ts - Generates historical pool snapshots, transactions, and trade history\n// Singleton service following existing pattern (like ForexSimulationEngine)\n\nimport type {\n ForexPoolType,\n ForexPoolDailySnapshot,\n ForexPoolTransaction,\n ForexPoolTransactionType,\n ForexTradeRecord,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS, FOREX_POOL_DEFAULTS, FOREX_AGENT } from '../../types/forex';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction genTxHash(): string {\n const chars = '0123456789abcdef';\n let hash = '0x';\n for (let i = 0; i < 64; i++) hash += chars[Math.floor(Math.random() * 16)];\n return hash;\n}\n\nfunction formatDate(d: Date): string {\n return d.toISOString().split('T')[0];\n}\n\nlet _idCounter = 0;\nfunction genId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${(++_idCounter).toString(36)}`;\n}\n\n// ── Pool Parameters ──────────────────────────────────────────────────────────\n\ninterface PoolParams {\n meanDailyPnlPct: number;\n stddevPnlPct: number;\n utilizationMin: number;\n utilizationMax: number;\n depositsPerDay: [number, number];\n withdrawalsPerDay: [number, number];\n profitDistPerDay: number;\n avgDepositSize: number;\n avgWithdrawalSize: number;\n}\n\nconst POOL_PARAMS: Record<ForexPoolType, PoolParams> = {\n clearing: {\n meanDailyPnlPct: 0.00035,\n stddevPnlPct: 0.00015,\n utilizationMin: 0.70,\n utilizationMax: 0.85,\n depositsPerDay: [15, 25],\n withdrawalsPerDay: [8, 12],\n profitDistPerDay: 5,\n avgDepositSize: 25000,\n avgWithdrawalSize: 18000,\n },\n hedging: {\n meanDailyPnlPct: 0.00022,\n stddevPnlPct: 0.00020,\n utilizationMin: 0.55,\n utilizationMax: 0.75,\n depositsPerDay: [8, 15],\n withdrawalsPerDay: [5, 8],\n profitDistPerDay: 3,\n avgDepositSize: 18000,\n avgWithdrawalSize: 12000,\n },\n insurance: {\n meanDailyPnlPct: 0.00013,\n stddevPnlPct: 0.00008,\n utilizationMin: 0.30,\n utilizationMax: 0.50,\n depositsPerDay: [5, 10],\n withdrawalsPerDay: [3, 5],\n profitDistPerDay: 2,\n avgDepositSize: 12000,\n avgWithdrawalSize: 8000,\n },\n};\n\n// ── Generator Class ──────────────────────────────────────────────────────────\n\nclass ForexPoolDataGeneratorClass {\n private snapshotCache: Record<ForexPoolType, ForexPoolDailySnapshot[]> | null = null;\n private transactionCache: ForexPoolTransaction[] | null = null;\n private baseBlockNumber = 19_500_000;\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n generateAllSnapshots(): Record<ForexPoolType, ForexPoolDailySnapshot[]> {\n if (this.snapshotCache) return this.snapshotCache;\n\n const result: Record<ForexPoolType, ForexPoolDailySnapshot[]> = {\n clearing: [],\n hedging: [],\n insurance: [],\n };\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n result[pool.id] = this.generatePoolSnapshots(pool.id, pool.totalSize);\n }\n\n this.snapshotCache = result;\n return result;\n }\n\n generateAllTransactions(): ForexPoolTransaction[] {\n if (this.transactionCache) return this.transactionCache;\n\n const allTx: ForexPoolTransaction[] = [];\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n const snapshots = this.snapshotCache?.[pool.id] || this.generatePoolSnapshots(pool.id, pool.totalSize);\n const txs = this.generatePoolTransactions(pool.id, snapshots);\n allTx.push(...txs);\n }\n\n // Add inter-pool transfers (~2-3/week = ~17-26 over 60 days)\n const now = new Date();\n for (let i = 0; i < 60; i++) {\n const day = new Date(now);\n day.setDate(day.getDate() - (60 - i));\n const dayOfWeek = day.getDay();\n\n // Inter-pool transfers: ~2-3 per week\n if (dayOfWeek === 2 || dayOfWeek === 4 || (dayOfWeek === 5 && Math.random() < 0.4)) {\n const fromPool = pick(['clearing', 'hedging', 'insurance'] as ForexPoolType[]);\n const toOptions = (['clearing', 'hedging', 'insurance'] as ForexPoolType[]).filter(p => p !== fromPool);\n const toPool = pick(toOptions);\n const amount = rand(50000, 200000);\n const ts = day.getTime() + randInt(10, 18) * 3600000;\n\n allTx.push({\n id: genId('ipt'),\n poolId: fromPool,\n type: 'inter_pool_transfer',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(0, 100),\n timestamp: ts,\n description: `Transfer to ${toPool} pool`,\n });\n\n allTx.push({\n id: genId('ipt'),\n poolId: toPool,\n type: 'inter_pool_transfer',\n amount: amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(100, 200),\n timestamp: ts + 5000,\n description: `Transfer from ${fromPool} pool`,\n });\n }\n\n // Reserve rebalance: ~1/week\n if (dayOfWeek === 3 && Math.random() < 0.85) {\n const pool = pick(FOREX_POOL_DEFAULTS);\n const rebalanceAmt = rand(20000, 100000);\n const ts = day.getTime() + randInt(2, 6) * 3600000;\n allTx.push({\n id: genId('rrb'),\n poolId: pool.id,\n type: 'reserve_rebalance',\n amount: Math.random() < 0.5 ? rebalanceAmt : -rebalanceAmt,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(200, 300),\n timestamp: ts,\n description: 'Automated reserve rebalance',\n });\n }\n }\n\n // Sort all transactions by timestamp\n allTx.sort((a, b) => a.timestamp - b.timestamp);\n\n // Assign running balances per pool\n const runningBalance: Record<ForexPoolType, number> = {\n clearing: FOREX_POOL_DEFAULTS[0].totalSize * 0.85,\n hedging: FOREX_POOL_DEFAULTS[1].totalSize * 0.82,\n insurance: FOREX_POOL_DEFAULTS[2].totalSize * 0.88,\n };\n\n for (const tx of allTx) {\n tx.balanceBefore = runningBalance[tx.poolId];\n runningBalance[tx.poolId] += tx.amount;\n tx.balanceAfter = runningBalance[tx.poolId];\n }\n\n this.transactionCache = allTx;\n return allTx;\n }\n\n generateTradeHistory(\n investmentAmount: number,\n startDate: string,\n selectedPairs: string[],\n ): ForexTradeRecord[] {\n const trades: ForexTradeRecord[] = [];\n const start = new Date(startDate);\n const now = new Date();\n const dayCount = Math.min(60, Math.ceil((now.getTime() - start.getTime()) / 86400000));\n let cumulativePnl = 0;\n let blockNum = this.baseBlockNumber + randInt(0, 5000);\n\n for (let d = 0; d < dayCount; d++) {\n const day = new Date(start);\n day.setDate(day.getDate() + d);\n const dayOfWeek = day.getDay();\n\n // Fewer trades on weekends\n const baseCount = (dayOfWeek === 0 || dayOfWeek === 6) ? randInt(1, 2) : randInt(3, 8);\n\n for (let t = 0; t < baseCount; t++) {\n const pair = FOREX_CURRENCY_PAIRS.find(p => p.id === pick(selectedPairs)) || pick(FOREX_CURRENCY_PAIRS);\n const side: 'BUY' | 'SELL' = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat(rand(0.1, 2.5).toFixed(2));\n const rfqPrice = pair.basePrice * (1 + rand(-0.003, 0.003));\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY' ? rfqPrice + quoteSpread : rfqPrice - quoteSpread;\n\n // 85% match rate\n const matched = Math.random() < 0.85;\n if (!matched) continue;\n\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - rfqPrice) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n // Win rate matching FOREX_AGENT\n const isWin = Math.random() < (FOREX_AGENT.winRate / 100);\n const finalPnl = isWin ? Math.abs(pnl) : -Math.abs(pnl) * rand(0.3, 0.8);\n cumulativePnl += finalPnl;\n\n const clearingFee = Math.abs(finalPnl) * rand(0.001, 0.003);\n const hedgingCost = Math.abs(finalPnl) * rand(0.0005, 0.002);\n const insuranceReserve = Math.abs(finalPnl) * rand(0.0003, 0.001);\n\n blockNum += randInt(1, 20);\n const timestamp = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n\n trades.push({\n id: genId('FXT'),\n timestamp,\n pairId: pair.id,\n pairSymbol: pair.symbol,\n side,\n rfqPrice,\n quotePrice,\n matchPrice,\n settlePrice,\n lots,\n pips: isWin ? Math.abs(pips) : -Math.abs(pips) * rand(0.3, 0.8),\n pnl: finalPnl,\n status: 'SETTLED',\n pvpSettled: true,\n clearingFee,\n hedgingCost,\n insuranceReserve,\n txHash: genTxHash(),\n blockNumber: blockNum,\n cycleDay: d + 1,\n cumulativePnl,\n });\n }\n }\n\n trades.sort((a, b) => a.timestamp - b.timestamp);\n return trades;\n }\n\n generateLiveTransaction(\n poolId: ForexPoolType,\n type: ForexPoolTransactionType,\n baseAmount?: number,\n ): ForexPoolTransaction {\n const params = POOL_PARAMS[poolId];\n let amount: number;\n\n switch (type) {\n case 'deposit':\n amount = baseAmount ?? rand(params.avgDepositSize * 0.5, params.avgDepositSize * 1.5);\n break;\n case 'withdrawal':\n amount = -(baseAmount ?? rand(params.avgWithdrawalSize * 0.5, params.avgWithdrawalSize * 1.5));\n break;\n case 'profit_distribution':\n amount = baseAmount ?? rand(500, 5000);\n break;\n case 'fee_collection':\n amount = baseAmount ?? rand(100, 2000);\n break;\n case 'loss_absorption':\n amount = -(baseAmount ?? rand(200, 3000));\n break;\n default:\n amount = baseAmount ?? rand(-5000, 5000);\n }\n\n const pool = FOREX_POOL_DEFAULTS.find(p => p.id === poolId)!;\n const balanceBefore = pool.totalSize;\n\n return {\n id: genId('ptx'),\n poolId,\n type,\n amount,\n balanceBefore,\n balanceAfter: balanceBefore + amount,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(Date.now() / 12000),\n timestamp: Date.now(),\n description: this.getTxDescription(type, poolId, Math.abs(amount)),\n };\n }\n\n // ── Private Methods ────────────────────────────────────────────────────\n\n private generatePoolSnapshots(\n poolId: ForexPoolType,\n currentSize: number,\n ): ForexPoolDailySnapshot[] {\n const params = POOL_PARAMS[poolId];\n const snapshots: ForexPoolDailySnapshot[] = [];\n const now = new Date();\n\n // Work backward: start with a smaller balance 60 days ago\n let balance = currentSize * rand(0.82, 0.88);\n let cumulativePnl = 0;\n\n for (let i = 59; i >= 0; i--) {\n const day = new Date(now);\n day.setDate(day.getDate() - i);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n\n const openBalance = balance;\n\n // Weekend activity ~20% of weekday\n const activityMultiplier = isWeekend ? 0.2 : 1.0;\n\n // Daily PnL with occasional drawdowns (1-2 per week)\n const isDrawdown = !isWeekend && Math.random() < 0.2; // ~1.4/week\n let dailyPnlPct: number;\n if (isDrawdown) {\n dailyPnlPct = -rand(0.0001, params.stddevPnlPct * 2);\n } else {\n dailyPnlPct = this.gaussianRandom(params.meanDailyPnlPct, params.stddevPnlPct);\n }\n dailyPnlPct *= activityMultiplier;\n\n const dailyPnl = balance * dailyPnlPct;\n cumulativePnl += dailyPnl;\n\n // Net deposits: organic growth with slight positive bias\n const depositCount = isWeekend\n ? randInt(1, Math.ceil(params.depositsPerDay[0] * 0.2))\n : randInt(params.depositsPerDay[0], params.depositsPerDay[1]);\n const withdrawalCount = isWeekend\n ? randInt(0, Math.ceil(params.withdrawalsPerDay[0] * 0.2))\n : randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]);\n\n const deposits = depositCount * params.avgDepositSize * rand(0.7, 1.3) * activityMultiplier;\n const withdrawals = withdrawalCount * params.avgWithdrawalSize * rand(0.7, 1.3) * activityMultiplier;\n const netFlow = deposits - withdrawals;\n\n balance += dailyPnl + netFlow;\n\n const txCount = depositCount + withdrawalCount + Math.round(params.profitDistPerDay * activityMultiplier);\n const utilization = rand(params.utilizationMin, params.utilizationMax);\n const activeUsers = Math.round(rand(80, 400) * activityMultiplier);\n\n snapshots.push({\n poolId,\n date: formatDate(day),\n openBalance,\n closeBalance: balance,\n deposits,\n withdrawals,\n netFlow,\n dailyPnl,\n dailyPnlPct,\n cumulativePnl,\n utilization,\n txCount,\n activeUsers,\n });\n }\n\n return snapshots;\n }\n\n private generatePoolTransactions(\n poolId: ForexPoolType,\n snapshots: ForexPoolDailySnapshot[],\n ): ForexPoolTransaction[] {\n const params = POOL_PARAMS[poolId];\n const transactions: ForexPoolTransaction[] = [];\n\n for (const snap of snapshots) {\n const day = new Date(snap.date);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n const mult = isWeekend ? 0.2 : 1.0;\n\n const depositCount = Math.round(randInt(params.depositsPerDay[0], params.depositsPerDay[1]) * mult);\n const withdrawalCount = Math.round(randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]) * mult);\n const profitCount = Math.round(params.profitDistPerDay * mult);\n\n // Deposits\n for (let i = 0; i < depositCount; i++) {\n const amount = rand(params.avgDepositSize * 0.3, params.avgDepositSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('dep'),\n poolId,\n type: 'deposit',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Deposit to ${poolId} pool`,\n });\n }\n\n // Withdrawals\n for (let i = 0; i < withdrawalCount; i++) {\n const amount = rand(params.avgWithdrawalSize * 0.3, params.avgWithdrawalSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('wdr'),\n poolId,\n type: 'withdrawal',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Withdrawal from ${poolId} pool`,\n });\n }\n\n // Profit distributions\n for (let i = 0; i < profitCount; i++) {\n const amount = rand(500, 8000);\n const ts = day.getTime() + randInt(6, 22) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('prd'),\n poolId,\n type: 'profit_distribution',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Profit distribution from ${poolId} pool`,\n });\n }\n\n // Fee collection (1-2 per day on weekdays)\n if (!isWeekend) {\n const feeCount = randInt(1, 2);\n for (let i = 0; i < feeCount; i++) {\n const amount = rand(100, 3000);\n const ts = day.getTime() + randInt(8, 20) * 3600000;\n transactions.push({\n id: genId('fee'),\n poolId,\n type: 'fee_collection',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Fee collection for ${poolId} pool`,\n });\n }\n }\n }\n\n return transactions;\n }\n\n private gaussianRandom(mean: number, stddev: number): number {\n let u = 0, v = 0;\n while (u === 0) u = Math.random();\n while (v === 0) v = Math.random();\n const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n return mean + z * stddev;\n }\n\n private getTxDescription(type: ForexPoolTransactionType, poolId: ForexPoolType, amount: number): string {\n const fmt = `$${amount.toLocaleString(undefined, { maximumFractionDigits: 0 })}`;\n switch (type) {\n case 'deposit': return `Deposit ${fmt} to ${poolId} pool`;\n case 'withdrawal': return `Withdrawal ${fmt} from ${poolId} pool`;\n case 'profit_distribution': return `Profit distribution ${fmt} from ${poolId}`;\n case 'loss_absorption': return `Loss absorbed ${fmt} by ${poolId} pool`;\n case 'inter_pool_transfer': return `Inter-pool transfer ${fmt}`;\n case 'fee_collection': return `Fee collected ${fmt} in ${poolId}`;\n case 'reserve_rebalance': return `Reserve rebalance ${fmt} in ${poolId}`;\n default: return `${type} ${fmt}`;\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nlet _instance: ForexPoolDataGeneratorClass | null = null;\n\nexport const ForexPoolDataGenerator = {\n getInstance(): ForexPoolDataGeneratorClass {\n if (!_instance) {\n _instance = new ForexPoolDataGeneratorClass();\n }\n return _instance;\n },\n};\n","/**\n * ONE SDK Configuration\n *\n * Chain data is fetched from ONE Engine API - no duplicates needed here.\n * Engine is the single source of truth for 200+ EVM chains.\n */\n\nimport type { ChainConfig } from '../types';\n\n// ===== SDK Configuration =====\nexport interface OneConfig {\n // ONE Engine (required)\n oneEngineUrl: string;\n oneClientId: string;\n oneSecretKey?: string; // Only for backend usage\n\n // Optional: Direct Supabase access (for realtime subscriptions)\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n\n // Deprecated: Use ONE Engine instead\n thirdwebClientId?: string;\n}\n\n// Default configuration values\nconst DEFAULT_ENGINE_URL = 'https://api.one23.io';\nconst DEFAULT_CLIENT_ID = 'one_pk_e8f647bfa643fdcfaa3a23f760488e49be09f929296eed4a6c399d437d907f60';\n\nlet config: OneConfig | null = null;\n\nexport function initOneSDK(options: Partial<OneConfig>): void {\n // Use defaults if not provided\n const engineUrl = options.oneEngineUrl || DEFAULT_ENGINE_URL;\n const clientId = options.oneClientId || DEFAULT_CLIENT_ID;\n\n config = {\n ...options,\n oneEngineUrl: engineUrl,\n oneClientId: clientId,\n } as OneConfig;\n}\n\nexport function getConfig(): OneConfig {\n if (!config) {\n throw new Error('ONE SDK not initialized. Call initOneSDK() first.');\n }\n return config;\n}\n\nexport function isInitialized(): boolean {\n return config !== null;\n}\n\nexport function getEngineUrl(): string {\n return config?.oneEngineUrl || process.env.NEXT_PUBLIC_ONE_ENGINE_URL || DEFAULT_ENGINE_URL;\n}\n\n// ===== Chain Data (Fetched from Engine) =====\n\n// Cache for chain data\nlet chainsCache: ChainConfig[] | null = null;\nlet chainsCacheTimestamp = 0;\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Fetch chains from ONE Engine API\n * Engine is the source of truth for 200+ EVM chains\n */\nexport async function fetchChains(options?: {\n category?: 'mainnet' | 'l2' | 'testnet' | 'gaming' | 'recommended';\n smartWallet?: boolean;\n limit?: number;\n}): Promise<ChainConfig[]> {\n const engineUrl = getEngineUrl();\n const params = new URLSearchParams();\n\n if (options?.category) params.set('category', options.category);\n if (options?.smartWallet) params.set('smartWallet', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n\n const response = await fetch(`${engineUrl}/v1/chains?${params}`);\n const data = await response.json();\n\n if (!data.success) {\n throw new Error(data.error?.message || 'Failed to fetch chains');\n }\n\n // Transform Engine response to SDK ChainConfig format\n return data.data.chains.map((chain: any) => ({\n id: chain.id,\n name: chain.name,\n shortName: chain.shortName || chain.slug || chain.name.toLowerCase(),\n icon: getChainIcon(chain.id),\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: Array.isArray(chain.rpc) ? chain.rpc : [chain.rpc],\n blockExplorerUrls: chain.blockExplorer ? [chain.blockExplorer] : [],\n testnet: chain.testnet,\n }));\n}\n\n/**\n * Get all supported chains (cached)\n */\nexport async function getChains(): Promise<ChainConfig[]> {\n const now = Date.now();\n if (chainsCache && (now - chainsCacheTimestamp) < CACHE_TTL) {\n return chainsCache;\n }\n\n chainsCache = await fetchChains({ limit: 200 });\n chainsCacheTimestamp = now;\n return chainsCache;\n}\n\n/**\n * Get chain by ID\n */\nexport async function getChainById(chainId: number): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n return chains.find(c => c.id === chainId);\n}\n\n/**\n * Get chain by name/shortName\n */\nexport async function getChainByName(name: string): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n const lowerName = name.toLowerCase();\n return chains.find(\n c => c.name.toLowerCase() === lowerName || c.shortName.toLowerCase() === lowerName\n );\n}\n\n/**\n * Get recommended chains for UI display\n */\nexport async function getRecommendedChains(): Promise<ChainConfig[]> {\n return fetchChains({ category: 'recommended', limit: 10 });\n}\n\n/**\n * Get chains with smart wallet support\n */\nexport async function getSmartWalletChains(): Promise<ChainConfig[]> {\n return fetchChains({ smartWallet: true, limit: 50 });\n}\n\n// ===== Default Chain Constants =====\n// These are commonly used chain IDs, but full data should be fetched from Engine\n\nexport const CHAIN_IDS = {\n ETHEREUM: 1,\n POLYGON: 137,\n BSC: 56,\n ARBITRUM: 42161,\n OPTIMISM: 10,\n BASE: 8453,\n AVALANCHE: 43114,\n ZKSYNC: 324,\n LINEA: 59144,\n SCROLL: 534352,\n BLAST: 81457,\n // Testnets\n SEPOLIA: 11155111,\n BASE_SEPOLIA: 84532,\n ARBITRUM_SEPOLIA: 421614,\n} as const;\n\nexport const DEFAULT_CHAIN_ID = CHAIN_IDS.BASE;\n\n// ===== Chain Icons (Simple emoji fallback) =====\nconst CHAIN_ICONS: Record<number, string> = {\n 1: '\\u229F', // Ethereum\n 137: '\\uD83D\\uDFE3', // Polygon\n 56: '\\uD83D\\uDFE1', // BSC\n 42161: '\\uD83D\\uDD35', // Arbitrum\n 10: '\\uD83D\\uDD34', // Optimism\n 8453: '\\uD83D\\uDD37', // Base\n 43114: '\\uD83D\\uDD3A', // Avalanche\n 324: '\\u26A1', // zkSync\n 59144: '\\uD83D\\uDD39', // Linea\n 534352: '\\uD83D\\uDCDC', // Scroll\n};\n\nfunction getChainIcon(chainId: number): string {\n return CHAIN_ICONS[chainId] || '\\uD83D\\uDD17';\n}\n\n// ===== Token Names Mapping =====\n// Common token symbols to human-readable names\nexport const TOKEN_NAMES: Record<string, string> = {\n ETH: 'Ethereum',\n BTC: 'Bitcoin',\n BNB: 'BNB',\n MATIC: 'Polygon',\n POL: 'Polygon',\n AVAX: 'Avalanche',\n USDT: 'Tether',\n USDC: 'USD Coin',\n DAI: 'Dai',\n WBTC: 'Wrapped Bitcoin',\n WETH: 'Wrapped Ether',\n ARB: 'Arbitrum',\n OP: 'Optimism',\n LINK: 'Chainlink',\n UNI: 'Uniswap',\n AAVE: 'Aave',\n CRV: 'Curve',\n MKR: 'Maker',\n SNX: 'Synthetix',\n COMP: 'Compound',\n SUSHI: 'SushiSwap',\n YFI: 'Yearn Finance',\n SOL: 'Solana',\n DOT: 'Polkadot',\n ATOM: 'Cosmos',\n NEAR: 'Near Protocol',\n};\n\n// ===== CoinGecko ID Mapping =====\n// For price lookups via CoinGecko API\nexport const COINGECKO_IDS: Record<string, string> = {\n ETH: 'ethereum',\n BTC: 'bitcoin',\n BNB: 'binancecoin',\n MATIC: 'matic-network',\n POL: 'matic-network',\n AVAX: 'avalanche-2',\n USDT: 'tether',\n USDC: 'usd-coin',\n DAI: 'dai',\n WBTC: 'wrapped-bitcoin',\n WETH: 'weth',\n ARB: 'arbitrum',\n OP: 'optimism',\n LINK: 'chainlink',\n UNI: 'uniswap',\n AAVE: 'aave',\n SOL: 'solana',\n};\n\n// ===== Backwards Compatibility =====\n// @deprecated - Use getChains() or fetch from Engine API\n// These static configs are kept for backwards compatibility only\n\nexport const CHAIN_CONFIGS: Record<string, ChainConfig> = {\n ethereum: {\n id: 1,\n name: 'Ethereum',\n shortName: 'ETH',\n icon: '\\u229F',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://ethereum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n testnet: false,\n },\n polygon: {\n id: 137,\n name: 'Polygon',\n shortName: 'MATIC',\n icon: '\\uD83D\\uDFE3',\n nativeCurrency: { name: 'POL', symbol: 'POL', decimals: 18 },\n rpcUrls: ['https://polygon.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n testnet: false,\n },\n base: {\n id: 8453,\n name: 'Base',\n shortName: 'BASE',\n icon: '\\uD83D\\uDD37',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://base.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://basescan.org'],\n testnet: false,\n },\n arbitrum: {\n id: 42161,\n name: 'Arbitrum One',\n shortName: 'ARB',\n icon: '\\uD83D\\uDD35',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://arbitrum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://arbiscan.io'],\n testnet: false,\n },\n optimism: {\n id: 10,\n name: 'Optimism',\n shortName: 'OP',\n icon: '\\uD83D\\uDD34',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://optimism.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://optimistic.etherscan.io'],\n testnet: false,\n },\n};\n\n// @deprecated - Use getChains() to get all supported chains\nexport const SUPPORTED_CHAINS = Object.keys(CHAIN_CONFIGS);\n\n// @deprecated - Use getChainByName() instead\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAIN_CONFIGS[chain.toLowerCase()];\n}\n","/**\n * ONE Engine Client - The unified API gateway for all ONE Ecosystem services\n *\n * All wallet operations, onramp, swap, trading go through ONE Engine.\n * Thirdweb/Onramper/etc are internal to ONE Engine and hidden from clients.\n */\n\nimport { getConfig } from '../config';\nimport type {\n ApiResponse,\n User,\n Token,\n WalletBalance,\n Transaction,\n AIStrategy,\n AIOrder,\n AIOrderStatus,\n AITradeExecution,\n AITradeAllocation,\n AINavSnapshot,\n AIPortfolioSummary,\n AIRedemptionResult,\n AIMarketData,\n CreateAIOrderRequest,\n StrategyCategory,\n NFT,\n NFTCollection,\n Contract,\n ContractReadParams,\n ContractWriteParams,\n ContractDeployParams,\n BillProvider,\n BillPayment,\n OfframpQuote,\n OfframpRequest,\n OfframpTransaction,\n StakingPool,\n StakingPosition,\n ReferralInfo,\n Referral,\n UserProfile,\n UserSettings,\n Notification,\n BridgeQuote,\n BridgeTransaction,\n GasEstimate,\n GasPrice,\n WalletImportRequest,\n PortfolioAnalytics,\n LimitOrder,\n TradingCondition,\n Webhook,\n WebhookDelivery,\n CreateWebhookInput,\n UpdateWebhookInput,\n AdminUser,\n AdminProject,\n SystemStats,\n PaginatedResult,\n AdminListOptions,\n SystemLog,\n RateLimitInfo,\n} from '../types';\n\n// ===== Auth Types =====\nexport interface EngineAuthResponse {\n user: User;\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n}\n\n// ===== Wallet Types =====\nexport interface EngineWalletBalance {\n address: string;\n totalUsd: number;\n change24h: number;\n changePercent24h: number;\n tokens: Token[];\n}\n\nexport interface EngineTransactionRequest {\n to: string;\n amount: string;\n tokenSymbol: string;\n chainId: number;\n memo?: string;\n}\n\nexport interface EngineTransactionResponse {\n txId: string;\n status: 'queued' | 'pending' | 'confirmed' | 'failed';\n txHash?: string;\n explorerUrl?: string;\n}\n\n// ===== Onramp Types =====\nexport interface OnrampSessionRequest {\n walletAddress: string;\n fiatCurrency?: string;\n fiatAmount?: number;\n cryptoCurrency?: string;\n cryptoNetwork?: string;\n paymentMethod?: string;\n redirectUrl?: string;\n}\n\nexport interface OnrampSession {\n sessionId: string;\n widgetUrl: string;\n expiresAt: string;\n}\n\nexport interface OnrampQuote {\n provider: string;\n fiatCurrency: string;\n fiatAmount: number;\n cryptoCurrency: string;\n cryptoAmount: number;\n rate: number;\n fees: {\n network: number;\n provider: number;\n total: number;\n };\n paymentMethod: string;\n estimatedTime: string;\n}\n\nexport interface OnrampTransaction {\n id: string;\n sessionId: string;\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'expired';\n fiatAmount: number;\n fiatCurrency: string;\n cryptoAmount?: number;\n cryptoCurrency: string;\n walletAddress: string;\n txHash?: string;\n createdAt: string;\n completedAt?: string;\n}\n\n// ===== Swap Types =====\nexport interface SwapQuoteRequest {\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toChainId: number;\n walletAddress: string;\n slippage?: number;\n}\n\nexport interface SwapQuote {\n quoteId: string;\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toAmount: string;\n toChainId: number;\n rate: number;\n priceImpact: number;\n estimatedGas: string;\n estimatedTime: string;\n fees: {\n gas: number;\n protocol: number;\n total: number;\n };\n expiresAt: string;\n}\n\nexport interface SwapExecuteRequest {\n quoteId: string;\n walletAddress: string;\n signature?: string; // For backend wallets\n}\n\nexport interface SwapResult {\n swapId: string;\n status: 'pending' | 'confirming' | 'completed' | 'failed';\n txHash?: string;\n fromAmount: string;\n toAmount?: string;\n}\n\n// ===== Main Client =====\nexport class OneEngineClient {\n private baseUrl: string;\n private clientId: string;\n private secretKey?: string;\n private accessToken?: string;\n\n constructor(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n }) {\n const config = getConfig();\n this.baseUrl = options?.baseUrl || config.oneEngineUrl;\n this.clientId = options?.clientId || config.oneClientId || '';\n this.secretKey = options?.secretKey || config.oneSecretKey;\n }\n\n /**\n * Set access token for authenticated requests\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n }\n\n /**\n * Clear access token\n */\n clearAccessToken() {\n this.accessToken = undefined;\n }\n\n private getHeaders(includeSecret = false): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-client-id': this.clientId,\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n if (includeSecret && this.secretKey) {\n headers['x-secret-key'] = this.secretKey;\n }\n\n return headers;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n includeSecret = false\n ): Promise<ApiResponse<T>> {\n try {\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\n ...options,\n headers: {\n ...this.getHeaders(includeSecret),\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: data.error?.code || `HTTP_${response.status}`,\n message: data.error?.message || 'Request failed',\n },\n };\n }\n\n return {\n success: true,\n data: data.data || data,\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network request failed',\n },\n };\n }\n }\n\n // ===============================\n // AUTH ENDPOINTS\n // ===============================\n\n /**\n * Send OTP to email for authentication\n */\n async sendEmailOtp(email: string): Promise<ApiResponse<{ message: string }>> {\n return this.request('/api/v1/auth/otp', {\n method: 'POST',\n body: JSON.stringify({ email }),\n });\n }\n\n /**\n * Verify OTP and get access token\n */\n async verifyEmailOtp(email: string, otp: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/otp/verify', {\n method: 'POST',\n body: JSON.stringify({ email, otp }),\n });\n }\n\n /**\n * Authenticate with wallet signature\n */\n async authWithWallet(\n walletAddress: string,\n signature: string,\n message: string\n ): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/wallet', {\n method: 'POST',\n body: JSON.stringify({ walletAddress, signature, message }),\n });\n }\n\n /**\n * Refresh access token\n */\n async refreshToken(refreshToken: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/refresh', {\n method: 'POST',\n body: JSON.stringify({ refreshToken }),\n });\n }\n\n /**\n * Get current user\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n return this.request('/api/v1/auth/me', { method: 'GET' });\n }\n\n /**\n * Sign out\n */\n async signOut(): Promise<ApiResponse<{ success: boolean }>> {\n return this.request('/api/v1/auth/logout', { method: 'POST' });\n }\n\n // ===============================\n // WALLET/ASSETS ENDPOINTS\n // ===============================\n\n /**\n * Get wallet balance across all chains\n */\n async getWalletBalance(\n walletAddress: string,\n chains?: number[]\n ): Promise<ApiResponse<EngineWalletBalance>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (chains?.length && chains.length > 0) {\n params.set('chainId', chains[0].toString()); // Engine expects single chainId\n }\n return this.request(`/api/v1/assets?${params}`, { method: 'GET' });\n }\n\n /**\n * Get portfolio summary\n */\n async getPortfolioSummary(\n walletAddress: string\n ): Promise<ApiResponse<{ totalValue: number; change24h: number; tokens: Token[] }>> {\n const params = new URLSearchParams({ address: walletAddress });\n return this.request(`/api/v1/assets/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's wallets\n */\n async getUserWallets(\n chainId?: number\n ): Promise<ApiResponse<{ wallets: any[]; total: number }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/wallet${params}`, { method: 'GET' });\n }\n\n /**\n * Create a new wallet\n */\n async createWallet(\n chainId: number = 8453,\n type: 'smart' | 'eoa' | 'multisig' = 'smart'\n ): Promise<ApiResponse<{ wallet: any; smartAccountAddress: string; personalAddress: string }>> {\n return this.request('/api/v1/wallet', {\n method: 'POST',\n body: JSON.stringify({ chainId, type }),\n });\n }\n\n /**\n * Get wallet transactions (placeholder - needs endpoint)\n */\n async getWalletTransactions(\n walletAddress: string,\n options?: { limit?: number; offset?: number; chainId?: number }\n ): Promise<ApiResponse<{ transactions: Transaction[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n return this.request(`/api/v1/assets/transactions?${params}`, { method: 'GET' });\n }\n\n /**\n * Send native token or ERC20\n */\n async sendTransaction(\n request: EngineTransactionRequest\n ): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request('/api/v1/wallet/send', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get transaction status\n */\n async getTransactionStatus(txId: string): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request(`/api/v1/wallet/transaction/${txId}`, { method: 'GET' });\n }\n\n // ===============================\n // ONRAMP ENDPOINTS (Fiat-to-Crypto)\n // ===============================\n\n /**\n * Get onramp quote\n */\n async getOnrampQuote(\n fiatCurrency: string,\n fiatAmount: number,\n cryptoCurrency: string,\n paymentMethod?: string\n ): Promise<ApiResponse<OnrampQuote[]>> {\n const params = new URLSearchParams({\n fiatCurrency,\n fiatAmount: fiatAmount.toString(),\n cryptoCurrency,\n });\n if (paymentMethod) params.set('paymentMethod', paymentMethod);\n return this.request(`/api/v1/fiat/onramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create onramp session (returns widget URL)\n */\n async createOnrampSession(\n request: OnrampSessionRequest\n ): Promise<ApiResponse<OnrampSession>> {\n return this.request('/api/v1/fiat/onramp', {\n method: 'POST',\n body: JSON.stringify({\n fiatCurrency: request.fiatCurrency || 'USD',\n fiatAmount: request.fiatAmount || 100,\n cryptoCurrency: request.cryptoCurrency || 'ETH',\n walletAddress: request.walletAddress,\n chainId: 8453, // Default to Base\n }),\n });\n }\n\n /**\n * Get onramp session status\n */\n async getOnrampStatus(sessionId: string): Promise<ApiResponse<OnrampTransaction>> {\n return this.request(`/api/v1/fiat/onramp/${sessionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported currencies (fiat + crypto)\n */\n async getSupportedCurrencies(): Promise<ApiResponse<{ fiatCurrencies: string[]; cryptoCurrencies: string[] }>> {\n return this.request('/api/v1/fiat/onramp', { method: 'GET' });\n }\n\n /**\n * Get supported fiat currencies\n */\n async getSupportedFiatCurrencies(): Promise<ApiResponse<string[]>> {\n const result = await this.getSupportedCurrencies();\n if (result.success && result.data) {\n return { success: true, data: result.data.fiatCurrencies };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get supported payment methods\n */\n async getSupportedPaymentMethods(country?: string): Promise<ApiResponse<string[]>> {\n // Placeholder - engine doesn't have this endpoint yet\n return { success: true, data: ['card', 'bank_transfer', 'apple_pay', 'google_pay'] };\n }\n\n // ===============================\n // SWAP ENDPOINTS\n // ===============================\n\n /**\n * Get swap quote\n */\n async getSwapQuote(request: SwapQuoteRequest): Promise<ApiResponse<SwapQuote>> {\n return this.request('/api/v1/swap/quote', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Execute swap\n */\n async executeSwap(request: SwapExecuteRequest): Promise<ApiResponse<SwapResult>> {\n return this.request('/api/v1/swap/execute', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get swap status\n */\n async getSwapStatus(swapId: string): Promise<ApiResponse<SwapResult>> {\n return this.request(`/api/v1/swap/${swapId}`, { method: 'GET' });\n }\n\n /**\n * Get supported tokens for swap\n */\n async getSupportedSwapTokens(chainId?: number): Promise<ApiResponse<{ tokens: Token[] }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/swap/tokens${params}`, { method: 'GET' });\n }\n\n /**\n * Get supported chains for swap\n */\n async getSupportedSwapChains(): Promise<ApiResponse<{ chains: { id: number; name: string }[] }>> {\n return this.request('/api/v1/swap/chains', { method: 'GET' });\n }\n\n // ===============================\n // AI TRADING/QUANT ENDPOINTS\n // ===============================\n\n /**\n * Get available AI trading strategies\n */\n async getStrategies(): Promise<ApiResponse<AIStrategy[]>> {\n return this.request('/api/v1/quant/strategies', { method: 'GET' });\n }\n\n /**\n * Get strategy details\n */\n async getStrategy(strategyId: string): Promise<ApiResponse<AIStrategy>> {\n return this.request(`/api/v1/quant/strategies/${strategyId}`, { method: 'GET' });\n }\n\n /**\n * Get user's positions\n */\n async getPositions(): Promise<ApiResponse<any[]>> {\n return this.request('/api/v1/quant/positions', { method: 'GET' });\n }\n\n /**\n * Create investment order\n */\n async createOrder(\n strategyId: string,\n amount: number,\n currency: string\n ): Promise<ApiResponse<AIOrder>> {\n return this.request('/api/v1/trading/orders', {\n method: 'POST',\n body: JSON.stringify({ strategyId, amount, currency }),\n });\n }\n\n /**\n * Get user's orders\n */\n async getUserOrders(): Promise<ApiResponse<AIOrder[]>> {\n return this.request('/api/v1/trading/orders', { method: 'GET' });\n }\n\n /**\n * Get user's portfolio stats from positions\n */\n async getPortfolioStats(): Promise<ApiResponse<{\n totalInvested: number;\n totalValue: number;\n totalPnl: number;\n totalPnlPercent: number;\n activePositions: number;\n }>> {\n // Derive from positions\n const positionsResult = await this.getPositions();\n if (positionsResult.success && positionsResult.data) {\n const positions = positionsResult.data;\n const totalInvested = positions.reduce((sum, p) => sum + (p.investedAmount || 0), 0);\n const totalValue = positions.reduce((sum, p) => sum + (p.currentValue || 0), 0);\n const totalPnl = totalValue - totalInvested;\n const totalPnlPercent = totalInvested > 0 ? (totalPnl / totalInvested) * 100 : 0;\n return {\n success: true,\n data: {\n totalInvested,\n totalValue,\n totalPnl,\n totalPnlPercent,\n activePositions: positions.filter((p: any) => p.status === 'active').length,\n },\n };\n }\n return {\n success: true,\n data: { totalInvested: 0, totalValue: 0, totalPnl: 0, totalPnlPercent: 0, activePositions: 0 },\n };\n }\n\n // ===============================\n // MARKET/PRICE ENDPOINTS\n // ===============================\n\n /**\n * Get token prices\n */\n async getTokenPrices(symbols: string[]): Promise<ApiResponse<Record<string, {\n price: number;\n change24h: number;\n marketCap?: number;\n }>>> {\n // Convert symbols to Bybit format (add USDT suffix if needed)\n const bybitSymbols = symbols.map(s => {\n const upper = s.toUpperCase();\n if (upper.endsWith('USDT')) return upper;\n return `${upper}USDT`;\n });\n\n const result = await this.request<{ markets: any[] }>(\n `/api/v1/trading/market?symbols=${bybitSymbols.join(',')}`,\n { method: 'GET' }\n );\n\n if (result.success && result.data?.markets) {\n const prices: Record<string, { price: number; change24h: number; marketCap?: number }> = {};\n for (const market of result.data.markets) {\n const symbol = market.symbol?.replace('USDT', '') || '';\n prices[symbol] = {\n price: parseFloat(market.lastPrice) || 0,\n change24h: parseFloat(market.price24hPcnt) * 100 || 0,\n marketCap: undefined, // Bybit doesn't provide this\n };\n }\n return { success: true, data: prices };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get market data overview\n */\n async getMarketData(): Promise<ApiResponse<{\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n markets: any[];\n }>> {\n const result = await this.request<{ markets: any[] }>('/api/v1/trading/market', { method: 'GET' });\n if (result.success && result.data?.markets) {\n return {\n success: true,\n data: {\n totalMarketCap: 0, // Would need separate API\n totalVolume24h: result.data.markets.reduce((sum, m) => sum + (parseFloat(m.volume24h) || 0), 0),\n btcDominance: 0, // Would need separate API\n markets: result.data.markets,\n },\n };\n }\n return { success: false, error: result.error };\n }\n\n // ===============================\n // NFT ENDPOINTS\n // ===============================\n\n /**\n * Get user's NFTs\n */\n async getUserNFTs(\n walletAddress: string,\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ nfts: NFT[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/assets/nfts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get NFT details\n */\n async getNFTDetails(\n contractAddress: string,\n tokenId: string,\n chainId: number\n ): Promise<ApiResponse<NFT>> {\n return this.request(`/api/v1/assets/nfts/${contractAddress}/${tokenId}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Get NFT collection\n */\n async getNFTCollection(\n contractAddress: string,\n chainId: number\n ): Promise<ApiResponse<NFTCollection>> {\n return this.request(`/api/v1/assets/nfts/collection/${contractAddress}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Transfer NFT\n */\n async transferNFT(params: {\n contractAddress: string;\n tokenId: string;\n chainId: number;\n to: string;\n tokenType?: 'ERC721' | 'ERC1155';\n amount?: number; // For ERC1155\n }): Promise<ApiResponse<{ txHash: string; status: string }>> {\n return this.request('/api/v1/assets/nfts/transfer', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // CONTRACT ENDPOINTS\n // ===============================\n\n /**\n * Get user's contracts\n */\n async getUserContracts(\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ contracts: Contract[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/contracts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get contract details\n */\n async getContractDetails(\n address: string,\n chainId: number\n ): Promise<ApiResponse<Contract>> {\n return this.request(`/api/v1/contracts/${address}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Read contract (call view function)\n */\n async readContract(params: ContractReadParams): Promise<ApiResponse<any>> {\n return this.request('/api/v1/contracts/read', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Write to contract (execute transaction)\n */\n async writeContract(params: ContractWriteParams): Promise<ApiResponse<{\n txHash: string;\n status: string;\n }>> {\n return this.request('/api/v1/contracts/write', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Deploy contract\n */\n async deployContract(params: ContractDeployParams): Promise<ApiResponse<{\n address: string;\n txHash: string;\n contract: Contract;\n }>> {\n return this.request('/api/v1/contracts/deploy', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // OFFRAMP ENDPOINTS (Crypto-to-Fiat)\n // ===============================\n\n /**\n * Get offramp quote\n */\n async getOfframpQuote(\n cryptoCurrency: string,\n cryptoAmount: number,\n fiatCurrency: string,\n payoutMethod?: string\n ): Promise<ApiResponse<OfframpQuote[]>> {\n const params = new URLSearchParams({\n cryptoCurrency,\n cryptoAmount: cryptoAmount.toString(),\n fiatCurrency,\n });\n if (payoutMethod) params.set('payoutMethod', payoutMethod);\n return this.request(`/api/v1/fiat/offramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create offramp transaction\n */\n async createOfframpTransaction(request: OfframpRequest): Promise<ApiResponse<OfframpTransaction>> {\n return this.request('/api/v1/fiat/offramp', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get offramp transaction status\n */\n async getOfframpStatus(transactionId: string): Promise<ApiResponse<OfframpTransaction>> {\n return this.request(`/api/v1/fiat/offramp/${transactionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported payout methods\n */\n async getSupportedPayoutMethods(country?: string): Promise<ApiResponse<string[]>> {\n const params = country ? `?country=${country}` : '';\n return this.request(`/api/v1/fiat/offramp/methods${params}`, { method: 'GET' });\n }\n\n // ===============================\n // BILL PAYMENT ENDPOINTS\n // ===============================\n\n /**\n * Get bill providers\n */\n async getBillProviders(\n country?: string,\n category?: string\n ): Promise<ApiResponse<BillProvider[]>> {\n const params = new URLSearchParams();\n if (country) params.set('country', country);\n if (category) params.set('category', category);\n return this.request(`/api/v1/bills/providers?${params}`, { method: 'GET' });\n }\n\n /**\n * Get bill details/validate account\n */\n async validateBillAccount(\n providerId: string,\n accountNumber: string\n ): Promise<ApiResponse<{\n valid: boolean;\n accountName?: string;\n minAmount?: number;\n maxAmount?: number;\n dueAmount?: number;\n }>> {\n return this.request('/api/v1/bills/validate', {\n method: 'POST',\n body: JSON.stringify({ providerId, accountNumber }),\n });\n }\n\n /**\n * Pay bill\n */\n async payBill(params: {\n providerId: string;\n accountNumber: string;\n amount: number;\n currency: string;\n }): Promise<ApiResponse<BillPayment>> {\n return this.request('/api/v1/bills/pay', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bill payment history\n */\n async getBillHistory(\n options?: { limit?: number; offset?: number }\n ): Promise<ApiResponse<{ payments: BillPayment[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/bills/history?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // STAKING ENDPOINTS\n // ===============================\n\n /**\n * Get staking pools\n */\n async getStakingPools(\n chainId?: number\n ): Promise<ApiResponse<StakingPool[]>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/staking/pools${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's staking positions\n */\n async getStakingPositions(): Promise<ApiResponse<StakingPosition[]>> {\n return this.request('/api/v1/staking/positions', { method: 'GET' });\n }\n\n /**\n * Stake tokens\n */\n async stake(params: {\n poolId: string;\n amount: number;\n }): Promise<ApiResponse<{ positionId: string; txHash: string }>> {\n return this.request('/api/v1/staking/stake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Unstake tokens\n */\n async unstake(params: {\n positionId: string;\n amount?: number; // Optional for partial unstake\n }): Promise<ApiResponse<{ txHash: string }>> {\n return this.request('/api/v1/staking/unstake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Claim staking rewards\n */\n async claimStakingRewards(positionId: string): Promise<ApiResponse<{ txHash: string; amount: number }>> {\n return this.request('/api/v1/staking/claim', {\n method: 'POST',\n body: JSON.stringify({ positionId }),\n });\n }\n\n // ===============================\n // USER PROFILE ENDPOINTS\n // ===============================\n\n /**\n * Get user profile\n */\n async getUserProfile(): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', { method: 'GET' });\n }\n\n /**\n * Update user profile\n */\n async updateUserProfile(updates: Partial<UserProfile>): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get user settings\n */\n async getUserSettings(): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', { method: 'GET' });\n }\n\n /**\n * Update user settings\n */\n async updateUserSettings(updates: Partial<UserSettings>): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n // ===============================\n // NOTIFICATION ENDPOINTS\n // ===============================\n\n /**\n * Get notifications\n */\n async getNotifications(\n options?: { unreadOnly?: boolean; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ notifications: Notification[]; unreadCount: number }>> {\n const params = new URLSearchParams();\n if (options?.unreadOnly) params.set('unreadOnly', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/notifications?${params}`, { method: 'GET' });\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationRead(notificationId: string): Promise<ApiResponse<void>> {\n return this.request(`/api/v1/notifications/${notificationId}/read`, { method: 'POST' });\n }\n\n /**\n * Mark all notifications as read\n */\n async markAllNotificationsRead(): Promise<ApiResponse<void>> {\n return this.request('/api/v1/notifications/read-all', { method: 'POST' });\n }\n\n // ===============================\n // REFERRAL ENDPOINTS\n // ===============================\n\n /**\n * Get referral info\n */\n async getReferralInfo(): Promise<ApiResponse<ReferralInfo>> {\n return this.request('/api/v1/referral', { method: 'GET' });\n }\n\n /**\n * Get referred users\n */\n async getReferrals(): Promise<ApiResponse<Referral[]>> {\n return this.request('/api/v1/referral/list', { method: 'GET' });\n }\n\n /**\n * Apply referral code\n */\n async applyReferralCode(code: string): Promise<ApiResponse<{ success: boolean; message: string }>> {\n return this.request('/api/v1/referral/apply', {\n method: 'POST',\n body: JSON.stringify({ code }),\n });\n }\n\n /**\n * Claim referral rewards\n */\n async claimReferralRewards(): Promise<ApiResponse<{ amount: number; txHash?: string }>> {\n return this.request('/api/v1/referral/claim', { method: 'POST' });\n }\n\n // ===============================\n // KYC ENDPOINTS\n // ===============================\n\n /**\n * Get KYC status\n */\n async getKycStatus(): Promise<ApiResponse<{\n status: 'none' | 'pending' | 'verified' | 'rejected';\n level: number;\n limits: { daily: number; monthly: number };\n rejectionReason?: string;\n }>> {\n return this.request('/api/v1/kyc/status', { method: 'GET' });\n }\n\n /**\n * Start KYC verification\n */\n async startKycVerification(level: number): Promise<ApiResponse<{\n verificationUrl: string;\n sessionId: string;\n }>> {\n return this.request('/api/v1/kyc/start', {\n method: 'POST',\n body: JSON.stringify({ level }),\n });\n }\n\n /**\n * Submit KYC documents\n */\n async submitKycDocuments(params: {\n documentType: 'passport' | 'id_card' | 'drivers_license';\n frontImage: string; // base64\n backImage?: string; // base64\n selfieImage: string; // base64\n }): Promise<ApiResponse<{ status: string; message: string }>> {\n return this.request('/api/v1/kyc/submit', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // BRIDGE ENDPOINTS\n // ===============================\n\n /**\n * Get bridge quote\n */\n async getBridgeQuote(params: {\n fromChainId: number;\n toChainId: number;\n fromToken: string;\n toToken: string;\n amount: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeQuote>> {\n return this.request('/api/v1/bridge/quote', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Execute bridge transaction\n */\n async executeBridge(params: {\n quoteId: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeTransaction>> {\n return this.request('/api/v1/bridge/execute', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bridge transaction status\n */\n async getBridgeStatus(bridgeId: string): Promise<ApiResponse<BridgeTransaction>> {\n return this.request(`/api/v1/bridge/${bridgeId}`, { method: 'GET' });\n }\n\n /**\n * Get supported bridge routes\n */\n async getSupportedBridgeRoutes(): Promise<ApiResponse<{\n routes: { fromChainId: number; toChainId: number; tokens: string[] }[];\n }>> {\n return this.request('/api/v1/bridge/routes', { method: 'GET' });\n }\n\n // ===============================\n // GAS ENDPOINTS\n // ===============================\n\n /**\n * Get gas estimate for transaction\n */\n async getGasEstimate(params: {\n chainId: number;\n to: string;\n data?: string;\n value?: string;\n }): Promise<ApiResponse<GasEstimate>> {\n return this.request('/api/v1/gas/estimate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get current gas prices for chain\n */\n async getGasPrice(chainId: number): Promise<ApiResponse<GasPrice>> {\n return this.request(`/api/v1/gas/price?chainId=${chainId}`, { method: 'GET' });\n }\n\n // ===============================\n // WALLET IMPORT/EXPORT ENDPOINTS\n // ===============================\n\n /**\n * Import wallet from private key or mnemonic\n */\n async importWallet(request: WalletImportRequest): Promise<ApiResponse<{\n wallet: any;\n address: string;\n smartAccountAddress?: string;\n }>> {\n return this.request('/api/v1/wallet/import', {\n method: 'POST',\n body: JSON.stringify(request),\n }, true); // Include secret key for secure import\n }\n\n /**\n * Export wallet (get encrypted private key)\n * Requires additional authentication\n */\n async exportWallet(walletId: string, pin: string): Promise<ApiResponse<{\n encryptedPrivateKey: string;\n address: string;\n }>> {\n return this.request('/api/v1/wallet/export', {\n method: 'POST',\n body: JSON.stringify({ walletId, pin }),\n }, true);\n }\n\n /**\n * Generate new mnemonic phrase\n */\n async generateMnemonic(): Promise<ApiResponse<{ mnemonic: string; address: string }>> {\n return this.request('/api/v1/wallet/generate-mnemonic', { method: 'POST' }, true);\n }\n\n /**\n * Validate mnemonic phrase\n */\n async validateMnemonic(mnemonic: string): Promise<ApiResponse<{ valid: boolean; address?: string }>> {\n return this.request('/api/v1/wallet/validate-mnemonic', {\n method: 'POST',\n body: JSON.stringify({ mnemonic }),\n });\n }\n\n // ===============================\n // PORTFOLIO ANALYTICS ENDPOINTS\n // ===============================\n\n /**\n * Get portfolio analytics with historical data\n */\n async getPortfolioAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' | '1y' | 'all' = '30d'\n ): Promise<ApiResponse<PortfolioAnalytics>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get transaction analytics\n */\n async getTransactionAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' = '30d'\n ): Promise<ApiResponse<{\n totalTransactions: number;\n totalVolume: number;\n avgTransactionValue: number;\n byType: Record<string, number>;\n byChain: Record<string, number>;\n }>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/transactions?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // ADVANCED TRADING ENDPOINTS\n // ===============================\n\n /**\n * Create limit order\n */\n async createLimitOrder(params: {\n tokenSymbol: string;\n type: 'buy' | 'sell';\n amount: number;\n limitPrice: number;\n chainId: number;\n expiresIn?: number; // seconds\n conditions?: TradingCondition[];\n }): Promise<ApiResponse<LimitOrder>> {\n return this.request('/api/v1/trading/limit-orders', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get user's limit orders\n */\n async getLimitOrders(status?: 'pending' | 'filled' | 'cancelled'): Promise<ApiResponse<LimitOrder[]>> {\n const params = status ? `?status=${status}` : '';\n return this.request(`/api/v1/trading/limit-orders${params}`, { method: 'GET' });\n }\n\n /**\n * Cancel limit order\n */\n async cancelLimitOrder(orderId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/limit-orders/${orderId}`, { method: 'DELETE' });\n }\n\n /**\n * Set price alert\n */\n async setPriceAlert(params: {\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n notification: 'push' | 'email' | 'both';\n }): Promise<ApiResponse<{ alertId: string }>> {\n return this.request('/api/v1/trading/alerts', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get price alerts\n */\n async getPriceAlerts(): Promise<ApiResponse<{\n id: string;\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n status: 'active' | 'triggered' | 'cancelled';\n createdAt: string;\n triggeredAt?: string;\n }[]>> {\n return this.request('/api/v1/trading/alerts', { method: 'GET' });\n }\n\n /**\n * Delete price alert\n */\n async deletePriceAlert(alertId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/alerts/${alertId}`, { method: 'DELETE' });\n }\n\n // ===============================\n // SESSION MANAGEMENT\n // ===============================\n\n /**\n * Get active sessions\n */\n async getActiveSessions(): Promise<ApiResponse<{\n sessions: {\n id: string;\n deviceName: string;\n ipAddress: string;\n lastActive: string;\n current: boolean;\n }[];\n }>> {\n return this.request('/api/v1/auth/sessions', { method: 'GET' });\n }\n\n /**\n * Revoke session\n */\n async revokeSession(sessionId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/auth/sessions/${sessionId}`, { method: 'DELETE' });\n }\n\n /**\n * Revoke all other sessions\n */\n async revokeAllOtherSessions(): Promise<ApiResponse<{ revokedCount: number }>> {\n return this.request('/api/v1/auth/sessions/revoke-all', { method: 'POST' });\n }\n\n // ========== Webhooks ==========\n\n /**\n * List webhooks for the project\n */\n async listWebhooks(options?: { isActive?: boolean }): Promise<ApiResponse<{ webhooks: Webhook[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/webhooks${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get webhook by ID\n */\n async getWebhook(webhookId: string): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'GET' });\n }\n\n /**\n * Create a webhook\n */\n async createWebhook(input: CreateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request('/api/v1/webhooks', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Update a webhook\n */\n async updateWebhook(webhookId: string, input: UpdateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Delete a webhook\n */\n async deleteWebhook(webhookId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'DELETE' });\n }\n\n /**\n * Get webhook deliveries\n */\n async getWebhookDeliveries(\n webhookId: string,\n options?: { status?: 'pending' | 'success' | 'failed'; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ deliveries: WebhookDelivery[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n return this.request(`/api/v1/webhooks/${webhookId}/deliveries${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Test a webhook\n */\n async testWebhook(webhookId: string): Promise<ApiResponse<{\n success: boolean;\n statusCode?: number;\n responseTime?: number;\n error?: string;\n }>> {\n return this.request(`/api/v1/webhooks/${webhookId}/test`, { method: 'POST' });\n }\n\n // ========== Admin (requires admin role) ==========\n\n /**\n * List all users (admin only)\n */\n async adminListUsers(options?: AdminListOptions & {\n role?: 'user' | 'admin';\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminUser>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.role) params.set('role', options.role);\n if (options?.kycStatus) params.set('kycStatus', options.kycStatus);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/users${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user by ID (admin only)\n */\n async adminGetUser(userId: string): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, { method: 'GET' });\n }\n\n /**\n * Update user (admin only)\n */\n async adminUpdateUser(userId: string, data: {\n role?: 'user' | 'admin';\n isActive?: boolean;\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n }): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * List all projects (admin only)\n */\n async adminListProjects(options?: AdminListOptions & {\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminProject>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get project by ID (admin only)\n */\n async adminGetProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project (admin only)\n */\n async adminUpdateProject(projectId: string, data: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Regenerate project API key (admin only)\n */\n async adminRegenerateApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/admin/projects/${projectId}/regenerate-key`, { method: 'POST' });\n }\n\n /**\n * Get system statistics (admin only)\n */\n async adminGetStats(days?: number): Promise<ApiResponse<SystemStats>> {\n const query = days ? `?days=${days}` : '';\n return this.request(`/api/v1/admin/stats${query}`, { method: 'GET' });\n }\n\n /**\n * Get system logs (admin only)\n */\n async adminGetLogs(options?: {\n level?: 'info' | 'warn' | 'error';\n service?: string;\n limit?: number;\n offset?: number;\n startDate?: string;\n endDate?: string;\n }): Promise<ApiResponse<{ logs: SystemLog[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.level) params.set('level', options.level);\n if (options?.service) params.set('service', options.service);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n if (options?.startDate) params.set('startDate', options.startDate);\n if (options?.endDate) params.set('endDate', options.endDate);\n const query = params.toString();\n return this.request(`/api/v1/admin/logs${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get rate limit status (admin only)\n */\n async adminGetRateLimits(options?: {\n identifier?: string;\n limit?: number;\n }): Promise<ApiResponse<{ limits: RateLimitInfo[] }>> {\n const params = new URLSearchParams();\n if (options?.identifier) params.set('identifier', options.identifier);\n if (options?.limit) params.set('limit', String(options.limit));\n const query = params.toString();\n return this.request(`/api/v1/admin/rate-limits${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Clear rate limits for an identifier (admin only)\n */\n async adminClearRateLimits(identifier: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/admin/rate-limits/${identifier}`, { method: 'DELETE' });\n }\n\n // ========== AI Agent Configuration ==========\n\n /**\n * Get all AI agent configurations\n * This returns the full agent setup including tiers, cycles, and trading parameters\n */\n async getAgentConfigs(options?: {\n includeInactive?: boolean;\n agentId?: string;\n }): Promise<ApiResponse<{\n agents?: Array<{\n id: string;\n name: string;\n name_zh: string;\n description: string;\n description_zh: string;\n category: string;\n risk_level: number;\n icon: string;\n color: string;\n tiers: Array<{ tier: number; amount: number; label: string; label_zh: string }>;\n supported_cycles: number[];\n default_cycle: number;\n supported_pairs: string[];\n supported_chains: string[];\n is_active: boolean;\n preview: {\n tier: { tier: number; amount: number; label: string };\n cycle: number;\n dailyLots: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n };\n }>;\n agent?: any;\n shareRates?: Record<number, number>;\n }>> {\n const params = new URLSearchParams();\n if (options?.includeInactive) params.set('includeInactive', 'true');\n if (options?.agentId) params.set('agentId', options.agentId);\n const query = params.toString();\n return this.request(`/api/v1/agents${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Calculate subscription parameters for an agent\n */\n async calculateAgentParams(params: {\n agentId: string;\n amount: number;\n cycleDays: number;\n }): Promise<ApiResponse<{\n dailyLots: number;\n effectiveCapital: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n }>> {\n return this.request('/api/v1/agents/calculate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get supported trading pairs from agents\n */\n async getTradingPairs(): Promise<ApiResponse<{\n pairs: string[];\n byAgent: Record<string, string[]>;\n }>> {\n const result = await this.getAgentConfigs();\n if (result.success && result.data?.agents) {\n const allPairs = new Set<string>();\n const byAgent: Record<string, string[]> = {};\n for (const agent of result.data.agents) {\n byAgent[agent.id] = agent.supported_pairs;\n agent.supported_pairs.forEach(p => allPairs.add(p));\n }\n return { success: true, data: { pairs: Array.from(allPairs), byAgent } };\n }\n return { success: false, error: result.error };\n }\n\n // ========== AI Quant Trading ==========\n\n /**\n * Get all AI trading strategies\n */\n async getAIStrategies(filters?: {\n category?: StrategyCategory;\n riskLevel?: number;\n minTvl?: number;\n isActive?: boolean;\n }): Promise<ApiResponse<{ strategies: AIStrategy[] }>> {\n const params = new URLSearchParams();\n if (filters?.category) params.set('category', filters.category);\n if (filters?.riskLevel) params.set('risk_level', String(filters.riskLevel));\n if (filters?.minTvl) params.set('min_tvl', String(filters.minTvl));\n if (filters?.isActive !== undefined) params.set('is_active', String(filters.isActive));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI strategy details\n */\n async getAIStrategy(strategyId: string, include?: ('performance' | 'market' | 'trades')[]): Promise<ApiResponse<{\n strategy: AIStrategy;\n performance?: AINavSnapshot[];\n marketData?: AIMarketData[];\n trades?: AITradeExecution[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get strategy performance history\n */\n async getAIStrategyPerformance(strategyId: string, days = 30): Promise<ApiResponse<{ performance: AINavSnapshot[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=performance&days=${days}`, { method: 'GET' });\n }\n\n /**\n * Get real-time market data for strategy pairs\n */\n async getAIStrategyMarketData(strategyId: string): Promise<ApiResponse<{ marketData: AIMarketData[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=market`, { method: 'GET' });\n }\n\n /**\n * Create AI trading order\n */\n async createAIOrder(request: CreateAIOrderRequest): Promise<ApiResponse<{ order: AIOrder }>> {\n return this.request('/api/v1/ai-quant/orders', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get user's AI orders\n */\n async getAIOrders(filters?: {\n strategyId?: string;\n status?: AIOrderStatus;\n }): Promise<ApiResponse<{ orders: AIOrder[] }>> {\n const params = new URLSearchParams();\n if (filters?.strategyId) params.set('strategy_id', filters.strategyId);\n if (filters?.status) params.set('status', filters.status);\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/orders${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI order details\n */\n async getAIOrder(orderId: string): Promise<ApiResponse<{\n order: AIOrder;\n strategy: AIStrategy;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}`, { method: 'GET' });\n }\n\n /**\n * Pause AI order\n */\n async pauseAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/pause`, { method: 'POST' });\n }\n\n /**\n * Resume AI order\n */\n async resumeAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/resume`, { method: 'POST' });\n }\n\n /**\n * Request redemption for AI order\n */\n async redeemAIOrder(orderId: string): Promise<ApiResponse<{\n success: boolean;\n redemption: AIRedemptionResult;\n message: string;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/redeem`, { method: 'POST' });\n }\n\n /**\n * Get AI portfolio summary\n */\n async getAIPortfolio(include?: ('allocations' | 'orders')[]): Promise<ApiResponse<{\n portfolio: AIPortfolioSummary;\n allocations?: AITradeAllocation[];\n orders?: AIOrder[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/portfolio${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user's trade allocations\n */\n async getAITradeAllocations(limit = 50): Promise<ApiResponse<{ allocations: AITradeAllocation[] }>> {\n return this.request(`/api/v1/ai-quant/portfolio?include=allocations&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get trade history for a strategy\n */\n async getAITradeHistory(strategyId: string, limit = 50): Promise<ApiResponse<{ trades: AITradeExecution[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=trades&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Execute AI signals for a strategy (admin only)\n */\n async executeAISignals(strategyId: string): Promise<ApiResponse<{\n executions: AITradeExecution[];\n count: number;\n message: string;\n }>> {\n return this.request('/api/v1/ai-quant/execute', {\n method: 'POST',\n body: JSON.stringify({ strategyId }),\n });\n }\n\n // ========== Free Price APIs (No API Key Required) ==========\n\n /**\n * Get cryptocurrency prices (FREE - uses CoinGecko/Binance/CoinCap)\n */\n async getCryptoPrices(symbols: string[]): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?symbols=${symbols.join(',')}`, { method: 'GET' });\n }\n\n /**\n * Get single cryptocurrency price (FREE)\n */\n async getCryptoPrice(symbol: string): Promise<ApiResponse<{\n price: {\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n };\n }>> {\n return this.request(`/api/v1/prices/${symbol}`, { method: 'GET' });\n }\n\n /**\n * Get OHLCV candles for charting (FREE - from Binance)\n */\n async getCryptoCandles(\n symbol: string,\n interval: '1m' | '5m' | '15m' | '1h' | '4h' | '1d' = '1h',\n limit = 100\n ): Promise<ApiResponse<{\n symbol: string;\n interval: string;\n candles: Array<{\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n }>;\n }>> {\n return this.request(`/api/v1/prices/${symbol}?candles=true&interval=${interval}&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get top cryptocurrencies by market cap (FREE)\n */\n async getTopCryptos(limit = 20): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?type=top&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get crypto market overview (FREE)\n */\n async getCryptoMarketOverview(): Promise<ApiResponse<{\n overview: {\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n marketCapChange24h: number;\n activeCryptocurrencies: number;\n };\n }>> {\n return this.request('/api/v1/prices?type=overview', { method: 'GET' });\n }\n\n // ========== Project Management ==========\n\n /**\n * Get user's projects\n */\n async getProjects(options?: {\n isActive?: boolean;\n }): Promise<ApiResponse<{ projects: AdminProject[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Create a new project for ecosystem partners\n */\n async createProject(params: {\n name: string;\n slug: string;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request('/api/v1/projects', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get project details\n */\n async getProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project settings\n */\n async updateProject(projectId: string, updates: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get project features status\n */\n async getProjectFeatures(projectId: string): Promise<ApiResponse<{\n features: Record<string, {\n enabled: boolean;\n name: string;\n description: string;\n description_zh: string;\n }>;\n availableFeatures: string[];\n }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, { method: 'GET' });\n }\n\n /**\n * Enable/disable features for a project\n */\n async updateProjectFeatures(projectId: string, features: {\n wallet?: boolean;\n swap?: boolean;\n contracts?: boolean;\n fiat?: boolean;\n payments?: boolean;\n quant?: boolean;\n ai?: boolean;\n x402?: boolean;\n }): Promise<ApiResponse<{ project: AdminProject; message: string }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, {\n method: 'PATCH',\n body: JSON.stringify(features),\n });\n }\n\n /**\n * Regenerate project API key\n */\n async regenerateProjectApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/projects/${projectId}/api-key`, { method: 'POST' });\n }\n\n /**\n * Delete project\n */\n async deleteProject(projectId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'DELETE' });\n }\n}\n\n// Factory function\nexport function createOneEngineClient(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n}): OneEngineClient {\n return new OneEngineClient(options);\n}\n","import { createClient, SupabaseClient } from '@supabase/supabase-js';\nimport { getConfig } from '../config';\n\nlet supabaseInstance: SupabaseClient | null = null;\n\nexport function createSupabaseClient(url?: string, anonKey?: string): SupabaseClient {\n const config = getConfig();\n const supabaseUrl = url || config.supabaseUrl;\n const supabaseAnonKey = anonKey || config.supabaseAnonKey;\n\n if (!supabaseUrl || !supabaseAnonKey) {\n throw new Error('Supabase URL and Anon Key are required');\n }\n\n return createClient(supabaseUrl, supabaseAnonKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n },\n });\n}\n\nexport function getSupabaseClient(): SupabaseClient {\n if (!supabaseInstance) {\n supabaseInstance = createSupabaseClient();\n }\n return supabaseInstance;\n}\n\nexport class SupabaseService {\n private client: SupabaseClient;\n\n constructor(client?: SupabaseClient) {\n this.client = client || getSupabaseClient();\n }\n\n // ===== Auth Methods =====\n async signInWithEmail(email: string) {\n const { data, error } = await this.client.auth.signInWithOtp({\n email,\n options: {\n shouldCreateUser: true,\n },\n });\n return { data, error };\n }\n\n async verifyOtp(email: string, token: string) {\n const { data, error } = await this.client.auth.verifyOtp({\n email,\n token,\n type: 'email',\n });\n return { data, error };\n }\n\n async signOut() {\n const { error } = await this.client.auth.signOut();\n return { error };\n }\n\n async getSession() {\n const { data, error } = await this.client.auth.getSession();\n return { session: data.session, error };\n }\n\n async getUser() {\n const { data, error } = await this.client.auth.getUser();\n return { user: data.user, error };\n }\n\n // ===== User Profile Methods =====\n async getUserProfile(userId: string) {\n const { data, error } = await this.client\n .from('user_profiles')\n .select('*')\n .eq('user_id', userId)\n .single();\n return { data, error };\n }\n\n async updateUserProfile(userId: string, updates: Record<string, any>) {\n const { data, error } = await this.client\n .from('user_profiles')\n .update(updates)\n .eq('user_id', userId)\n .select()\n .single();\n return { data, error };\n }\n\n // ===== Transaction Methods =====\n async getTransactions(userId: string, limit = 50) {\n const { data, error } = await this.client\n .from('transactions')\n .select('*')\n .eq('user_id', userId)\n .order('created_at', { ascending: false })\n .limit(limit);\n return { data, error };\n }\n\n async createTransaction(transaction: Record<string, any>) {\n const { data, error } = await this.client\n .from('transactions')\n .insert(transaction)\n .select()\n .single();\n return { data, error };\n }\n\n // ===== AI Trading Methods =====\n async getStrategies(status = 'active') {\n const { data, error } = await this.client\n .from('ai_strategies')\n .select('*')\n .eq('status', status)\n .order('total_aum', { ascending: false });\n return { data, error };\n }\n\n async getStrategyById(strategyId: string) {\n const { data, error } = await this.client\n .from('ai_strategies')\n .select('*')\n .eq('id', strategyId)\n .single();\n return { data, error };\n }\n\n async getUserOrders(userId: string) {\n const { data, error } = await this.client\n .from('ai_orders')\n .select(`*, ai_strategies (name)`)\n .eq('user_id', userId)\n .order('created_at', { ascending: false });\n return { data, error };\n }\n\n async createOrder(order: Record<string, any>) {\n const { data, error } = await this.client\n .from('ai_orders')\n .insert(order)\n .select()\n .single();\n return { data, error };\n }\n\n // ===== Card Methods =====\n async getUserCards(userId: string) {\n const { data, error } = await this.client\n .from('cards')\n .select('*')\n .eq('user_id', userId)\n .order('created_at', { ascending: false });\n return { data, error };\n }\n\n // ===== Realtime Subscriptions =====\n subscribeToTransactions(userId: string, callback: (payload: any) => void) {\n return this.client\n .channel(`transactions:${userId}`)\n .on(\n 'postgres_changes',\n {\n event: '*',\n schema: 'public',\n table: 'transactions',\n filter: `user_id=eq.${userId}`,\n },\n callback\n )\n .subscribe();\n }\n\n unsubscribe(channel: ReturnType<typeof this.client.channel>) {\n return this.client.removeChannel(channel);\n }\n}\n","import { COINGECKO_IDS } from '../config';\nimport type { TokenPrice } from '../types';\n\nconst COINGECKO_API = 'https://api.coingecko.com/api/v3';\n\n// Fallback prices when API is unavailable\nconst FALLBACK_PRICES: Record<string, number> = {\n ETH: 3500,\n BTC: 95000,\n BNB: 700,\n MATIC: 0.5,\n AVAX: 40,\n USDT: 1,\n USDC: 1,\n DAI: 1,\n WBTC: 95000,\n WETH: 3500,\n ARB: 1.2,\n OP: 2.5,\n LINK: 20,\n UNI: 12,\n AAVE: 250,\n SOL: 200,\n};\n\nexport class PriceService {\n private cache: Map<string, { price: TokenPrice; timestamp: number }> = new Map();\n private cacheTTL = 60 * 1000; // 1 minute cache\n\n async getPrice(symbol: string): Promise<TokenPrice> {\n const upperSymbol = symbol.toUpperCase();\n\n // Check cache first\n const cached = this.cache.get(upperSymbol);\n if (cached && Date.now() - cached.timestamp < this.cacheTTL) {\n return cached.price;\n }\n\n const coinId = COINGECKO_IDS[upperSymbol];\n if (!coinId) {\n return this.getFallbackPrice(upperSymbol);\n }\n\n try {\n const response = await fetch(\n `${COINGECKO_API}/simple/price?ids=${coinId}&vs_currencies=usd&include_24hr_change=true&include_market_cap=true&include_24hr_vol=true`,\n { headers: { Accept: 'application/json' } }\n );\n\n if (!response.ok) {\n throw new Error(`CoinGecko API error: ${response.status}`);\n }\n\n const data = await response.json();\n const coinData = data[coinId];\n\n if (!coinData) {\n return this.getFallbackPrice(upperSymbol);\n }\n\n const change24h = coinData.usd_24h_change || 0;\n const price: TokenPrice = {\n symbol: upperSymbol,\n price: coinData.usd || 0,\n change24h,\n changePercent24h: change24h,\n priceChange24h: change24h,\n marketCap: coinData.usd_market_cap,\n volume24h: coinData.usd_24h_vol,\n };\n\n this.cache.set(upperSymbol, { price, timestamp: Date.now() });\n return price;\n } catch (error) {\n console.warn(`Failed to fetch price for ${upperSymbol}:`, error);\n return this.getFallbackPrice(upperSymbol);\n }\n }\n\n async getPrices(symbols: string[]): Promise<Record<string, TokenPrice>> {\n const results: Record<string, TokenPrice> = {};\n\n // Group symbols by whether they have CoinGecko IDs\n const withIds: string[] = [];\n const withoutIds: string[] = [];\n\n for (const symbol of symbols) {\n const upper = symbol.toUpperCase();\n if (COINGECKO_IDS[upper]) {\n withIds.push(upper);\n } else {\n withoutIds.push(upper);\n }\n }\n\n // Handle symbols without CoinGecko IDs\n for (const symbol of withoutIds) {\n results[symbol] = this.getFallbackPrice(symbol);\n }\n\n if (withIds.length === 0) {\n return results;\n }\n\n // Fetch prices in batch for symbols with IDs\n const coinIds = withIds.map((s) => COINGECKO_IDS[s]).join(',');\n\n try {\n const response = await fetch(\n `${COINGECKO_API}/simple/price?ids=${coinIds}&vs_currencies=usd&include_24hr_change=true`,\n { headers: { Accept: 'application/json' } }\n );\n\n if (!response.ok) {\n throw new Error(`CoinGecko API error: ${response.status}`);\n }\n\n const data = await response.json();\n\n for (const symbol of withIds) {\n const coinId = COINGECKO_IDS[symbol];\n const coinData = data[coinId];\n\n if (coinData) {\n const change24h = coinData.usd_24h_change || 0;\n results[symbol] = {\n symbol,\n price: coinData.usd || 0,\n change24h,\n changePercent24h: change24h,\n priceChange24h: change24h,\n };\n } else {\n results[symbol] = this.getFallbackPrice(symbol);\n }\n }\n } catch (error) {\n console.warn('Failed to fetch batch prices:', error);\n for (const symbol of withIds) {\n results[symbol] = this.getFallbackPrice(symbol);\n }\n }\n\n return results;\n }\n\n private getFallbackPrice(symbol: string): TokenPrice {\n const price = FALLBACK_PRICES[symbol] || 0;\n return {\n symbol,\n price,\n change24h: 0,\n changePercent24h: 0,\n priceChange24h: 0,\n };\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n}\n\n// Singleton instance\nexport const priceService = new PriceService();\n","/**\n * Usage Tracking Service\n * Tracks AI usage for Personal Assistant and Trading Agent\n */\n\nimport { getConfig } from '../config';\n\n// Usage categories (internal)\nexport type UsageCategory =\n | 'wallet'\n | 'payment'\n | 'exchange_onramper'\n | 'exchange_swap'\n | 'ai_thirdweb'\n | 'ai_trading_engine';\n\n// Display categories (client-facing)\nexport type DisplayCategory = 'personal_assistant' | 'trading_agent';\n\nexport interface UsageRecord {\n userId: string;\n category: UsageCategory;\n action: string;\n requestTokens?: number;\n responseTokens?: number;\n creditsUsed?: number;\n metadata?: Record<string, any>;\n}\n\nexport interface UsageSummary {\n personal_assistant: {\n requestCount: number;\n totalTokens: number;\n totalCredits: number;\n };\n trading_agent: {\n requestCount: number;\n totalTokens: number;\n totalCredits: number;\n };\n}\n\nexport interface UsageActivity {\n type: DisplayCategory;\n action: string;\n tokens: number;\n credits: number;\n timestamp: string;\n}\n\nexport interface UsageResponse {\n summary: UsageSummary;\n dailyBreakdown: Array<{\n date: string;\n personal_assistant: number;\n trading_agent: number;\n }>;\n recentActivity: UsageActivity[];\n period: {\n days: number;\n startDate: string;\n endDate: string;\n };\n}\n\n/**\n * Usage Tracking Service\n */\nexport class UsageService {\n private baseUrl: string;\n private userId: string | null = null;\n\n constructor(baseUrl?: string) {\n this.baseUrl = baseUrl || getConfig().oneEngineUrl || '';\n }\n\n /**\n * Set the current user ID for tracking\n */\n setUserId(userId: string): void {\n this.userId = userId;\n }\n\n /**\n * Record Personal Assistant usage (Thirdweb AI)\n */\n async trackPersonalAssistant(\n action: string,\n tokens?: { request?: number; response?: number },\n credits?: number,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'ai_thirdweb',\n action,\n requestTokens: tokens?.request,\n responseTokens: tokens?.response,\n creditsUsed: credits,\n metadata,\n });\n }\n\n /**\n * Record Trading Agent usage (Engine AI)\n */\n async trackTradingAgent(\n action: string,\n credits?: number,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'ai_trading_engine',\n action,\n creditsUsed: credits,\n metadata,\n });\n }\n\n /**\n * Record wallet operation usage\n */\n async trackWallet(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'wallet',\n action,\n metadata,\n });\n }\n\n /**\n * Record payment usage\n */\n async trackPayment(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'payment',\n action,\n metadata,\n });\n }\n\n /**\n * Record exchange usage (onramper)\n */\n async trackOnramper(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'exchange_onramper',\n action,\n metadata,\n });\n }\n\n /**\n * Record exchange usage (swap)\n */\n async trackSwap(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'exchange_swap',\n action,\n metadata,\n });\n }\n\n /**\n * Record any usage\n */\n async recordUsage(record: UsageRecord): Promise<boolean> {\n if (!record.userId) {\n console.warn('[UsageService] No userId set, skipping usage tracking');\n return false;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/api/v1/usage/user`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n userId: record.userId,\n category: record.category,\n action: record.action,\n requestTokens: record.requestTokens || 0,\n responseTokens: record.responseTokens || 0,\n creditsUsed: record.creditsUsed || 0,\n metadata: record.metadata || {},\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n console.error('[UsageService] Failed to record usage:', error);\n return false;\n }\n\n return true;\n } catch (error) {\n console.error('[UsageService] Error recording usage:', error);\n return false;\n }\n }\n\n /**\n * Get AI usage summary for current user\n */\n async getAIUsage(days: number = 30): Promise<UsageResponse | null> {\n if (!this.userId) {\n console.warn('[UsageService] No userId set');\n return null;\n }\n\n try {\n const response = await fetch(\n `${this.baseUrl}/api/v1/usage/user?userId=${this.userId}&days=${days}`\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n console.error('[UsageService] Failed to get usage:', error);\n return null;\n }\n\n const result = await response.json();\n return result.data;\n } catch (error) {\n console.error('[UsageService] Error getting usage:', error);\n return null;\n }\n }\n}\n\n// Singleton instance\nlet usageServiceInstance: UsageService | null = null;\n\nexport function getUsageService(): UsageService {\n if (!usageServiceInstance) {\n usageServiceInstance = new UsageService();\n }\n return usageServiceInstance;\n}\n\nexport function createUsageService(baseUrl?: string): UsageService {\n return new UsageService(baseUrl);\n}\n","// ForexSimulationEngine.ts - StableFX RFQ+PvP on-chain forex simulation engine\n// Simulates Circle StableFX-style foreign exchange operations using USDC stablecoin pairs\n\nimport type {\n ForexLogEntry,\n ForexLogType,\n ForexCurrencyPair,\n ForexTradeRecord,\n ForexPosition,\n ForexPoolTransaction,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS } from '../../types/forex';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ntype LogCallback = (entry: ForexLogEntry) => void;\ntype PoolTxCallback = (tx: ForexPoolTransaction) => void;\n\ninterface PairState {\n pair: ForexCurrencyPair;\n currentPrice: number;\n bidPrice: number;\n askPrice: number;\n lastSpread: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `fxlog_${Date.now()}_${++idCounter}`;\n}\n\nfunction tradeId(): string {\n return `FXT_${Date.now().toString(36).toUpperCase()}_${(++idCounter).toString(36).toUpperCase()}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction formatRate(price: number, pair: ForexCurrencyPair): string {\n if (pair.pipSize >= 0.01) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── News Headlines ───────────────────────────────────────────────────────────\n\nconst FX_NEWS = [\n 'ECB signals potential rate adjustment, EUR pairs volatile',\n 'BOJ maintains yield curve control, JPY weakens further',\n 'Fed minutes reveal hawkish sentiment, USD strengthens',\n 'UK CPI data beats expectations, GBP rallies',\n 'RBA holds rates steady, AUD consolidates',\n 'SNB intervenes in currency markets, CHF stabilizes',\n 'Bank of Canada rate decision pending, CAD in focus',\n 'Cross-border stablecoin settlement volume hits $2.1B daily',\n 'Circle USDC reserves fully backed, attestation report released',\n 'DeFi forex protocol TVL reaches new high at $890M',\n 'On-chain FX liquidity deepens across major pairs',\n 'Institutional adoption of on-chain forex accelerates',\n];\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass ForexSimulationEngine {\n private listeners: LogCallback[] = [];\n private poolTxListeners: PoolTxCallback[] = [];\n private cycleTimer: ReturnType<typeof setTimeout> | null = null;\n private pairStates: Map<string, PairState> = new Map();\n private running = false;\n private openPositions: ForexPosition[] = [];\n private totalPnl = 0;\n private totalTrades = 0;\n private totalPips = 0;\n private totalLots = 0;\n\n constructor() {\n for (const pair of FOREX_CURRENCY_PAIRS) {\n const jitter = pair.basePrice * rand(-0.003, 0.003);\n const price = pair.basePrice + jitter;\n const halfSpread = pair.spreadPips * pair.pipSize / 2;\n this.pairStates.set(pair.id, {\n pair,\n currentPrice: price,\n bidPrice: price - halfSpread,\n askPrice: price + halfSpread,\n lastSpread: pair.spreadPips,\n });\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n start(): void {\n this.running = true;\n this.scheduleCycle();\n }\n\n stop(): void {\n this.running = false;\n if (this.cycleTimer) {\n clearTimeout(this.cycleTimer);\n this.cycleTimer = null;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n onPoolTransaction(callback: PoolTxCallback): () => void {\n this.poolTxListeners.push(callback);\n return () => {\n this.poolTxListeners = this.poolTxListeners.filter(l => l !== callback);\n };\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getStats(): { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number; positions: number } {\n return {\n totalPnl: this.totalPnl,\n totalTrades: this.totalTrades,\n totalPips: this.totalPips,\n totalLots: this.totalLots,\n positions: this.openPositions.length,\n };\n }\n\n getPairStates(): Map<string, PairState> {\n return this.pairStates;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing StableFX Engine v2.1.0...', delay: 0 },\n { msg: 'Connecting to Circle StableFX RFQ network...', delay: 500 },\n { msg: 'Loading USDC stablecoin pair feeds (6 pairs)...', delay: 1200 },\n { msg: 'Calibrating PvP settlement engine...', delay: 2000 },\n { msg: 'Initializing clearing pool ($12.5M)...', delay: 2800 },\n { msg: 'Initializing hedging pool ($7.5M)...', delay: 3400 },\n { msg: 'Initializing insurance pool ($5.0M)...', delay: 4000 },\n { msg: 'Risk management module online (max exposure: 25%)', delay: 4500 },\n { msg: '=== StableFX Engine ready. Starting RFQ cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.poolTxListeners = [];\n this.pairStates.clear();\n this.openPositions = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: ForexLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private emitPoolTx(tx: ForexPoolTransaction): void {\n for (const listener of this.poolTxListeners) {\n listener(tx);\n }\n }\n\n private generatePoolTxFromEvent(\n type: 'SETTLE' | 'HEDGE' | 'CLEAR',\n data: { pnl?: number; volume?: number; lots?: number },\n ): void {\n try {\n const { ForexPoolDataGenerator } = require('./ForexPoolDataGenerator');\n const generator = ForexPoolDataGenerator.getInstance();\n\n if (type === 'SETTLE' && data.pnl !== undefined) {\n const tx = generator.generateLiveTransaction('clearing', 'fee_collection', Math.abs(data.pnl) * rand(0.001, 0.003));\n this.emitPoolTx(tx);\n } else if (type === 'HEDGE') {\n const tx = generator.generateLiveTransaction('hedging', data.pnl && data.pnl < 0 ? 'loss_absorption' : 'profit_distribution', Math.abs(data.lots || 1) * rand(50, 200));\n this.emitPoolTx(tx);\n } else if (type === 'CLEAR') {\n const tx = generator.generateLiveTransaction('clearing', 'profit_distribution', (data.volume || 100000) * rand(0.0001, 0.0005));\n this.emitPoolTx(tx);\n }\n } catch {\n // Generator not available\n }\n }\n\n private scheduleCycle(): void {\n if (!this.running) return;\n const interval = rand(8000, 14000);\n this.cycleTimer = setTimeout(() => {\n if (this.running) {\n this.runTradeCycle();\n this.scheduleCycle();\n }\n }, interval);\n }\n\n private simulatePrice(pairId: string): number {\n const state = this.pairStates.get(pairId);\n if (!state) return 0;\n const volatility = state.pair.id.includes('JPYC') ? 0.0008 : 0.0004;\n const drift = rand(-volatility, volatility);\n const newPrice = state.currentPrice * (1 + drift);\n const halfSpread = (state.pair.spreadPips + rand(-0.3, 0.3)) * state.pair.pipSize / 2;\n state.currentPrice = newPrice;\n state.bidPrice = newPrice - halfSpread;\n state.askPrice = newPrice + halfSpread;\n state.lastSpread = halfSpread * 2 / state.pair.pipSize;\n return newPrice;\n }\n\n private runTradeCycle(): void {\n const pairState = pick(Array.from(this.pairStates.values()));\n const pair = pairState.pair;\n const entries: Array<{ entry: Omit<ForexLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // Update price\n const price = this.simulatePrice(pair.id);\n\n // 1. RFQ - Request for Quote\n const side = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat((rand(0.1, 2.5)).toFixed(2));\n const notional = lots * 100000;\n const rfqId = tradeId();\n\n entries.push({\n entry: {\n type: 'RFQ',\n message: `RFQ ${rfqId} | ${pair.symbol} ${side} ${lots.toFixed(2)} lots ($${(notional / 1000).toFixed(0)}K) | Mid: ${formatRate(price, pair)}`,\n data: { rfqId, pair: pair.id, side, lots, price },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(400, 800);\n\n // 2. QUOTE - Price quote from LP\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY'\n ? price + quoteSpread\n : price - quoteSpread;\n const quotePips = Math.abs(quotePrice - price) / pair.pipSize;\n\n entries.push({\n entry: {\n type: 'QUOTE',\n message: `QUOTE ${rfqId} | ${pair.symbol} @ ${formatRate(quotePrice, pair)} | Spread: ${quotePips.toFixed(1)} pips | Valid: 3s`,\n data: { rfqId, quotePrice, spread: quotePips },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(500, 1000);\n\n // 3. MATCH - Trade matching (85% success rate)\n const matched = Math.random() < 0.85;\n if (matched) {\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH ${rfqId} | ${pair.symbol} ${side} @ ${formatRate(matchPrice, pair)} | ${lots.toFixed(2)} lots | Counterparty: LP-${randInt(1, 8)}`,\n data: { rfqId, matchPrice, counterparty: `LP-${randInt(1, 8)}` },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(1000, 2500);\n\n // 4. SETTLE - PvP Settlement\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - price) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n entries.push({\n entry: {\n type: 'SETTLE',\n message: `SETTLE ${rfqId} | PvP confirmed | ${pair.symbol} @ ${formatRate(settlePrice, pair)} | P&L: ${pips >= 0 ? '+' : ''}${pips.toFixed(1)} pips ($${pnl >= 0 ? '+' : ''}${pnl.toFixed(2)})`,\n data: { rfqId, settlePrice, pips, pnl, pvp: true },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(300, 600);\n\n // 5. PVP - Settlement confirmation\n entries.push({\n entry: {\n type: 'PVP',\n message: `PvP ${rfqId} | Atomic settlement confirmed on-chain | USDC transferred: $${notional.toLocaleString()} | Gas: ~$0.${randInt(10, 50)}`,\n data: { rfqId, settled: true, gasWei: randInt(10, 50) },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n\n // Generate pool transaction for settlement\n this.generatePoolTxFromEvent('SETTLE', { pnl });\n\n // Update stats\n this.totalTrades++;\n this.totalPnl += pnl;\n this.totalPips += pips;\n this.totalLots += lots;\n\n // Update positions\n if (Math.random() < 0.4) {\n this.openPositions.push({\n id: rfqId,\n pairId: pair.id,\n side: side as 'BUY' | 'SELL',\n lots,\n pips,\n entryPrice: matchPrice,\n currentPrice: settlePrice,\n pnl,\n openTime: Date.now(),\n });\n if (this.openPositions.length > 5) {\n this.openPositions.shift();\n }\n }\n } else {\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH FAILED ${rfqId} | ${pair.symbol} | No counterparty at requested price | Requoting...`,\n data: { rfqId, matched: false },\n importance: 'low',\n pairId: pair.id,\n },\n delay,\n });\n }\n\n // 6. HEDGE - Pool hedging operations (20% chance)\n if (Math.random() < 0.2) {\n delay += rand(400, 800);\n const hedgePair = pick(FOREX_CURRENCY_PAIRS);\n const hedgeLots = parseFloat(rand(0.5, 5.0).toFixed(2));\n const hedgeDirection = Math.random() > 0.5 ? 'LONG' : 'SHORT';\n entries.push({\n entry: {\n type: 'HEDGE',\n message: `HEDGE | ${hedgePair.symbol} ${hedgeDirection} ${hedgeLots.toFixed(2)} lots | Pool delta neutralization | Exposure: ${rand(5, 20).toFixed(1)}%`,\n data: { pair: hedgePair.id, direction: hedgeDirection, lots: hedgeLots },\n importance: 'medium',\n },\n delay,\n });\n this.generatePoolTxFromEvent('HEDGE', { lots: hedgeLots });\n }\n\n // 7. CLEAR - Clearing pool operations (15% chance)\n if (Math.random() < 0.15) {\n delay += rand(300, 600);\n const clearAmount = randInt(50000, 500000);\n entries.push({\n entry: {\n type: 'CLEAR',\n message: `CLEAR | Netting cycle complete | Volume: $${(clearAmount / 1000).toFixed(0)}K | Pairs settled: ${randInt(2, 6)} | Pool util: ${rand(60, 85).toFixed(1)}%`,\n data: { volume: clearAmount, pairsSettled: randInt(2, 6) },\n importance: 'low',\n },\n delay,\n });\n this.generatePoolTxFromEvent('CLEAR', { volume: clearAmount });\n }\n\n // 8. POSITION - Position update (25% chance)\n if (this.openPositions.length > 0 && Math.random() < 0.25) {\n delay += rand(300, 600);\n const posUpdates = this.openPositions.slice(0, 3).map(pos => {\n const pState = this.pairStates.get(pos.pairId);\n if (pState) {\n pos.currentPrice = pState.currentPrice;\n pos.pips = ((pos.currentPrice - pos.entryPrice) / pState.pair.pipSize) * (pos.side === 'BUY' ? 1 : -1);\n pos.pnl = pos.pips * pState.pair.pipSize * pos.lots * 100000;\n }\n return `${pState?.pair.symbol || pos.pairId} ${pos.side}: ${pos.pips >= 0 ? '+' : ''}${pos.pips.toFixed(1)} pips`;\n });\n entries.push({\n entry: {\n type: 'POSITION',\n message: `POSITION | ${posUpdates.join(' | ')} | Open: ${this.openPositions.length}`,\n data: { positions: this.openPositions.length },\n importance: 'low',\n },\n delay,\n });\n\n // Close old positions\n if (this.openPositions.length > 2 && Math.random() < 0.3) {\n const closed = this.openPositions.shift()!;\n this.totalPnl += closed.pnl * rand(0.01, 0.03);\n }\n }\n\n // 9. PNL - Periodic P&L summary (30% chance)\n if (Math.random() < 0.3) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'PNL',\n message: `PNL | Session: $${this.totalPnl >= 0 ? '+' : ''}${this.totalPnl.toFixed(2)} | Trades: ${this.totalTrades} | Pips: ${this.totalPips >= 0 ? '+' : ''}${this.totalPips.toFixed(1)} | Lots: ${this.totalLots.toFixed(2)}`,\n data: { totalPnl: this.totalPnl, totalTrades: this.totalTrades, totalPips: this.totalPips },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 10. NEWS (10% chance)\n if (Math.random() < 0.1) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'SYSTEM',\n message: `[Market] ${pick(FX_NEWS)}`,\n importance: 'medium',\n },\n delay,\n });\n }\n\n // Emit all entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nexport const forexSimulationEngine = new ForexSimulationEngine();\nexport type { PairState };\n","/**\n * ONE SDK - Forex Trading Services\n * Simulation engines and data generators for StableFX on-chain forex\n */\n\n// Forex RFQ+PvP Simulation Engine\nexport { forexSimulationEngine } from './ForexSimulationEngine';\nexport type { PairState } from './ForexSimulationEngine';\n\n// Pool Data Generator (historical snapshots & transactions)\nexport { ForexPoolDataGenerator } from './ForexPoolDataGenerator';\n\n// Bot Simulation Engine (AI crypto trading strategies)\nexport { botSimulationEngine, STRATEGY_PERSONALITIES } from './BotSimulationEngine';\nexport type {\n BotLogType,\n BotLogEntry,\n IndicatorSnapshot,\n BotState,\n StrategyPersonality,\n} from './BotSimulationEngine';\n","// BotSimulationEngine.ts - Core simulation engine for trading bot console\n// Runs independent simulation loops for each strategy bot with distinct personalities\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport type BotLogType =\n | 'SCAN'\n | 'INDICATOR'\n | 'NEWS'\n | 'SIGNAL'\n | 'ANALYSIS'\n | 'DECISION'\n | 'ORDER'\n | 'FILLED'\n | 'PNL'\n | 'RISK'\n | 'SYSTEM'\n | 'STRATEGY' // Strategy reasoning and context\n | 'THINKING'; // AI thinking process\n\nexport interface BotLogEntry {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n type: BotLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface IndicatorSnapshot {\n rsi: number;\n macd: { value: number; signal: number; histogram: number };\n ema: { short: number; long: number; crossover: 'golden' | 'death' | 'none' };\n bollinger: { upper: number; middle: number; lower: number; width: number; position: number };\n volume: { current: number; average: number; ratio: number };\n}\n\nexport interface BotState {\n strategyId: string;\n strategyName: string;\n isRunning: boolean;\n currentPair: string;\n currentPrice: number;\n indicators: IndicatorSnapshot;\n openPositions: OpenPosition[];\n totalPnl: number;\n totalTrades: number;\n winRate: number;\n lastSignal: string;\n lastSignalConfidence: number;\n}\n\ninterface OpenPosition {\n id: string;\n pair: string;\n side: 'LONG' | 'SHORT';\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n pnl: number;\n pnlPercent: number;\n}\n\nexport interface StrategyPersonality {\n id: string;\n name: string;\n shortName: string;\n color: string;\n scanIntervalMin: number;\n scanIntervalMax: number;\n tradeFrequency: number;\n positionSizeMin: number;\n positionSizeMax: number;\n leverageMin: number;\n leverageMax: number;\n primaryIndicators: string[];\n riskTolerance: 'low' | 'medium' | 'high';\n preferredPairs: string[];\n rsiBias: number;\n}\n\ntype LogCallback = (entry: BotLogEntry) => void;\n\n// ── Strategy Personalities ─────────────────────────────────────────────────────\n\nexport const STRATEGY_PERSONALITIES: StrategyPersonality[] = [\n {\n id: 'balanced-01',\n name: 'Balanced Alpha',\n shortName: 'BAL',\n color: '#3B82F6',\n scanIntervalMin: 25000, // Slower: 25-40s between cycles\n scanIntervalMax: 40000,\n tradeFrequency: 0.4,\n positionSizeMin: 15,\n positionSizeMax: 35,\n leverageMin: 3,\n leverageMax: 10,\n primaryIndicators: ['RSI', 'MACD'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT'],\n rsiBias: 50,\n },\n {\n id: 'conservative-01',\n name: 'Conservative Shield',\n shortName: 'CON',\n color: '#10B981',\n scanIntervalMin: 35000, // Slower: 35-55s between cycles\n scanIntervalMax: 55000,\n tradeFrequency: 0.25,\n positionSizeMin: 10,\n positionSizeMax: 20,\n leverageMin: 2,\n leverageMax: 5,\n primaryIndicators: ['Bollinger', 'Volume'],\n riskTolerance: 'low',\n preferredPairs: ['BTC/USDT', 'ETH/USDT'],\n rsiBias: 45,\n },\n {\n id: 'aggressive-01',\n name: 'Aggressive Momentum',\n shortName: 'AGG',\n color: '#EF4444',\n scanIntervalMin: 18000, // Slower: 18-30s between cycles\n scanIntervalMax: 30000,\n tradeFrequency: 0.5,\n positionSizeMin: 25,\n positionSizeMax: 50,\n leverageMin: 5,\n leverageMax: 20,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'DOGE/USDT', 'AVAX/USDT'],\n rsiBias: 55,\n },\n];\n\n// ── Trading pairs with base prices ─────────────────────────────────────────────\n\nconst PAIR_PRICES: Record<string, number> = {\n 'BTC/USDT': 67500,\n 'ETH/USDT': 3450,\n 'BNB/USDT': 605,\n 'SOL/USDT': 178,\n 'XRP/USDT': 0.62,\n 'DOGE/USDT': 0.165,\n 'ADA/USDT': 0.45,\n 'AVAX/USDT': 38.5,\n 'ARB/USDT': 1.18,\n 'MATIC/USDT': 0.72,\n 'LINK/USDT': 14.5,\n 'UNI/USDT': 7.8,\n 'AAVE/USDT': 92,\n 'OP/USDT': 2.45,\n 'APT/USDT': 8.9,\n 'INJ/USDT': 24.5,\n 'TIA/USDT': 11.2,\n 'SUI/USDT': 1.65,\n 'DOT/USDT': 7.2,\n 'ATOM/USDT': 9.8,\n 'FIL/USDT': 5.6,\n 'LTC/USDT': 72,\n 'NEAR/USDT': 5.1,\n 'FTM/USDT': 0.42,\n};\n\nconst CHAIN_INFO: Record<string, { name: string; shortName: string; icon: string }> = {\n ethereum: { name: 'Ethereum', shortName: 'ETH', icon: 'Ξ' },\n arbitrum: { name: 'Arbitrum', shortName: 'ARB', icon: '◆' },\n bsc: { name: 'BSC', shortName: 'BSC', icon: '◆' },\n base: { name: 'Base', shortName: 'BASE', icon: '●' },\n polygon: { name: 'Polygon', shortName: 'POLY', icon: '⬡' },\n optimism: { name: 'Optimism', shortName: 'OP', icon: '◉' },\n avalanche: { name: 'Avalanche', shortName: 'AVAX', icon: '▲' },\n linea: { name: 'Linea', shortName: 'LINEA', icon: '═' },\n zksync: { name: 'zkSync', shortName: 'ZK', icon: '⬢' },\n scroll: { name: 'Scroll', shortName: 'SCRL', icon: '◎' },\n};\n\nconst NEWS_HEADLINES = [\n 'Fed signals potential rate pause, crypto markets react positively',\n 'Major institutional investor increases BTC allocation by 15%',\n 'On-chain data shows whale accumulation pattern forming',\n 'DeFi TVL reaches new monthly high across major protocols',\n 'Exchange outflows surge as holders move to cold storage',\n 'Options market signals increased volatility expected this week',\n 'Mining difficulty adjustment approaching, hash rate stable',\n 'Regulatory clarity in EU boosts market sentiment',\n 'Stablecoin supply expanding, potential bullish indicator',\n 'Social sentiment score shifts to extreme greed zone',\n 'Cross-chain bridge volume hits record daily high',\n 'Layer 2 adoption metrics show 40% MoM growth',\n];\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `log_${Date.now()}_${++idCounter}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val));\n}\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) return price.toFixed(2);\n if (price >= 1) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass BotSimulationEngine {\n private listeners: LogCallback[] = [];\n private botTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private botStates: Map<string, BotState> = new Map();\n private priceState: Map<string, number> = new Map();\n private indicatorState: Map<string, IndicatorSnapshot> = new Map();\n private running = false;\n private userPairs: string[] = [];\n private userChains: string[] = [];\n\n constructor() {\n // Initialize prices with some jitter\n for (const [pair, base] of Object.entries(PAIR_PRICES)) {\n this.priceState.set(pair, base * (1 + rand(-0.02, 0.02)));\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n getStrategies(): StrategyPersonality[] {\n return STRATEGY_PERSONALITIES;\n }\n\n start(strategyIds?: string[], userPairs?: string[], userChains?: string[]): void {\n this.running = true;\n // Convert pair IDs (e.g. 'BTC') to full symbols (e.g. 'BTC/USDT') if needed\n this.userPairs = (userPairs || [])\n .map(p => p.includes('/') ? p : `${p}/USDT`)\n .filter(p => p in PAIR_PRICES);\n this.userChains = (userChains || []).filter(c => c in CHAIN_INFO);\n const strategies = strategyIds\n ? STRATEGY_PERSONALITIES.filter(s => strategyIds.includes(s.id))\n : STRATEGY_PERSONALITIES;\n\n for (const strategy of strategies) {\n this.initBotState(strategy);\n this.scheduleCycle(strategy);\n }\n }\n\n stop(strategyIds?: string[]): void {\n const ids = strategyIds || Array.from(this.botTimers.keys());\n for (const id of ids) {\n const timer = this.botTimers.get(id);\n if (timer) {\n clearTimeout(timer);\n this.botTimers.delete(id);\n }\n }\n if (!strategyIds) {\n this.running = false;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n getBotState(strategyId: string): BotState | undefined {\n return this.botStates.get(strategyId);\n }\n\n getAllBotStates(): Map<string, BotState> {\n return this.botStates;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing ONE Trading Engine v3.2.1...', delay: 0 },\n { msg: 'Loading market data feeds...', delay: 500 },\n { msg: 'Connecting to exchange WebSocket streams...', delay: 1200 },\n { msg: 'Calibrating indicator engines (RSI, MACD, EMA, Bollinger)...', delay: 2000 },\n { msg: 'Loading strategy personalities: balanced-01, conservative-01, aggressive-01', delay: 2800 },\n { msg: 'Risk management module initialized (max drawdown: 15%)', delay: 3600 },\n { msg: 'Portfolio allocation engine ready', delay: 4200 },\n { msg: '=== All systems online. Starting trading cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n strategyId: 'system',\n strategyName: 'SYSTEM',\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.botStates.clear();\n this.priceState.clear();\n this.indicatorState.clear();\n this.userPairs = [];\n this.userChains = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: BotLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private getActivePairs(strategy: StrategyPersonality): string[] {\n return this.userPairs.length > 0 ? this.userPairs : strategy.preferredPairs;\n }\n\n private getActiveChain(): string {\n const chains = this.userChains.length > 0\n ? this.userChains\n : ['ethereum', 'arbitrum', 'bsc'];\n return pick(chains);\n }\n\n private getChainLabel(chainId: string): string {\n const info = CHAIN_INFO[chainId];\n return info ? info.shortName : chainId;\n }\n\n private initBotState(strategy: StrategyPersonality): void {\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n this.botStates.set(strategy.id, {\n strategyId: strategy.id,\n strategyName: strategy.name,\n isRunning: true,\n currentPair: pair,\n currentPrice: price,\n indicators,\n openPositions: [],\n totalPnl: rand(-50, 200),\n totalTrades: randInt(5, 25),\n winRate: rand(0.48, 0.68),\n lastSignal: 'HOLD',\n lastSignalConfidence: 0,\n });\n }\n\n private scheduleCycle(strategy: StrategyPersonality): void {\n if (!this.running) return;\n const interval = rand(strategy.scanIntervalMin, strategy.scanIntervalMax);\n const timer = setTimeout(() => {\n if (this.running) {\n this.runBotCycle(strategy);\n this.scheduleCycle(strategy);\n }\n }, interval);\n this.botTimers.set(strategy.id, timer);\n }\n\n private async runBotCycle(strategy: StrategyPersonality): Promise<void> {\n const state = this.botStates.get(strategy.id);\n if (!state) return;\n\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.simulatePrice(pair);\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n state.currentPair = pair;\n state.currentPrice = price;\n state.indicators = indicators;\n\n const entries: Array<{ entry: Omit<BotLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // 1. SCAN - Always (slower delay)\n const chain = this.getActiveChain();\n const chainLabel = this.getChainLabel(chain);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SCAN',\n message: `Scanning ${pair} on ${chainLabel} | Price: $${formatPrice(price)}`,\n data: { pair, chain, chainLabel },\n importance: 'low',\n },\n delay,\n });\n delay += rand(800, 1500); // Slower: 0.8-1.5s\n\n // 2. THINKING - AI reasoning process (new)\n const thinkingMessages = this.generateThinkingProcess(strategy, pair, price);\n for (const thinking of thinkingMessages) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'THINKING',\n message: thinking,\n importance: 'low',\n },\n delay,\n });\n delay += rand(600, 1200); // 0.6-1.2s between thoughts\n }\n\n // 3. INDICATOR - Always (slower delay)\n const indicatorParts = [];\n if (strategy.primaryIndicators.includes('RSI') || strategy.primaryIndicators.includes('MACD')) {\n indicatorParts.push(`RSI: ${indicators.rsi.toFixed(1)}`);\n }\n if (strategy.primaryIndicators.includes('MACD') || strategy.primaryIndicators.includes('RSI')) {\n indicatorParts.push(`MACD: ${indicators.macd.histogram > 0 ? '+' : ''}${indicators.macd.histogram.toFixed(3)}`);\n }\n if (strategy.primaryIndicators.includes('EMA')) {\n indicatorParts.push(`EMA: ${indicators.ema.short.toFixed(1)}/${indicators.ema.long.toFixed(1)}`);\n if (indicators.ema.crossover !== 'none') {\n indicatorParts.push(`[${indicators.ema.crossover.toUpperCase()} CROSS]`);\n }\n }\n if (strategy.primaryIndicators.includes('Bollinger')) {\n indicatorParts.push(`BB: ${indicators.bollinger.position.toFixed(1)}% width=${indicators.bollinger.width.toFixed(2)}`);\n }\n if (strategy.primaryIndicators.includes('Volume')) {\n indicatorParts.push(`Vol: ${indicators.volume.ratio.toFixed(2)}x avg`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'INDICATOR',\n message: indicatorParts.join(' | '),\n data: { indicators },\n importance: 'low',\n },\n delay,\n });\n delay += rand(800, 1500); // Slower: 0.8-1.5s\n\n // 4. NEWS - 12% chance (slower)\n if (Math.random() < 0.12) {\n const sentiment = Math.random() > 0.4 ? 'Bullish' : 'Bearish';\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'NEWS',\n message: `[${sentiment}] ${pick(NEWS_HEADLINES)}`,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(1000, 1800); // Slower: 1-1.8s\n }\n\n // 5. ANALYSIS - 40% chance (slower)\n if (Math.random() < 0.4) {\n const analysis = this.generateAnalysis(strategy, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ANALYSIS',\n message: analysis,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(1000, 2000); // Slower: 1-2s\n }\n\n // 6-10. Signal evaluation and potential trade\n const signal = this.evaluateSignal(strategy, indicators);\n state.lastSignal = signal.direction;\n state.lastSignalConfidence = signal.confidence;\n\n if (signal.direction !== 'HOLD') {\n // 6. STRATEGY - Show strategy reasoning context (NEW)\n const strategyContext = this.generateStrategyContext(strategy, signal, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'STRATEGY',\n message: strategyContext,\n data: {\n strategy: strategy.name,\n riskTolerance: strategy.riskTolerance,\n primaryIndicators: strategy.primaryIndicators,\n signal: signal.direction,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(1500, 2500); // Slower: 1.5-2.5s\n\n // 7. SIGNAL\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SIGNAL',\n message: `${signal.direction} signal detected | Confidence: ${(signal.confidence * 100).toFixed(1)}% | ${signal.reason}`,\n data: { signal },\n importance: 'high',\n },\n delay,\n });\n delay += rand(1200, 2000); // Slower: 1.2-2s\n\n // 8. DECISION\n const decision = this.makeTradeDecision(strategy, signal, state);\n if (decision.execute) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `Execute ${signal.direction} | Size: ${decision.positionSize.toFixed(1)}% | Leverage: ${decision.leverage}x | Risk/Reward: 1:${decision.riskReward.toFixed(1)}`,\n data: {\n strategyName: strategy.name,\n strategyId: strategy.id,\n riskTolerance: strategy.riskTolerance,\n signalReason: signal.reason,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(1000, 1800); // Slower: 1-1.8s\n\n // 9. ORDER\n const orderId = `ORD_${Date.now().toString(36).toUpperCase()}`;\n const orderPrice = signal.direction === 'LONG'\n ? price * (1 - rand(0.0001, 0.0005))\n : price * (1 + rand(0.0001, 0.0005));\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ORDER',\n message: `Submitting ${signal.direction} order | ${pair} @ $${formatPrice(orderPrice)} on ${chainLabel} | ID: ${orderId}`,\n data: {\n orderId,\n pair,\n side: signal.direction,\n price: orderPrice,\n leverage: decision.leverage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n strategyContext: strategyContext,\n signalReason: signal.reason,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(2000, 4000); // Slower: 2-4s for order execution\n\n // 10. FILLED\n const fillPrice = orderPrice * (1 + rand(-0.0003, 0.0003));\n const slippage = Math.abs(fillPrice - orderPrice) / orderPrice * 100;\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'FILLED',\n message: `Order FILLED | ${pair} ${signal.direction} @ $${formatPrice(fillPrice)} on ${chainLabel} | Slippage: ${slippage.toFixed(4)}% | ID: ${orderId}`,\n data: {\n orderId,\n fillPrice,\n slippage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n executedBy: strategy.id,\n },\n importance: 'high',\n },\n delay,\n });\n\n // Update state with new position\n const position: OpenPosition = {\n id: orderId,\n pair,\n side: signal.direction as 'LONG' | 'SHORT',\n entryPrice: fillPrice,\n currentPrice: price,\n size: decision.positionSize,\n leverage: decision.leverage,\n pnl: 0,\n pnlPercent: 0,\n };\n state.openPositions = [...state.openPositions.slice(-2), position];\n state.totalTrades++;\n } else {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `SKIP - ${decision.reason}`,\n importance: 'medium',\n },\n delay,\n });\n }\n }\n\n // 11. PNL - Update open positions (slower)\n if (state.openPositions.length > 0 && Math.random() < 0.5) {\n delay += rand(1500, 2500); // Slower: 1.5-2.5s\n let totalPositionPnl = 0;\n const pnlParts: string[] = [];\n\n for (const pos of state.openPositions) {\n pos.currentPrice = this.simulatePrice(pos.pair);\n const priceDiff = pos.side === 'LONG'\n ? (pos.currentPrice - pos.entryPrice) / pos.entryPrice\n : (pos.entryPrice - pos.currentPrice) / pos.entryPrice;\n pos.pnlPercent = priceDiff * pos.leverage * 100;\n pos.pnl = priceDiff * pos.leverage * pos.size;\n totalPositionPnl += pos.pnl;\n pnlParts.push(`${pos.pair} ${pos.side}: ${pos.pnlPercent >= 0 ? '+' : ''}${pos.pnlPercent.toFixed(2)}%`);\n }\n\n state.totalPnl += totalPositionPnl * rand(0.01, 0.05);\n\n // Sometimes close a position\n if (state.openPositions.length > 1 && Math.random() < 0.3) {\n const closed = state.openPositions.shift()!;\n const finalPnl = closed.pnlPercent;\n if (finalPnl > 0) {\n state.winRate = state.winRate * 0.95 + 0.05;\n } else {\n state.winRate = state.winRate * 0.95;\n }\n state.winRate = clamp(state.winRate, 0.35, 0.75);\n pnlParts.push(`CLOSED ${closed.pair}: ${finalPnl >= 0 ? '+' : ''}${finalPnl.toFixed(2)}%`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'PNL',\n message: pnlParts.join(' | '),\n data: { totalPnl: state.totalPnl, positions: state.openPositions.length },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 12. RISK - Periodic check (slower)\n if (Math.random() < 0.2) {\n delay += rand(1000, 2000); // Slower: 1-2s\n const exposure = state.openPositions.reduce((sum, p) => sum + p.size * p.leverage, 0);\n const maxDrawdown = rand(2, 12);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'RISK',\n message: `Portfolio exposure: ${exposure.toFixed(1)}% | Max drawdown: ${maxDrawdown.toFixed(1)}% | Open positions: ${state.openPositions.length} | Win rate: ${(state.winRate * 100).toFixed(1)}%`,\n importance: exposure > 80 ? 'high' : 'low',\n },\n delay,\n });\n }\n\n // Emit entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n\n private simulatePrice(pair: string): number {\n const current = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const volatility = pair.includes('DOGE') ? 0.005 : pair.includes('BTC') ? 0.002 : 0.003;\n const drift = rand(-volatility, volatility);\n const newPrice = current * (1 + drift);\n this.priceState.set(pair, newPrice);\n return newPrice;\n }\n\n private generateIndicators(strategy: StrategyPersonality, price: number): IndicatorSnapshot {\n const prev = this.indicatorState.get(strategy.id);\n const prevRsi = prev?.rsi ?? strategy.rsiBias;\n\n // RSI: mean-reverting around bias\n const rsiMean = strategy.rsiBias;\n const rsiDrift = rand(-8, 8);\n const rsiReversion = (rsiMean - prevRsi) * 0.15;\n const rsi = clamp(prevRsi + rsiDrift + rsiReversion, 8, 95);\n\n // MACD: correlated with RSI\n const macdBias = rsi > 65 ? 0.3 : rsi < 35 ? -0.3 : 0;\n const prevHist = prev?.macd.histogram ?? 0;\n const histogram = clamp(prevHist * 0.7 + rand(-0.5, 0.5) + macdBias, -2, 2);\n const macdValue = histogram * rand(0.8, 1.5);\n const macdSignal = macdValue - histogram;\n\n // EMA: occasional crossovers\n const prevShort = prev?.ema.short ?? price;\n const prevLong = prev?.ema.long ?? price;\n const emaShort = prevShort * 0.9 + price * 0.1;\n const emaLong = prevLong * 0.95 + price * 0.05;\n let crossover: 'golden' | 'death' | 'none' = 'none';\n if (prevShort <= prevLong && emaShort > emaLong) crossover = 'golden';\n else if (prevShort >= prevLong && emaShort < emaLong) crossover = 'death';\n\n // Bollinger\n const bbMiddle = price;\n const bbWidth = price * rand(0.01, 0.04);\n const bbUpper = bbMiddle + bbWidth;\n const bbLower = bbMiddle - bbWidth;\n const bbPosition = ((price - bbLower) / (bbUpper - bbLower)) * 100;\n\n // Volume\n const volRatio = rand(0.3, 2.5);\n const volCurrent = rand(100000, 5000000);\n\n return {\n rsi,\n macd: { value: macdValue, signal: macdSignal, histogram },\n ema: { short: emaShort, long: emaLong, crossover },\n bollinger: { upper: bbUpper, middle: bbMiddle, lower: bbLower, width: bbWidth / price, position: bbPosition },\n volume: { current: volCurrent, average: volCurrent / volRatio, ratio: volRatio },\n };\n }\n\n private generateThinkingProcess(strategy: StrategyPersonality, pair: string, price: number): string[] {\n const thoughts: string[] = [];\n const pairBase = pair.split('/')[0];\n\n // Generate 1-3 thinking steps\n const thinkingTemplates = [\n `Analyzing ${pairBase} market structure...`,\n `Checking ${strategy.primaryIndicators.join(', ')} confluence...`,\n `Evaluating risk parameters for ${strategy.riskTolerance} tolerance...`,\n `Scanning order book depth at $${formatPrice(price)}...`,\n `Cross-referencing with historical patterns...`,\n `Calculating optimal entry zone...`,\n `Assessing market sentiment indicators...`,\n `Monitoring whale activity on ${pairBase}...`,\n `Comparing momentum across timeframes...`,\n `Validating support/resistance levels...`,\n ];\n\n const numThoughts = randInt(1, 3);\n const shuffled = [...thinkingTemplates].sort(() => Math.random() - 0.5);\n\n for (let i = 0; i < numThoughts; i++) {\n thoughts.push(shuffled[i]);\n }\n\n return thoughts;\n }\n\n private generateStrategyContext(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number; reason: string },\n indicators: IndicatorSnapshot,\n pair: string\n ): string {\n const contexts = [];\n\n // Strategy personality context\n contexts.push(`[${strategy.name}]`);\n\n // Risk context\n const riskLevel = strategy.riskTolerance === 'high' ? 'aggressive' : strategy.riskTolerance === 'low' ? 'conservative' : 'balanced';\n contexts.push(`Risk: ${riskLevel}`);\n\n // Key indicator that triggered\n if (indicators.rsi < 35 || indicators.rsi > 65) {\n contexts.push(`RSI ${indicators.rsi < 35 ? 'oversold' : 'overbought'} (${indicators.rsi.toFixed(1)})`);\n }\n if (indicators.ema.crossover !== 'none') {\n contexts.push(`EMA ${indicators.ema.crossover} cross`);\n }\n if (Math.abs(indicators.macd.histogram) > 0.3) {\n contexts.push(`MACD ${indicators.macd.histogram > 0 ? 'bullish' : 'bearish'} momentum`);\n }\n\n // Confidence interpretation\n const confLevel = signal.confidence > 0.7 ? 'HIGH' : signal.confidence > 0.5 ? 'MEDIUM' : 'LOW';\n contexts.push(`Confidence: ${confLevel}`);\n\n return contexts.join(' | ');\n }\n\n private generateAnalysis(strategy: StrategyPersonality, indicators: IndicatorSnapshot, pair: string): string {\n const analyses = [];\n\n if (indicators.rsi > 70) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - overbought territory, watching for reversal`);\n } else if (indicators.rsi < 30) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - oversold, potential bounce setup`);\n } else if (indicators.rsi > 55) {\n analyses.push(`RSI trending bullish at ${indicators.rsi.toFixed(1)}`);\n } else {\n analyses.push(`RSI neutral at ${indicators.rsi.toFixed(1)}, no clear direction`);\n }\n\n if (indicators.macd.histogram > 0.5) {\n analyses.push('MACD histogram expanding positive - momentum building');\n } else if (indicators.macd.histogram < -0.5) {\n analyses.push('MACD histogram expanding negative - bearish pressure');\n }\n\n if (indicators.ema.crossover === 'golden') {\n analyses.push('EMA golden cross detected - strong bullish signal');\n } else if (indicators.ema.crossover === 'death') {\n analyses.push('EMA death cross detected - bearish warning');\n }\n\n if (indicators.bollinger.position > 90) {\n analyses.push(`Price near upper Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential resistance`);\n } else if (indicators.bollinger.position < 10) {\n analyses.push(`Price near lower Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential support`);\n }\n\n if (indicators.volume.ratio > 1.8) {\n analyses.push(`Volume spike ${indicators.volume.ratio.toFixed(1)}x average - high activity`);\n }\n\n return analyses.length > 0 ? analyses.join(' | ') : `${pair} consolidating - waiting for clearer setup`;\n }\n\n private evaluateSignal(\n strategy: StrategyPersonality,\n indicators: IndicatorSnapshot,\n ): { direction: 'LONG' | 'SHORT' | 'HOLD'; confidence: number; reason: string } {\n let bullScore = 0;\n let bearScore = 0;\n const reasons: string[] = [];\n\n // RSI\n if (indicators.rsi < 30) { bullScore += 2; reasons.push('RSI oversold'); }\n else if (indicators.rsi < 40) { bullScore += 1; reasons.push('RSI low'); }\n else if (indicators.rsi > 70) { bearScore += 2; reasons.push('RSI overbought'); }\n else if (indicators.rsi > 60) { bearScore += 1; reasons.push('RSI high'); }\n\n // MACD\n if (indicators.macd.histogram > 0.3) { bullScore += 1.5; reasons.push('MACD bullish'); }\n else if (indicators.macd.histogram < -0.3) { bearScore += 1.5; reasons.push('MACD bearish'); }\n\n // EMA\n if (indicators.ema.crossover === 'golden') { bullScore += 2.5; reasons.push('Golden cross'); }\n else if (indicators.ema.crossover === 'death') { bearScore += 2.5; reasons.push('Death cross'); }\n else if (indicators.ema.short > indicators.ema.long) { bullScore += 0.5; }\n else { bearScore += 0.5; }\n\n // Bollinger\n if (indicators.bollinger.position < 15) { bullScore += 1; reasons.push('BB support'); }\n else if (indicators.bollinger.position > 85) { bearScore += 1; reasons.push('BB resistance'); }\n\n // Volume confirmation\n if (indicators.volume.ratio > 1.5) {\n if (bullScore > bearScore) bullScore += 1;\n else bearScore += 1;\n reasons.push('Volume confirms');\n }\n\n const netScore = bullScore - bearScore;\n const confidence = Math.min(Math.abs(netScore) / 6, 0.95);\n const threshold = strategy.riskTolerance === 'high' ? 1.5 : strategy.riskTolerance === 'medium' ? 2.0 : 2.5;\n\n // Apply trade frequency filter\n if (Math.random() > strategy.tradeFrequency) {\n return { direction: 'HOLD', confidence: 0, reason: 'Cycle skip' };\n }\n\n if (netScore > threshold) {\n return { direction: 'LONG', confidence, reason: reasons.slice(0, 3).join(', ') };\n } else if (netScore < -threshold) {\n return { direction: 'SHORT', confidence, reason: reasons.slice(0, 3).join(', ') };\n }\n\n return { direction: 'HOLD', confidence: 0, reason: 'No clear signal' };\n }\n\n private makeTradeDecision(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number },\n state: BotState,\n ): { execute: boolean; positionSize: number; leverage: number; riskReward: number; reason: string } {\n // Check position limits\n if (state.openPositions.length >= 3) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: 'Max positions reached (3)' };\n }\n\n // Confidence threshold\n const minConfidence = strategy.riskTolerance === 'high' ? 0.3 : strategy.riskTolerance === 'medium' ? 0.45 : 0.6;\n if (signal.confidence < minConfidence) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: `Confidence too low (${(signal.confidence * 100).toFixed(0)}% < ${(minConfidence * 100).toFixed(0)}%)` };\n }\n\n const positionSize = rand(strategy.positionSizeMin, strategy.positionSizeMax);\n const leverage = randInt(strategy.leverageMin, strategy.leverageMax);\n const riskReward = rand(1.2, 3.5);\n\n return { execute: true, positionSize, leverage, riskReward, reason: '' };\n }\n}\n\n// ── Singleton Export ────────────────────────────────────────────────────────────\n\nexport const botSimulationEngine = new BotSimulationEngine();\n"]}
1
+ {"version":3,"sources":["../../src/types/forex.ts","../../src/services/forex/ForexPoolDataGenerator.ts","../../src/config/index.ts","../../src/services/engine.ts","../../src/services/supabase.ts","../../src/services/price.ts","../../src/services/usage.ts","../../src/services/forex/ForexSimulationEngine.ts","../../src/services/forex/index.ts","../../src/services/forex/BotSimulationEngine.ts"],"names":["config","genId","rand","randInt","pick","ForexPoolDataGenerator","idCounter"],"mappings":"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","file":"index.mjs","sourcesContent":["// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - StableFX On-Chain Forex Types & Constants\n// Shared types for stablecoin foreign exchange pool trading\n// ══════════════════════════════════════════════════════════════════════════════\n\n// ── Capital Split ────────────────────────────────────────────────────────────\n\nexport const FOREX_CAPITAL_SPLIT = {\n poolReserves: 0.50,\n tradingCapital: 0.50,\n} as const;\n\nexport function computePoolAllocations(amount: number): {\n tradingCapital: number;\n totalPoolReserves: number;\n clearing: number;\n hedging: number;\n insurance: number;\n} {\n const totalPoolReserves = amount * FOREX_CAPITAL_SPLIT.poolReserves;\n const tradingCapital = amount * FOREX_CAPITAL_SPLIT.tradingCapital;\n return {\n tradingCapital,\n totalPoolReserves,\n clearing: totalPoolReserves * 0.50,\n hedging: totalPoolReserves * 0.30,\n insurance: totalPoolReserves * 0.20,\n };\n}\n\n// ── Cycle Options ────────────────────────────────────────────────────────────\n\nexport interface ForexCycleOption {\n days: number;\n feeRate: number;\n commissionRate: number;\n label: string;\n}\n\nexport const FOREX_CYCLE_OPTIONS: ForexCycleOption[] = [\n { days: 30, feeRate: 0.10, commissionRate: 0.60, label: '30D' },\n { days: 60, feeRate: 0.08, commissionRate: 0.70, label: '60D' },\n { days: 90, feeRate: 0.07, commissionRate: 0.75, label: '90D' },\n { days: 180, feeRate: 0.05, commissionRate: 0.85, label: '180D' },\n { days: 360, feeRate: 0.03, commissionRate: 0.90, label: '360D' },\n];\n\n// ── Currency Pairs ───────────────────────────────────────────────────────────\n\nexport interface ForexCurrencyPair {\n id: string;\n base: string;\n quote: string;\n symbol: string;\n flag: string;\n name: string;\n basePrice: number;\n pipSize: number;\n spreadPips: number;\n}\n\nexport const FOREX_CURRENCY_PAIRS: ForexCurrencyPair[] = [\n { id: 'USDC_EURC', base: 'USDC', quote: 'EURC', symbol: 'USDC/EURC', flag: '\\u{1F1EA}\\u{1F1FA}', name: 'Euro', basePrice: 0.9230, pipSize: 0.0001, spreadPips: 1.2 },\n { id: 'USDC_GBPC', base: 'USDC', quote: 'GBPC', symbol: 'USDC/GBPC', flag: '\\u{1F1EC}\\u{1F1E7}', name: 'British Pound', basePrice: 0.7890, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_JPYC', base: 'USDC', quote: 'JPYC', symbol: 'USDC/JPYC', flag: '\\u{1F1EF}\\u{1F1F5}', name: 'Japanese Yen', basePrice: 154.50, pipSize: 0.01, spreadPips: 1.0 },\n { id: 'USDC_AUDC', base: 'USDC', quote: 'AUDC', symbol: 'USDC/AUDC', flag: '\\u{1F1E6}\\u{1F1FA}', name: 'Australian Dollar', basePrice: 1.5380, pipSize: 0.0001, spreadPips: 1.8 },\n { id: 'USDC_CADC', base: 'USDC', quote: 'CADC', symbol: 'USDC/CADC', flag: '\\u{1F1E8}\\u{1F1E6}', name: 'Canadian Dollar', basePrice: 1.3640, pipSize: 0.0001, spreadPips: 1.5 },\n { id: 'USDC_CHFC', base: 'USDC', quote: 'CHFC', symbol: 'USDC/CHFC', flag: '\\u{1F1E8}\\u{1F1ED}', name: 'Swiss Franc', basePrice: 0.8750, pipSize: 0.0001, spreadPips: 1.3 },\n];\n\n// ── Pools ────────────────────────────────────────────────────────────────────\n\nexport type ForexPoolType = 'clearing' | 'hedging' | 'insurance';\n\nexport interface ForexPool {\n id: ForexPoolType;\n nameKey: string;\n descriptionKey: string;\n allocation: number;\n totalSize: number;\n utilization: number;\n color: string;\n apy7d: number;\n apy30d: number;\n netFlow24h: number;\n txCount24h: number;\n txCountTotal: number;\n totalDeposits: number;\n totalWithdrawals: number;\n profitDistributed: number;\n lastUpdated: number;\n}\n\nexport const FOREX_POOL_DEFAULTS: ForexPool[] = [\n { id: 'clearing', nameKey: 'forex.pool_clearing', descriptionKey: 'forex.pool_clearing_desc', allocation: 0.50, totalSize: 12500000, utilization: 0.78, color: '#3B82F6', apy7d: 12.8, apy30d: 11.5, netFlow24h: 185000, txCount24h: 42, txCountTotal: 12840, totalDeposits: 45200000, totalWithdrawals: 32700000, profitDistributed: 1850000, lastUpdated: Date.now() },\n { id: 'hedging', nameKey: 'forex.pool_hedging', descriptionKey: 'forex.pool_hedging_desc', allocation: 0.30, totalSize: 7500000, utilization: 0.65, color: '#F59E0B', apy7d: 8.1, apy30d: 7.6, netFlow24h: 72000, txCount24h: 24, txCountTotal: 7620, totalDeposits: 28500000, totalWithdrawals: 21000000, profitDistributed: 980000, lastUpdated: Date.now() },\n { id: 'insurance', nameKey: 'forex.pool_insurance', descriptionKey: 'forex.pool_insurance_desc', allocation: 0.20, totalSize: 5000000, utilization: 0.42, color: '#10B981', apy7d: 4.8, apy30d: 4.5, netFlow24h: 35000, txCount24h: 14, txCountTotal: 4280, totalDeposits: 15800000, totalWithdrawals: 10800000, profitDistributed: 520000, lastUpdated: Date.now() },\n];\n\n// ── Pool Transactions ────────────────────────────────────────────────────────\n\nexport type ForexPoolTransactionType =\n | 'deposit' | 'withdrawal' | 'profit_distribution'\n | 'loss_absorption' | 'inter_pool_transfer' | 'fee_collection' | 'reserve_rebalance';\n\nexport interface ForexPoolTransaction {\n id: string;\n poolId: ForexPoolType;\n type: ForexPoolTransactionType;\n amount: number;\n balanceBefore: number;\n balanceAfter: number;\n txHash: string;\n blockNumber: number;\n timestamp: number;\n description: string;\n}\n\n// ── Pool Daily Snapshots ────────────────────────────────────────────────────\n\nexport interface ForexPoolDailySnapshot {\n poolId: ForexPoolType;\n date: string;\n openBalance: number;\n closeBalance: number;\n deposits: number;\n withdrawals: number;\n netFlow: number;\n dailyPnl: number;\n dailyPnlPct: number;\n cumulativePnl: number;\n utilization: number;\n txCount: number;\n activeUsers: number;\n}\n\n// ── Positions ────────────────────────────────────────────────────────────────\n\nexport interface ForexPosition {\n id: string;\n pairId: string;\n side: 'BUY' | 'SELL';\n lots: number;\n pips: number;\n entryPrice: number;\n currentPrice: number;\n pnl: number;\n openTime: number;\n}\n\n// ── Investment ───────────────────────────────────────────────────────────────\n\nexport interface ForexInvestment {\n id: string;\n userId?: string;\n amount: number;\n currentValue: number;\n profit: number;\n status: 'active' | 'completed' | 'pending' | 'redeemed' | 'cancelled';\n selectedPairs: string[];\n cycleDays: number;\n cycleOption: ForexCycleOption;\n feeRate?: number;\n commissionRate?: number;\n startDate: string;\n endDate: string;\n tradingCapital: number;\n totalPoolReserves: number;\n poolAllocations: {\n clearing: number;\n hedging: number;\n insurance: number;\n };\n tradeWeight: number;\n totalLots: number;\n totalPips: number;\n totalTrades: number;\n positions: ForexPosition[];\n tradeHistory: ForexTradeRecord[];\n redeemedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// ── Trade Records ────────────────────────────────────────────────────────────\n\nexport type ForexTradeStatus = 'RFQ' | 'QUOTED' | 'MATCHED' | 'SETTLED' | 'FAILED';\n\nexport interface ForexTradeRecord {\n id: string;\n timestamp: number;\n pairId: string;\n pairSymbol: string;\n side: 'BUY' | 'SELL';\n rfqPrice: number;\n quotePrice: number;\n matchPrice: number;\n settlePrice: number;\n lots: number;\n pips: number;\n pnl: number;\n status: ForexTradeStatus;\n pvpSettled: boolean;\n clearingFee?: number;\n hedgingCost?: number;\n insuranceReserve?: number;\n txHash?: string;\n blockNumber?: number;\n cycleDay?: number;\n cumulativePnl?: number;\n}\n\n// ── Console Log Types ────────────────────────────────────────────────────────\n\nexport type ForexLogType =\n | 'RFQ' | 'QUOTE' | 'MATCH' | 'SETTLE' | 'PVP'\n | 'HEDGE' | 'CLEAR' | 'POSITION' | 'PNL' | 'SYSTEM';\n\nexport interface ForexLogEntry {\n id: string;\n timestamp: number;\n type: ForexLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n pairId?: string;\n}\n\n// ── Agent ────────────────────────────────────────────────────────────────────\n\nexport interface ForexAgent {\n id: string;\n nameKey: string;\n descriptionKey: string;\n icon: string;\n color: string;\n supportedPairs: string[];\n dailyRoiMin: number;\n dailyRoiMax: number;\n totalManaged: number;\n totalUsers: number;\n winRate: number;\n}\n\nexport const FOREX_AGENT: ForexAgent = {\n id: 'stablefx-01',\n nameKey: 'forex.agent_name',\n descriptionKey: 'forex.agent_description',\n icon: '\\u{1F4B1}',\n color: '#0EA5E9',\n supportedPairs: FOREX_CURRENCY_PAIRS.map(p => p.id),\n dailyRoiMin: 0.002,\n dailyRoiMax: 0.005,\n totalManaged: 25000000,\n totalUsers: 3847,\n winRate: 72.5,\n};\n\n// ── Profit Calculation ───────────────────────────────────────────────────────\n\nexport function calculateForexNetProfit(\n grossProfit: number,\n cycleOption: ForexCycleOption,\n): { feeAmount: number; postFeeProfit: number; netProfit: number } {\n const feeAmount = grossProfit * cycleOption.feeRate;\n const postFeeProfit = grossProfit - feeAmount;\n const netProfit = postFeeProfit * cycleOption.commissionRate;\n return { feeAmount, postFeeProfit, netProfit };\n}\n\nexport function estimateForexProfit(\n amount: number,\n cycleDays: number,\n agent: ForexAgent = FOREX_AGENT,\n): { grossProfit: number; feeAmount: number; netProfit: number; dailyRate: number } {\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[0];\n const estimatedApy = ((agent.dailyRoiMin + agent.dailyRoiMax) / 2) * 365 * 100;\n const dailyRate = estimatedApy / 100 / 365;\n const grossProfit = amount * dailyRate * cycleDays;\n const { feeAmount, netProfit } = calculateForexNetProfit(grossProfit, cycleOption);\n return { grossProfit, feeAmount, netProfit, dailyRate };\n}\n","// ForexPoolDataGenerator.ts - Generates historical pool snapshots, transactions, and trade history\n// Singleton service following existing pattern (like ForexSimulationEngine)\n\nimport type {\n ForexPoolType,\n ForexPoolDailySnapshot,\n ForexPoolTransaction,\n ForexPoolTransactionType,\n ForexTradeRecord,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS, FOREX_POOL_DEFAULTS, FOREX_AGENT } from '../../types/forex';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction genTxHash(): string {\n const chars = '0123456789abcdef';\n let hash = '0x';\n for (let i = 0; i < 64; i++) hash += chars[Math.floor(Math.random() * 16)];\n return hash;\n}\n\nfunction formatDate(d: Date): string {\n return d.toISOString().split('T')[0];\n}\n\nlet _idCounter = 0;\nfunction genId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${(++_idCounter).toString(36)}`;\n}\n\n// ── Pool Parameters ──────────────────────────────────────────────────────────\n\ninterface PoolParams {\n meanDailyPnlPct: number;\n stddevPnlPct: number;\n utilizationMin: number;\n utilizationMax: number;\n depositsPerDay: [number, number];\n withdrawalsPerDay: [number, number];\n profitDistPerDay: number;\n avgDepositSize: number;\n avgWithdrawalSize: number;\n}\n\nconst POOL_PARAMS: Record<ForexPoolType, PoolParams> = {\n clearing: {\n meanDailyPnlPct: 0.00035,\n stddevPnlPct: 0.00015,\n utilizationMin: 0.70,\n utilizationMax: 0.85,\n depositsPerDay: [15, 25],\n withdrawalsPerDay: [8, 12],\n profitDistPerDay: 5,\n avgDepositSize: 25000,\n avgWithdrawalSize: 18000,\n },\n hedging: {\n meanDailyPnlPct: 0.00022,\n stddevPnlPct: 0.00020,\n utilizationMin: 0.55,\n utilizationMax: 0.75,\n depositsPerDay: [8, 15],\n withdrawalsPerDay: [5, 8],\n profitDistPerDay: 3,\n avgDepositSize: 18000,\n avgWithdrawalSize: 12000,\n },\n insurance: {\n meanDailyPnlPct: 0.00013,\n stddevPnlPct: 0.00008,\n utilizationMin: 0.30,\n utilizationMax: 0.50,\n depositsPerDay: [5, 10],\n withdrawalsPerDay: [3, 5],\n profitDistPerDay: 2,\n avgDepositSize: 12000,\n avgWithdrawalSize: 8000,\n },\n};\n\n// ── Generator Class ──────────────────────────────────────────────────────────\n\nclass ForexPoolDataGeneratorClass {\n private snapshotCache: Record<ForexPoolType, ForexPoolDailySnapshot[]> | null = null;\n private transactionCache: ForexPoolTransaction[] | null = null;\n private baseBlockNumber = 19_500_000;\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n generateAllSnapshots(): Record<ForexPoolType, ForexPoolDailySnapshot[]> {\n if (this.snapshotCache) return this.snapshotCache;\n\n const result: Record<ForexPoolType, ForexPoolDailySnapshot[]> = {\n clearing: [],\n hedging: [],\n insurance: [],\n };\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n result[pool.id] = this.generatePoolSnapshots(pool.id, pool.totalSize);\n }\n\n this.snapshotCache = result;\n return result;\n }\n\n generateAllTransactions(): ForexPoolTransaction[] {\n if (this.transactionCache) return this.transactionCache;\n\n const allTx: ForexPoolTransaction[] = [];\n\n for (const pool of FOREX_POOL_DEFAULTS) {\n const snapshots = this.snapshotCache?.[pool.id] || this.generatePoolSnapshots(pool.id, pool.totalSize);\n const txs = this.generatePoolTransactions(pool.id, snapshots);\n allTx.push(...txs);\n }\n\n // Add inter-pool transfers (~2-3/week = ~17-26 over 60 days)\n const now = new Date();\n for (let i = 0; i < 60; i++) {\n const day = new Date(now);\n day.setDate(day.getDate() - (60 - i));\n const dayOfWeek = day.getDay();\n\n // Inter-pool transfers: ~2-3 per week\n if (dayOfWeek === 2 || dayOfWeek === 4 || (dayOfWeek === 5 && Math.random() < 0.4)) {\n const fromPool = pick(['clearing', 'hedging', 'insurance'] as ForexPoolType[]);\n const toOptions = (['clearing', 'hedging', 'insurance'] as ForexPoolType[]).filter(p => p !== fromPool);\n const toPool = pick(toOptions);\n const amount = rand(50000, 200000);\n const ts = day.getTime() + randInt(10, 18) * 3600000;\n\n allTx.push({\n id: genId('ipt'),\n poolId: fromPool,\n type: 'inter_pool_transfer',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(0, 100),\n timestamp: ts,\n description: `Transfer to ${toPool} pool`,\n });\n\n allTx.push({\n id: genId('ipt'),\n poolId: toPool,\n type: 'inter_pool_transfer',\n amount: amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(100, 200),\n timestamp: ts + 5000,\n description: `Transfer from ${fromPool} pool`,\n });\n }\n\n // Reserve rebalance: ~1/week\n if (dayOfWeek === 3 && Math.random() < 0.85) {\n const pool = pick(FOREX_POOL_DEFAULTS);\n const rebalanceAmt = rand(20000, 100000);\n const ts = day.getTime() + randInt(2, 6) * 3600000;\n allTx.push({\n id: genId('rrb'),\n poolId: pool.id,\n type: 'reserve_rebalance',\n amount: Math.random() < 0.5 ? rebalanceAmt : -rebalanceAmt,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + i * 7200 + randInt(200, 300),\n timestamp: ts,\n description: 'Automated reserve rebalance',\n });\n }\n }\n\n // Sort all transactions by timestamp\n allTx.sort((a, b) => a.timestamp - b.timestamp);\n\n // Assign running balances per pool\n const runningBalance: Record<ForexPoolType, number> = {\n clearing: FOREX_POOL_DEFAULTS[0].totalSize * 0.85,\n hedging: FOREX_POOL_DEFAULTS[1].totalSize * 0.82,\n insurance: FOREX_POOL_DEFAULTS[2].totalSize * 0.88,\n };\n\n for (const tx of allTx) {\n tx.balanceBefore = runningBalance[tx.poolId];\n runningBalance[tx.poolId] += tx.amount;\n tx.balanceAfter = runningBalance[tx.poolId];\n }\n\n this.transactionCache = allTx;\n return allTx;\n }\n\n generateTradeHistory(\n investmentAmount: number,\n startDate: string,\n selectedPairs: string[],\n ): ForexTradeRecord[] {\n const trades: ForexTradeRecord[] = [];\n const start = new Date(startDate);\n const now = new Date();\n const dayCount = Math.min(60, Math.ceil((now.getTime() - start.getTime()) / 86400000));\n let cumulativePnl = 0;\n let blockNum = this.baseBlockNumber + randInt(0, 5000);\n\n for (let d = 0; d < dayCount; d++) {\n const day = new Date(start);\n day.setDate(day.getDate() + d);\n const dayOfWeek = day.getDay();\n\n // Fewer trades on weekends\n const baseCount = (dayOfWeek === 0 || dayOfWeek === 6) ? randInt(1, 2) : randInt(3, 8);\n\n for (let t = 0; t < baseCount; t++) {\n const pair = FOREX_CURRENCY_PAIRS.find(p => p.id === pick(selectedPairs)) || pick(FOREX_CURRENCY_PAIRS);\n const side: 'BUY' | 'SELL' = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat(rand(0.1, 2.5).toFixed(2));\n const rfqPrice = pair.basePrice * (1 + rand(-0.003, 0.003));\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY' ? rfqPrice + quoteSpread : rfqPrice - quoteSpread;\n\n // 85% match rate\n const matched = Math.random() < 0.85;\n if (!matched) continue;\n\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - rfqPrice) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n // Win rate matching FOREX_AGENT\n const isWin = Math.random() < (FOREX_AGENT.winRate / 100);\n const finalPnl = isWin ? Math.abs(pnl) : -Math.abs(pnl) * rand(0.3, 0.8);\n cumulativePnl += finalPnl;\n\n const clearingFee = Math.abs(finalPnl) * rand(0.001, 0.003);\n const hedgingCost = Math.abs(finalPnl) * rand(0.0005, 0.002);\n const insuranceReserve = Math.abs(finalPnl) * rand(0.0003, 0.001);\n\n blockNum += randInt(1, 20);\n const timestamp = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n\n trades.push({\n id: genId('FXT'),\n timestamp,\n pairId: pair.id,\n pairSymbol: pair.symbol,\n side,\n rfqPrice,\n quotePrice,\n matchPrice,\n settlePrice,\n lots,\n pips: isWin ? Math.abs(pips) : -Math.abs(pips) * rand(0.3, 0.8),\n pnl: finalPnl,\n status: 'SETTLED',\n pvpSettled: true,\n clearingFee,\n hedgingCost,\n insuranceReserve,\n txHash: genTxHash(),\n blockNumber: blockNum,\n cycleDay: d + 1,\n cumulativePnl,\n });\n }\n }\n\n trades.sort((a, b) => a.timestamp - b.timestamp);\n return trades;\n }\n\n generateLiveTransaction(\n poolId: ForexPoolType,\n type: ForexPoolTransactionType,\n baseAmount?: number,\n ): ForexPoolTransaction {\n const params = POOL_PARAMS[poolId];\n let amount: number;\n\n switch (type) {\n case 'deposit':\n amount = baseAmount ?? rand(params.avgDepositSize * 0.5, params.avgDepositSize * 1.5);\n break;\n case 'withdrawal':\n amount = -(baseAmount ?? rand(params.avgWithdrawalSize * 0.5, params.avgWithdrawalSize * 1.5));\n break;\n case 'profit_distribution':\n amount = baseAmount ?? rand(500, 5000);\n break;\n case 'fee_collection':\n amount = baseAmount ?? rand(100, 2000);\n break;\n case 'loss_absorption':\n amount = -(baseAmount ?? rand(200, 3000));\n break;\n default:\n amount = baseAmount ?? rand(-5000, 5000);\n }\n\n const pool = FOREX_POOL_DEFAULTS.find(p => p.id === poolId)!;\n const balanceBefore = pool.totalSize;\n\n return {\n id: genId('ptx'),\n poolId,\n type,\n amount,\n balanceBefore,\n balanceAfter: balanceBefore + amount,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(Date.now() / 12000),\n timestamp: Date.now(),\n description: this.getTxDescription(type, poolId, Math.abs(amount)),\n };\n }\n\n // ── Private Methods ────────────────────────────────────────────────────\n\n private generatePoolSnapshots(\n poolId: ForexPoolType,\n currentSize: number,\n ): ForexPoolDailySnapshot[] {\n const params = POOL_PARAMS[poolId];\n const snapshots: ForexPoolDailySnapshot[] = [];\n const now = new Date();\n\n // Work backward: start with a smaller balance 60 days ago\n let balance = currentSize * rand(0.82, 0.88);\n let cumulativePnl = 0;\n\n for (let i = 59; i >= 0; i--) {\n const day = new Date(now);\n day.setDate(day.getDate() - i);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n\n const openBalance = balance;\n\n // Weekend activity ~20% of weekday\n const activityMultiplier = isWeekend ? 0.2 : 1.0;\n\n // Daily PnL with occasional drawdowns (1-2 per week)\n const isDrawdown = !isWeekend && Math.random() < 0.2; // ~1.4/week\n let dailyPnlPct: number;\n if (isDrawdown) {\n dailyPnlPct = -rand(0.0001, params.stddevPnlPct * 2);\n } else {\n dailyPnlPct = this.gaussianRandom(params.meanDailyPnlPct, params.stddevPnlPct);\n }\n dailyPnlPct *= activityMultiplier;\n\n const dailyPnl = balance * dailyPnlPct;\n cumulativePnl += dailyPnl;\n\n // Net deposits: organic growth with slight positive bias\n const depositCount = isWeekend\n ? randInt(1, Math.ceil(params.depositsPerDay[0] * 0.2))\n : randInt(params.depositsPerDay[0], params.depositsPerDay[1]);\n const withdrawalCount = isWeekend\n ? randInt(0, Math.ceil(params.withdrawalsPerDay[0] * 0.2))\n : randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]);\n\n const deposits = depositCount * params.avgDepositSize * rand(0.7, 1.3) * activityMultiplier;\n const withdrawals = withdrawalCount * params.avgWithdrawalSize * rand(0.7, 1.3) * activityMultiplier;\n const netFlow = deposits - withdrawals;\n\n balance += dailyPnl + netFlow;\n\n const txCount = depositCount + withdrawalCount + Math.round(params.profitDistPerDay * activityMultiplier);\n const utilization = rand(params.utilizationMin, params.utilizationMax);\n const activeUsers = Math.round(rand(80, 400) * activityMultiplier);\n\n snapshots.push({\n poolId,\n date: formatDate(day),\n openBalance,\n closeBalance: balance,\n deposits,\n withdrawals,\n netFlow,\n dailyPnl,\n dailyPnlPct,\n cumulativePnl,\n utilization,\n txCount,\n activeUsers,\n });\n }\n\n return snapshots;\n }\n\n private generatePoolTransactions(\n poolId: ForexPoolType,\n snapshots: ForexPoolDailySnapshot[],\n ): ForexPoolTransaction[] {\n const params = POOL_PARAMS[poolId];\n const transactions: ForexPoolTransaction[] = [];\n\n for (const snap of snapshots) {\n const day = new Date(snap.date);\n const dayOfWeek = day.getDay();\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;\n const mult = isWeekend ? 0.2 : 1.0;\n\n const depositCount = Math.round(randInt(params.depositsPerDay[0], params.depositsPerDay[1]) * mult);\n const withdrawalCount = Math.round(randInt(params.withdrawalsPerDay[0], params.withdrawalsPerDay[1]) * mult);\n const profitCount = Math.round(params.profitDistPerDay * mult);\n\n // Deposits\n for (let i = 0; i < depositCount; i++) {\n const amount = rand(params.avgDepositSize * 0.3, params.avgDepositSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('dep'),\n poolId,\n type: 'deposit',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Deposit to ${poolId} pool`,\n });\n }\n\n // Withdrawals\n for (let i = 0; i < withdrawalCount; i++) {\n const amount = rand(params.avgWithdrawalSize * 0.3, params.avgWithdrawalSize * 2.0);\n const ts = day.getTime() + randInt(0, 23) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('wdr'),\n poolId,\n type: 'withdrawal',\n amount: -amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Withdrawal from ${poolId} pool`,\n });\n }\n\n // Profit distributions\n for (let i = 0; i < profitCount; i++) {\n const amount = rand(500, 8000);\n const ts = day.getTime() + randInt(6, 22) * 3600000 + randInt(0, 3600000);\n transactions.push({\n id: genId('prd'),\n poolId,\n type: 'profit_distribution',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Profit distribution from ${poolId} pool`,\n });\n }\n\n // Fee collection (1-2 per day on weekdays)\n if (!isWeekend) {\n const feeCount = randInt(1, 2);\n for (let i = 0; i < feeCount; i++) {\n const amount = rand(100, 3000);\n const ts = day.getTime() + randInt(8, 20) * 3600000;\n transactions.push({\n id: genId('fee'),\n poolId,\n type: 'fee_collection',\n amount,\n balanceBefore: 0,\n balanceAfter: 0,\n txHash: genTxHash(),\n blockNumber: this.baseBlockNumber + Math.floor(ts / 12000) + randInt(0, 50),\n timestamp: ts,\n description: `Fee collection for ${poolId} pool`,\n });\n }\n }\n }\n\n return transactions;\n }\n\n private gaussianRandom(mean: number, stddev: number): number {\n let u = 0, v = 0;\n while (u === 0) u = Math.random();\n while (v === 0) v = Math.random();\n const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n return mean + z * stddev;\n }\n\n private getTxDescription(type: ForexPoolTransactionType, poolId: ForexPoolType, amount: number): string {\n const fmt = `$${amount.toLocaleString(undefined, { maximumFractionDigits: 0 })}`;\n switch (type) {\n case 'deposit': return `Deposit ${fmt} to ${poolId} pool`;\n case 'withdrawal': return `Withdrawal ${fmt} from ${poolId} pool`;\n case 'profit_distribution': return `Profit distribution ${fmt} from ${poolId}`;\n case 'loss_absorption': return `Loss absorbed ${fmt} by ${poolId} pool`;\n case 'inter_pool_transfer': return `Inter-pool transfer ${fmt}`;\n case 'fee_collection': return `Fee collected ${fmt} in ${poolId}`;\n case 'reserve_rebalance': return `Reserve rebalance ${fmt} in ${poolId}`;\n default: return `${type} ${fmt}`;\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nlet _instance: ForexPoolDataGeneratorClass | null = null;\n\nexport const ForexPoolDataGenerator = {\n getInstance(): ForexPoolDataGeneratorClass {\n if (!_instance) {\n _instance = new ForexPoolDataGeneratorClass();\n }\n return _instance;\n },\n};\n","/**\n * ONE SDK Configuration\n *\n * Chain data is fetched from ONE Engine API - no duplicates needed here.\n * Engine is the single source of truth for 200+ EVM chains.\n */\n\nimport type { ChainConfig } from '../types';\n\n// ===== SDK Configuration =====\nexport interface OneConfig {\n // ONE Engine (required)\n oneEngineUrl: string;\n oneClientId: string;\n oneSecretKey?: string; // Only for backend usage\n\n // Optional: Direct Supabase access (for realtime subscriptions)\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n\n // Deprecated: Use ONE Engine instead\n thirdwebClientId?: string;\n}\n\n// Default configuration values\nconst DEFAULT_ENGINE_URL = 'https://api.one23.io';\nconst DEFAULT_CLIENT_ID = 'one_pk_e8f647bfa643fdcfaa3a23f760488e49be09f929296eed4a6c399d437d907f60';\n\nlet config: OneConfig | null = null;\n\nexport function initOneSDK(options: Partial<OneConfig>): void {\n // Use defaults if not provided\n const engineUrl = options.oneEngineUrl || DEFAULT_ENGINE_URL;\n const clientId = options.oneClientId || DEFAULT_CLIENT_ID;\n\n config = {\n ...options,\n oneEngineUrl: engineUrl,\n oneClientId: clientId,\n } as OneConfig;\n}\n\nexport function getConfig(): OneConfig {\n if (!config) {\n throw new Error('ONE SDK not initialized. Call initOneSDK() first.');\n }\n return config;\n}\n\nexport function isInitialized(): boolean {\n return config !== null;\n}\n\nexport function getEngineUrl(): string {\n return config?.oneEngineUrl || process.env.NEXT_PUBLIC_ONE_ENGINE_URL || DEFAULT_ENGINE_URL;\n}\n\n// ===== Chain Data (Fetched from Engine) =====\n\n// Cache for chain data\nlet chainsCache: ChainConfig[] | null = null;\nlet chainsCacheTimestamp = 0;\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Fetch chains from ONE Engine API\n * Engine is the source of truth for 200+ EVM chains\n */\nexport async function fetchChains(options?: {\n category?: 'mainnet' | 'l2' | 'testnet' | 'gaming' | 'recommended';\n smartWallet?: boolean;\n limit?: number;\n}): Promise<ChainConfig[]> {\n const engineUrl = getEngineUrl();\n const params = new URLSearchParams();\n\n if (options?.category) params.set('category', options.category);\n if (options?.smartWallet) params.set('smartWallet', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n\n const response = await fetch(`${engineUrl}/v1/chains?${params}`);\n const data = await response.json();\n\n if (!data.success) {\n throw new Error(data.error?.message || 'Failed to fetch chains');\n }\n\n // Transform Engine response to SDK ChainConfig format\n return data.data.chains.map((chain: any) => ({\n id: chain.id,\n name: chain.name,\n shortName: chain.shortName || chain.slug || chain.name.toLowerCase(),\n icon: getChainIcon(chain.id),\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: Array.isArray(chain.rpc) ? chain.rpc : [chain.rpc],\n blockExplorerUrls: chain.blockExplorer ? [chain.blockExplorer] : [],\n testnet: chain.testnet,\n }));\n}\n\n/**\n * Get all supported chains (cached)\n */\nexport async function getChains(): Promise<ChainConfig[]> {\n const now = Date.now();\n if (chainsCache && (now - chainsCacheTimestamp) < CACHE_TTL) {\n return chainsCache;\n }\n\n chainsCache = await fetchChains({ limit: 200 });\n chainsCacheTimestamp = now;\n return chainsCache;\n}\n\n/**\n * Get chain by ID\n */\nexport async function getChainById(chainId: number): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n return chains.find(c => c.id === chainId);\n}\n\n/**\n * Get chain by name/shortName\n */\nexport async function getChainByName(name: string): Promise<ChainConfig | undefined> {\n const chains = await getChains();\n const lowerName = name.toLowerCase();\n return chains.find(\n c => c.name.toLowerCase() === lowerName || c.shortName.toLowerCase() === lowerName\n );\n}\n\n/**\n * Get recommended chains for UI display\n */\nexport async function getRecommendedChains(): Promise<ChainConfig[]> {\n return fetchChains({ category: 'recommended', limit: 10 });\n}\n\n/**\n * Get chains with smart wallet support\n */\nexport async function getSmartWalletChains(): Promise<ChainConfig[]> {\n return fetchChains({ smartWallet: true, limit: 50 });\n}\n\n// ===== Default Chain Constants =====\n// These are commonly used chain IDs, but full data should be fetched from Engine\n\nexport const CHAIN_IDS = {\n ETHEREUM: 1,\n POLYGON: 137,\n BSC: 56,\n ARBITRUM: 42161,\n OPTIMISM: 10,\n BASE: 8453,\n AVALANCHE: 43114,\n ZKSYNC: 324,\n LINEA: 59144,\n SCROLL: 534352,\n BLAST: 81457,\n // Testnets\n SEPOLIA: 11155111,\n BASE_SEPOLIA: 84532,\n ARBITRUM_SEPOLIA: 421614,\n} as const;\n\nexport const DEFAULT_CHAIN_ID = CHAIN_IDS.BASE;\n\n// ===== Chain Icons (Simple emoji fallback) =====\nconst CHAIN_ICONS: Record<number, string> = {\n 1: '\\u229F', // Ethereum\n 137: '\\uD83D\\uDFE3', // Polygon\n 56: '\\uD83D\\uDFE1', // BSC\n 42161: '\\uD83D\\uDD35', // Arbitrum\n 10: '\\uD83D\\uDD34', // Optimism\n 8453: '\\uD83D\\uDD37', // Base\n 43114: '\\uD83D\\uDD3A', // Avalanche\n 324: '\\u26A1', // zkSync\n 59144: '\\uD83D\\uDD39', // Linea\n 534352: '\\uD83D\\uDCDC', // Scroll\n};\n\nfunction getChainIcon(chainId: number): string {\n return CHAIN_ICONS[chainId] || '\\uD83D\\uDD17';\n}\n\n// ===== Token Names Mapping =====\n// Common token symbols to human-readable names\nexport const TOKEN_NAMES: Record<string, string> = {\n ETH: 'Ethereum',\n BTC: 'Bitcoin',\n BNB: 'BNB',\n MATIC: 'Polygon',\n POL: 'Polygon',\n AVAX: 'Avalanche',\n USDT: 'Tether',\n USDC: 'USD Coin',\n DAI: 'Dai',\n WBTC: 'Wrapped Bitcoin',\n WETH: 'Wrapped Ether',\n ARB: 'Arbitrum',\n OP: 'Optimism',\n LINK: 'Chainlink',\n UNI: 'Uniswap',\n AAVE: 'Aave',\n CRV: 'Curve',\n MKR: 'Maker',\n SNX: 'Synthetix',\n COMP: 'Compound',\n SUSHI: 'SushiSwap',\n YFI: 'Yearn Finance',\n SOL: 'Solana',\n DOT: 'Polkadot',\n ATOM: 'Cosmos',\n NEAR: 'Near Protocol',\n};\n\n// ===== CoinGecko ID Mapping =====\n// For price lookups via CoinGecko API\nexport const COINGECKO_IDS: Record<string, string> = {\n ETH: 'ethereum',\n BTC: 'bitcoin',\n BNB: 'binancecoin',\n MATIC: 'matic-network',\n POL: 'matic-network',\n AVAX: 'avalanche-2',\n USDT: 'tether',\n USDC: 'usd-coin',\n DAI: 'dai',\n WBTC: 'wrapped-bitcoin',\n WETH: 'weth',\n ARB: 'arbitrum',\n OP: 'optimism',\n LINK: 'chainlink',\n UNI: 'uniswap',\n AAVE: 'aave',\n SOL: 'solana',\n};\n\n// ===== Backwards Compatibility =====\n// @deprecated - Use getChains() or fetch from Engine API\n// These static configs are kept for backwards compatibility only\n\nexport const CHAIN_CONFIGS: Record<string, ChainConfig> = {\n ethereum: {\n id: 1,\n name: 'Ethereum',\n shortName: 'ETH',\n icon: '\\u229F',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://ethereum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n testnet: false,\n },\n polygon: {\n id: 137,\n name: 'Polygon',\n shortName: 'MATIC',\n icon: '\\uD83D\\uDFE3',\n nativeCurrency: { name: 'POL', symbol: 'POL', decimals: 18 },\n rpcUrls: ['https://polygon.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n testnet: false,\n },\n base: {\n id: 8453,\n name: 'Base',\n shortName: 'BASE',\n icon: '\\uD83D\\uDD37',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://base.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://basescan.org'],\n testnet: false,\n },\n arbitrum: {\n id: 42161,\n name: 'Arbitrum One',\n shortName: 'ARB',\n icon: '\\uD83D\\uDD35',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://arbitrum.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://arbiscan.io'],\n testnet: false,\n },\n optimism: {\n id: 10,\n name: 'Optimism',\n shortName: 'OP',\n icon: '\\uD83D\\uDD34',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://optimism.rpc.thirdweb.com'],\n blockExplorerUrls: ['https://optimistic.etherscan.io'],\n testnet: false,\n },\n};\n\n// @deprecated - Use getChains() to get all supported chains\nexport const SUPPORTED_CHAINS = Object.keys(CHAIN_CONFIGS);\n\n// @deprecated - Use getChainByName() instead\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAIN_CONFIGS[chain.toLowerCase()];\n}\n","/**\n * ONE Engine Client - The unified API gateway for all ONE Ecosystem services\n *\n * All wallet operations, onramp, swap, trading go through ONE Engine.\n * Thirdweb/Onramper/etc are internal to ONE Engine and hidden from clients.\n */\n\nimport { getConfig } from '../config';\nimport type {\n ApiResponse,\n User,\n Token,\n WalletBalance,\n Transaction,\n AIStrategy,\n AIOrder,\n AIOrderStatus,\n AITradeExecution,\n AITradeAllocation,\n AINavSnapshot,\n AIPortfolioSummary,\n AIRedemptionResult,\n AIMarketData,\n CreateAIOrderRequest,\n StrategyCategory,\n NFT,\n NFTCollection,\n Contract,\n ContractReadParams,\n ContractWriteParams,\n ContractDeployParams,\n BillProvider,\n BillPayment,\n OfframpQuote,\n OfframpRequest,\n OfframpTransaction,\n StakingPool,\n StakingPosition,\n ReferralInfo,\n Referral,\n UserProfile,\n UserSettings,\n Notification,\n BridgeQuote,\n BridgeTransaction,\n GasEstimate,\n GasPrice,\n WalletImportRequest,\n PortfolioAnalytics,\n LimitOrder,\n TradingCondition,\n Webhook,\n WebhookDelivery,\n CreateWebhookInput,\n UpdateWebhookInput,\n AdminUser,\n AdminProject,\n SystemStats,\n PaginatedResult,\n AdminListOptions,\n SystemLog,\n RateLimitInfo,\n} from '../types';\n\n// ===== Auth Types =====\nexport interface EngineAuthResponse {\n user: User;\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n}\n\n// ===== Wallet Types =====\nexport interface EngineWalletBalance {\n address: string;\n totalUsd: number;\n change24h: number;\n changePercent24h: number;\n tokens: Token[];\n}\n\nexport interface EngineTransactionRequest {\n to: string;\n amount: string;\n tokenSymbol: string;\n chainId: number;\n memo?: string;\n}\n\nexport interface EngineTransactionResponse {\n txId: string;\n status: 'queued' | 'pending' | 'confirmed' | 'failed';\n txHash?: string;\n explorerUrl?: string;\n}\n\n// ===== Onramp Types =====\nexport interface OnrampSessionRequest {\n walletAddress: string;\n fiatCurrency?: string;\n fiatAmount?: number;\n cryptoCurrency?: string;\n cryptoNetwork?: string;\n paymentMethod?: string;\n redirectUrl?: string;\n}\n\nexport interface OnrampSession {\n sessionId: string;\n widgetUrl: string;\n expiresAt: string;\n}\n\nexport interface OnrampQuote {\n provider: string;\n fiatCurrency: string;\n fiatAmount: number;\n cryptoCurrency: string;\n cryptoAmount: number;\n rate: number;\n fees: {\n network: number;\n provider: number;\n total: number;\n };\n paymentMethod: string;\n estimatedTime: string;\n}\n\nexport interface OnrampTransaction {\n id: string;\n sessionId: string;\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'expired';\n fiatAmount: number;\n fiatCurrency: string;\n cryptoAmount?: number;\n cryptoCurrency: string;\n walletAddress: string;\n txHash?: string;\n createdAt: string;\n completedAt?: string;\n}\n\n// ===== Swap Types =====\nexport interface SwapQuoteRequest {\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toChainId: number;\n walletAddress: string;\n slippage?: number;\n}\n\nexport interface SwapQuote {\n quoteId: string;\n fromToken: string;\n fromAmount: string;\n fromChainId: number;\n toToken: string;\n toAmount: string;\n toChainId: number;\n rate: number;\n priceImpact: number;\n estimatedGas: string;\n estimatedTime: string;\n fees: {\n gas: number;\n protocol: number;\n total: number;\n };\n expiresAt: string;\n}\n\nexport interface SwapExecuteRequest {\n quoteId: string;\n walletAddress: string;\n signature?: string; // For backend wallets\n}\n\nexport interface SwapResult {\n swapId: string;\n status: 'pending' | 'confirming' | 'completed' | 'failed';\n txHash?: string;\n fromAmount: string;\n toAmount?: string;\n}\n\n// ===== Main Client =====\nexport class OneEngineClient {\n private baseUrl: string;\n private clientId: string;\n private secretKey?: string;\n private accessToken?: string;\n\n constructor(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n }) {\n const config = getConfig();\n this.baseUrl = options?.baseUrl || config.oneEngineUrl;\n this.clientId = options?.clientId || config.oneClientId || '';\n this.secretKey = options?.secretKey || config.oneSecretKey;\n }\n\n /**\n * Set access token for authenticated requests\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n }\n\n /**\n * Clear access token\n */\n clearAccessToken() {\n this.accessToken = undefined;\n }\n\n private getHeaders(includeSecret = false): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-client-id': this.clientId,\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n if (includeSecret && this.secretKey) {\n headers['x-secret-key'] = this.secretKey;\n }\n\n return headers;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n includeSecret = false\n ): Promise<ApiResponse<T>> {\n try {\n const response = await fetch(`${this.baseUrl}${endpoint}`, {\n ...options,\n headers: {\n ...this.getHeaders(includeSecret),\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: data.error?.code || `HTTP_${response.status}`,\n message: data.error?.message || 'Request failed',\n },\n };\n }\n\n return {\n success: true,\n data: data.data || data,\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network request failed',\n },\n };\n }\n }\n\n // ===============================\n // AUTH ENDPOINTS\n // ===============================\n\n /**\n * Send OTP to email for authentication\n */\n async sendEmailOtp(email: string): Promise<ApiResponse<{ message: string }>> {\n return this.request('/api/v1/auth/otp', {\n method: 'POST',\n body: JSON.stringify({ email }),\n });\n }\n\n /**\n * Verify OTP and get access token\n */\n async verifyEmailOtp(email: string, otp: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/otp/verify', {\n method: 'POST',\n body: JSON.stringify({ email, otp }),\n });\n }\n\n /**\n * Authenticate with wallet signature\n */\n async authWithWallet(\n walletAddress: string,\n signature: string,\n message: string\n ): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/wallet', {\n method: 'POST',\n body: JSON.stringify({ walletAddress, signature, message }),\n });\n }\n\n /**\n * Refresh access token\n */\n async refreshToken(refreshToken: string): Promise<ApiResponse<EngineAuthResponse>> {\n return this.request('/api/v1/auth/refresh', {\n method: 'POST',\n body: JSON.stringify({ refreshToken }),\n });\n }\n\n /**\n * Get current user\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n return this.request('/api/v1/auth/me', { method: 'GET' });\n }\n\n /**\n * Sign out\n */\n async signOut(): Promise<ApiResponse<{ success: boolean }>> {\n return this.request('/api/v1/auth/logout', { method: 'POST' });\n }\n\n // ===============================\n // WALLET/ASSETS ENDPOINTS\n // ===============================\n\n /**\n * Get wallet balance across all chains\n */\n async getWalletBalance(\n walletAddress: string,\n chains?: number[]\n ): Promise<ApiResponse<EngineWalletBalance>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (chains?.length && chains.length > 0) {\n params.set('chainId', chains[0].toString()); // Engine expects single chainId\n }\n return this.request(`/api/v1/assets?${params}`, { method: 'GET' });\n }\n\n /**\n * Get portfolio summary\n */\n async getPortfolioSummary(\n walletAddress: string\n ): Promise<ApiResponse<{ totalValue: number; change24h: number; tokens: Token[] }>> {\n const params = new URLSearchParams({ address: walletAddress });\n return this.request(`/api/v1/assets/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's wallets\n */\n async getUserWallets(\n chainId?: number\n ): Promise<ApiResponse<{ wallets: any[]; total: number }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/wallet${params}`, { method: 'GET' });\n }\n\n /**\n * Create a new wallet\n */\n async createWallet(\n chainId: number = 8453,\n type: 'smart' | 'eoa' | 'multisig' = 'smart'\n ): Promise<ApiResponse<{ wallet: any; smartAccountAddress: string; personalAddress: string }>> {\n return this.request('/api/v1/wallet', {\n method: 'POST',\n body: JSON.stringify({ chainId, type }),\n });\n }\n\n /**\n * Get wallet transactions (placeholder - needs endpoint)\n */\n async getWalletTransactions(\n walletAddress: string,\n options?: { limit?: number; offset?: number; chainId?: number }\n ): Promise<ApiResponse<{ transactions: Transaction[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n return this.request(`/api/v1/assets/transactions?${params}`, { method: 'GET' });\n }\n\n /**\n * Send native token or ERC20\n */\n async sendTransaction(\n request: EngineTransactionRequest\n ): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request('/api/v1/wallet/send', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get transaction status\n */\n async getTransactionStatus(txId: string): Promise<ApiResponse<EngineTransactionResponse>> {\n return this.request(`/api/v1/wallet/transaction/${txId}`, { method: 'GET' });\n }\n\n // ===============================\n // ONRAMP ENDPOINTS (Fiat-to-Crypto)\n // ===============================\n\n /**\n * Get onramp quote\n */\n async getOnrampQuote(\n fiatCurrency: string,\n fiatAmount: number,\n cryptoCurrency: string,\n paymentMethod?: string\n ): Promise<ApiResponse<OnrampQuote[]>> {\n const params = new URLSearchParams({\n fiatCurrency,\n fiatAmount: fiatAmount.toString(),\n cryptoCurrency,\n });\n if (paymentMethod) params.set('paymentMethod', paymentMethod);\n return this.request(`/api/v1/fiat/onramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create onramp session (returns widget URL)\n */\n async createOnrampSession(\n request: OnrampSessionRequest\n ): Promise<ApiResponse<OnrampSession>> {\n return this.request('/api/v1/fiat/onramp', {\n method: 'POST',\n body: JSON.stringify({\n fiatCurrency: request.fiatCurrency || 'USD',\n fiatAmount: request.fiatAmount || 100,\n cryptoCurrency: request.cryptoCurrency || 'ETH',\n walletAddress: request.walletAddress,\n chainId: 8453, // Default to Base\n }),\n });\n }\n\n /**\n * Get onramp session status\n */\n async getOnrampStatus(sessionId: string): Promise<ApiResponse<OnrampTransaction>> {\n return this.request(`/api/v1/fiat/onramp/${sessionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported currencies (fiat + crypto)\n */\n async getSupportedCurrencies(): Promise<ApiResponse<{ fiatCurrencies: string[]; cryptoCurrencies: string[] }>> {\n return this.request('/api/v1/fiat/onramp', { method: 'GET' });\n }\n\n /**\n * Get supported fiat currencies\n */\n async getSupportedFiatCurrencies(): Promise<ApiResponse<string[]>> {\n const result = await this.getSupportedCurrencies();\n if (result.success && result.data) {\n return { success: true, data: result.data.fiatCurrencies };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get supported payment methods\n */\n async getSupportedPaymentMethods(country?: string): Promise<ApiResponse<string[]>> {\n // Placeholder - engine doesn't have this endpoint yet\n return { success: true, data: ['card', 'bank_transfer', 'apple_pay', 'google_pay'] };\n }\n\n // ===============================\n // SWAP ENDPOINTS\n // ===============================\n\n /**\n * Get swap quote\n */\n async getSwapQuote(request: SwapQuoteRequest): Promise<ApiResponse<SwapQuote>> {\n return this.request('/api/v1/swap/quote', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Execute swap\n */\n async executeSwap(request: SwapExecuteRequest): Promise<ApiResponse<SwapResult>> {\n return this.request('/api/v1/swap/execute', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get swap status\n */\n async getSwapStatus(swapId: string): Promise<ApiResponse<SwapResult>> {\n return this.request(`/api/v1/swap/${swapId}`, { method: 'GET' });\n }\n\n /**\n * Get supported tokens for swap\n */\n async getSupportedSwapTokens(chainId?: number): Promise<ApiResponse<{ tokens: Token[] }>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/swap/tokens${params}`, { method: 'GET' });\n }\n\n /**\n * Get supported chains for swap\n */\n async getSupportedSwapChains(): Promise<ApiResponse<{ chains: { id: number; name: string }[] }>> {\n return this.request('/api/v1/swap/chains', { method: 'GET' });\n }\n\n // ===============================\n // AI TRADING/QUANT ENDPOINTS\n // ===============================\n\n /**\n * Get available AI trading strategies\n */\n async getStrategies(): Promise<ApiResponse<AIStrategy[]>> {\n return this.request('/api/v1/quant/strategies', { method: 'GET' });\n }\n\n /**\n * Get strategy details\n */\n async getStrategy(strategyId: string): Promise<ApiResponse<AIStrategy>> {\n return this.request(`/api/v1/quant/strategies/${strategyId}`, { method: 'GET' });\n }\n\n /**\n * Get user's positions\n */\n async getPositions(): Promise<ApiResponse<any[]>> {\n return this.request('/api/v1/quant/positions', { method: 'GET' });\n }\n\n /**\n * Create investment order\n */\n async createOrder(\n strategyId: string,\n amount: number,\n currency: string\n ): Promise<ApiResponse<AIOrder>> {\n return this.request('/api/v1/trading/orders', {\n method: 'POST',\n body: JSON.stringify({ strategyId, amount, currency }),\n });\n }\n\n /**\n * Get user's orders\n */\n async getUserOrders(): Promise<ApiResponse<AIOrder[]>> {\n return this.request('/api/v1/trading/orders', { method: 'GET' });\n }\n\n /**\n * Get user's portfolio stats from positions\n */\n async getPortfolioStats(): Promise<ApiResponse<{\n totalInvested: number;\n totalValue: number;\n totalPnl: number;\n totalPnlPercent: number;\n activePositions: number;\n }>> {\n // Derive from positions\n const positionsResult = await this.getPositions();\n if (positionsResult.success && positionsResult.data) {\n const positions = positionsResult.data;\n const totalInvested = positions.reduce((sum, p) => sum + (p.investedAmount || 0), 0);\n const totalValue = positions.reduce((sum, p) => sum + (p.currentValue || 0), 0);\n const totalPnl = totalValue - totalInvested;\n const totalPnlPercent = totalInvested > 0 ? (totalPnl / totalInvested) * 100 : 0;\n return {\n success: true,\n data: {\n totalInvested,\n totalValue,\n totalPnl,\n totalPnlPercent,\n activePositions: positions.filter((p: any) => p.status === 'active').length,\n },\n };\n }\n return {\n success: true,\n data: { totalInvested: 0, totalValue: 0, totalPnl: 0, totalPnlPercent: 0, activePositions: 0 },\n };\n }\n\n // ===============================\n // MARKET/PRICE ENDPOINTS\n // ===============================\n\n /**\n * Get token prices\n */\n async getTokenPrices(symbols: string[]): Promise<ApiResponse<Record<string, {\n price: number;\n change24h: number;\n marketCap?: number;\n }>>> {\n // Convert symbols to Bybit format (add USDT suffix if needed)\n const bybitSymbols = symbols.map(s => {\n const upper = s.toUpperCase();\n if (upper.endsWith('USDT')) return upper;\n return `${upper}USDT`;\n });\n\n const result = await this.request<{ markets: any[] }>(\n `/api/v1/trading/market?symbols=${bybitSymbols.join(',')}`,\n { method: 'GET' }\n );\n\n if (result.success && result.data?.markets) {\n const prices: Record<string, { price: number; change24h: number; marketCap?: number }> = {};\n for (const market of result.data.markets) {\n const symbol = market.symbol?.replace('USDT', '') || '';\n prices[symbol] = {\n price: parseFloat(market.lastPrice) || 0,\n change24h: parseFloat(market.price24hPcnt) * 100 || 0,\n marketCap: undefined, // Bybit doesn't provide this\n };\n }\n return { success: true, data: prices };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Get market data overview\n */\n async getMarketData(): Promise<ApiResponse<{\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n markets: any[];\n }>> {\n const result = await this.request<{ markets: any[] }>('/api/v1/trading/market', { method: 'GET' });\n if (result.success && result.data?.markets) {\n return {\n success: true,\n data: {\n totalMarketCap: 0, // Would need separate API\n totalVolume24h: result.data.markets.reduce((sum, m) => sum + (parseFloat(m.volume24h) || 0), 0),\n btcDominance: 0, // Would need separate API\n markets: result.data.markets,\n },\n };\n }\n return { success: false, error: result.error };\n }\n\n // ===============================\n // NFT ENDPOINTS\n // ===============================\n\n /**\n * Get user's NFTs\n */\n async getUserNFTs(\n walletAddress: string,\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ nfts: NFT[]; total: number }>> {\n const params = new URLSearchParams({ address: walletAddress });\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/assets/nfts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get NFT details\n */\n async getNFTDetails(\n contractAddress: string,\n tokenId: string,\n chainId: number\n ): Promise<ApiResponse<NFT>> {\n return this.request(`/api/v1/assets/nfts/${contractAddress}/${tokenId}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Get NFT collection\n */\n async getNFTCollection(\n contractAddress: string,\n chainId: number\n ): Promise<ApiResponse<NFTCollection>> {\n return this.request(`/api/v1/assets/nfts/collection/${contractAddress}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Transfer NFT\n */\n async transferNFT(params: {\n contractAddress: string;\n tokenId: string;\n chainId: number;\n to: string;\n tokenType?: 'ERC721' | 'ERC1155';\n amount?: number; // For ERC1155\n }): Promise<ApiResponse<{ txHash: string; status: string }>> {\n return this.request('/api/v1/assets/nfts/transfer', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // CONTRACT ENDPOINTS\n // ===============================\n\n /**\n * Get user's contracts\n */\n async getUserContracts(\n options?: { chainId?: number; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ contracts: Contract[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.chainId) params.set('chainId', options.chainId.toString());\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/contracts?${params}`, { method: 'GET' });\n }\n\n /**\n * Get contract details\n */\n async getContractDetails(\n address: string,\n chainId: number\n ): Promise<ApiResponse<Contract>> {\n return this.request(`/api/v1/contracts/${address}?chainId=${chainId}`, { method: 'GET' });\n }\n\n /**\n * Read contract (call view function)\n */\n async readContract(params: ContractReadParams): Promise<ApiResponse<any>> {\n return this.request('/api/v1/contracts/read', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Write to contract (execute transaction)\n */\n async writeContract(params: ContractWriteParams): Promise<ApiResponse<{\n txHash: string;\n status: string;\n }>> {\n return this.request('/api/v1/contracts/write', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Deploy contract\n */\n async deployContract(params: ContractDeployParams): Promise<ApiResponse<{\n address: string;\n txHash: string;\n contract: Contract;\n }>> {\n return this.request('/api/v1/contracts/deploy', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // OFFRAMP ENDPOINTS (Crypto-to-Fiat)\n // ===============================\n\n /**\n * Get offramp quote\n */\n async getOfframpQuote(\n cryptoCurrency: string,\n cryptoAmount: number,\n fiatCurrency: string,\n payoutMethod?: string\n ): Promise<ApiResponse<OfframpQuote[]>> {\n const params = new URLSearchParams({\n cryptoCurrency,\n cryptoAmount: cryptoAmount.toString(),\n fiatCurrency,\n });\n if (payoutMethod) params.set('payoutMethod', payoutMethod);\n return this.request(`/api/v1/fiat/offramp/quote?${params}`, { method: 'GET' });\n }\n\n /**\n * Create offramp transaction\n */\n async createOfframpTransaction(request: OfframpRequest): Promise<ApiResponse<OfframpTransaction>> {\n return this.request('/api/v1/fiat/offramp', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get offramp transaction status\n */\n async getOfframpStatus(transactionId: string): Promise<ApiResponse<OfframpTransaction>> {\n return this.request(`/api/v1/fiat/offramp/${transactionId}`, { method: 'GET' });\n }\n\n /**\n * Get supported payout methods\n */\n async getSupportedPayoutMethods(country?: string): Promise<ApiResponse<string[]>> {\n const params = country ? `?country=${country}` : '';\n return this.request(`/api/v1/fiat/offramp/methods${params}`, { method: 'GET' });\n }\n\n // ===============================\n // BILL PAYMENT ENDPOINTS\n // ===============================\n\n /**\n * Get bill providers\n */\n async getBillProviders(\n country?: string,\n category?: string\n ): Promise<ApiResponse<BillProvider[]>> {\n const params = new URLSearchParams();\n if (country) params.set('country', country);\n if (category) params.set('category', category);\n return this.request(`/api/v1/bills/providers?${params}`, { method: 'GET' });\n }\n\n /**\n * Get bill details/validate account\n */\n async validateBillAccount(\n providerId: string,\n accountNumber: string\n ): Promise<ApiResponse<{\n valid: boolean;\n accountName?: string;\n minAmount?: number;\n maxAmount?: number;\n dueAmount?: number;\n }>> {\n return this.request('/api/v1/bills/validate', {\n method: 'POST',\n body: JSON.stringify({ providerId, accountNumber }),\n });\n }\n\n /**\n * Pay bill\n */\n async payBill(params: {\n providerId: string;\n accountNumber: string;\n amount: number;\n currency: string;\n }): Promise<ApiResponse<BillPayment>> {\n return this.request('/api/v1/bills/pay', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bill payment history\n */\n async getBillHistory(\n options?: { limit?: number; offset?: number }\n ): Promise<ApiResponse<{ payments: BillPayment[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/bills/history?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // STAKING ENDPOINTS\n // ===============================\n\n /**\n * Get staking pools\n */\n async getStakingPools(\n chainId?: number\n ): Promise<ApiResponse<StakingPool[]>> {\n const params = chainId ? `?chainId=${chainId}` : '';\n return this.request(`/api/v1/staking/pools${params}`, { method: 'GET' });\n }\n\n /**\n * Get user's staking positions\n */\n async getStakingPositions(): Promise<ApiResponse<StakingPosition[]>> {\n return this.request('/api/v1/staking/positions', { method: 'GET' });\n }\n\n /**\n * Stake tokens\n */\n async stake(params: {\n poolId: string;\n amount: number;\n }): Promise<ApiResponse<{ positionId: string; txHash: string }>> {\n return this.request('/api/v1/staking/stake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Unstake tokens\n */\n async unstake(params: {\n positionId: string;\n amount?: number; // Optional for partial unstake\n }): Promise<ApiResponse<{ txHash: string }>> {\n return this.request('/api/v1/staking/unstake', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Claim staking rewards\n */\n async claimStakingRewards(positionId: string): Promise<ApiResponse<{ txHash: string; amount: number }>> {\n return this.request('/api/v1/staking/claim', {\n method: 'POST',\n body: JSON.stringify({ positionId }),\n });\n }\n\n // ===============================\n // USER PROFILE ENDPOINTS\n // ===============================\n\n /**\n * Get user profile\n */\n async getUserProfile(): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', { method: 'GET' });\n }\n\n /**\n * Update user profile\n */\n async updateUserProfile(updates: Partial<UserProfile>): Promise<ApiResponse<UserProfile>> {\n return this.request('/api/v1/user/profile', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get user settings\n */\n async getUserSettings(): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', { method: 'GET' });\n }\n\n /**\n * Update user settings\n */\n async updateUserSettings(updates: Partial<UserSettings>): Promise<ApiResponse<UserSettings>> {\n return this.request('/api/v1/user/settings', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n // ===============================\n // NOTIFICATION ENDPOINTS\n // ===============================\n\n /**\n * Get notifications\n */\n async getNotifications(\n options?: { unreadOnly?: boolean; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ notifications: Notification[]; unreadCount: number }>> {\n const params = new URLSearchParams();\n if (options?.unreadOnly) params.set('unreadOnly', 'true');\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return this.request(`/api/v1/notifications?${params}`, { method: 'GET' });\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationRead(notificationId: string): Promise<ApiResponse<void>> {\n return this.request(`/api/v1/notifications/${notificationId}/read`, { method: 'POST' });\n }\n\n /**\n * Mark all notifications as read\n */\n async markAllNotificationsRead(): Promise<ApiResponse<void>> {\n return this.request('/api/v1/notifications/read-all', { method: 'POST' });\n }\n\n // ===============================\n // REFERRAL ENDPOINTS\n // ===============================\n\n /**\n * Get referral info\n */\n async getReferralInfo(): Promise<ApiResponse<ReferralInfo>> {\n return this.request('/api/v1/referral', { method: 'GET' });\n }\n\n /**\n * Get referred users\n */\n async getReferrals(): Promise<ApiResponse<Referral[]>> {\n return this.request('/api/v1/referral/list', { method: 'GET' });\n }\n\n /**\n * Apply referral code\n */\n async applyReferralCode(code: string): Promise<ApiResponse<{ success: boolean; message: string }>> {\n return this.request('/api/v1/referral/apply', {\n method: 'POST',\n body: JSON.stringify({ code }),\n });\n }\n\n /**\n * Claim referral rewards\n */\n async claimReferralRewards(): Promise<ApiResponse<{ amount: number; txHash?: string }>> {\n return this.request('/api/v1/referral/claim', { method: 'POST' });\n }\n\n // ===============================\n // KYC ENDPOINTS\n // ===============================\n\n /**\n * Get KYC status\n */\n async getKycStatus(): Promise<ApiResponse<{\n status: 'none' | 'pending' | 'verified' | 'rejected';\n level: number;\n limits: { daily: number; monthly: number };\n rejectionReason?: string;\n }>> {\n return this.request('/api/v1/kyc/status', { method: 'GET' });\n }\n\n /**\n * Start KYC verification\n */\n async startKycVerification(level: number): Promise<ApiResponse<{\n verificationUrl: string;\n sessionId: string;\n }>> {\n return this.request('/api/v1/kyc/start', {\n method: 'POST',\n body: JSON.stringify({ level }),\n });\n }\n\n /**\n * Submit KYC documents\n */\n async submitKycDocuments(params: {\n documentType: 'passport' | 'id_card' | 'drivers_license';\n frontImage: string; // base64\n backImage?: string; // base64\n selfieImage: string; // base64\n }): Promise<ApiResponse<{ status: string; message: string }>> {\n return this.request('/api/v1/kyc/submit', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ===============================\n // BRIDGE ENDPOINTS\n // ===============================\n\n /**\n * Get bridge quote\n */\n async getBridgeQuote(params: {\n fromChainId: number;\n toChainId: number;\n fromToken: string;\n toToken: string;\n amount: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeQuote>> {\n return this.request('/api/v1/bridge/quote', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Execute bridge transaction\n */\n async executeBridge(params: {\n quoteId: string;\n walletAddress: string;\n }): Promise<ApiResponse<BridgeTransaction>> {\n return this.request('/api/v1/bridge/execute', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get bridge transaction status\n */\n async getBridgeStatus(bridgeId: string): Promise<ApiResponse<BridgeTransaction>> {\n return this.request(`/api/v1/bridge/${bridgeId}`, { method: 'GET' });\n }\n\n /**\n * Get supported bridge routes\n */\n async getSupportedBridgeRoutes(): Promise<ApiResponse<{\n routes: { fromChainId: number; toChainId: number; tokens: string[] }[];\n }>> {\n return this.request('/api/v1/bridge/routes', { method: 'GET' });\n }\n\n // ===============================\n // GAS ENDPOINTS\n // ===============================\n\n /**\n * Get gas estimate for transaction\n */\n async getGasEstimate(params: {\n chainId: number;\n to: string;\n data?: string;\n value?: string;\n }): Promise<ApiResponse<GasEstimate>> {\n return this.request('/api/v1/gas/estimate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get current gas prices for chain\n */\n async getGasPrice(chainId: number): Promise<ApiResponse<GasPrice>> {\n return this.request(`/api/v1/gas/price?chainId=${chainId}`, { method: 'GET' });\n }\n\n // ===============================\n // WALLET IMPORT/EXPORT ENDPOINTS\n // ===============================\n\n /**\n * Import wallet from private key or mnemonic\n */\n async importWallet(request: WalletImportRequest): Promise<ApiResponse<{\n wallet: any;\n address: string;\n smartAccountAddress?: string;\n }>> {\n return this.request('/api/v1/wallet/import', {\n method: 'POST',\n body: JSON.stringify(request),\n }, true); // Include secret key for secure import\n }\n\n /**\n * Export wallet (get encrypted private key)\n * Requires additional authentication\n */\n async exportWallet(walletId: string, pin: string): Promise<ApiResponse<{\n encryptedPrivateKey: string;\n address: string;\n }>> {\n return this.request('/api/v1/wallet/export', {\n method: 'POST',\n body: JSON.stringify({ walletId, pin }),\n }, true);\n }\n\n /**\n * Generate new mnemonic phrase\n */\n async generateMnemonic(): Promise<ApiResponse<{ mnemonic: string; address: string }>> {\n return this.request('/api/v1/wallet/generate-mnemonic', { method: 'POST' }, true);\n }\n\n /**\n * Validate mnemonic phrase\n */\n async validateMnemonic(mnemonic: string): Promise<ApiResponse<{ valid: boolean; address?: string }>> {\n return this.request('/api/v1/wallet/validate-mnemonic', {\n method: 'POST',\n body: JSON.stringify({ mnemonic }),\n });\n }\n\n // ===============================\n // PORTFOLIO ANALYTICS ENDPOINTS\n // ===============================\n\n /**\n * Get portfolio analytics with historical data\n */\n async getPortfolioAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' | '1y' | 'all' = '30d'\n ): Promise<ApiResponse<PortfolioAnalytics>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/portfolio?${params}`, { method: 'GET' });\n }\n\n /**\n * Get transaction analytics\n */\n async getTransactionAnalytics(\n walletAddress: string,\n period: '24h' | '7d' | '30d' | '90d' = '30d'\n ): Promise<ApiResponse<{\n totalTransactions: number;\n totalVolume: number;\n avgTransactionValue: number;\n byType: Record<string, number>;\n byChain: Record<string, number>;\n }>> {\n const params = new URLSearchParams({ address: walletAddress, period });\n return this.request(`/api/v1/analytics/transactions?${params}`, { method: 'GET' });\n }\n\n // ===============================\n // ADVANCED TRADING ENDPOINTS\n // ===============================\n\n /**\n * Create limit order\n */\n async createLimitOrder(params: {\n tokenSymbol: string;\n type: 'buy' | 'sell';\n amount: number;\n limitPrice: number;\n chainId: number;\n expiresIn?: number; // seconds\n conditions?: TradingCondition[];\n }): Promise<ApiResponse<LimitOrder>> {\n return this.request('/api/v1/trading/limit-orders', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get user's limit orders\n */\n async getLimitOrders(status?: 'pending' | 'filled' | 'cancelled'): Promise<ApiResponse<LimitOrder[]>> {\n const params = status ? `?status=${status}` : '';\n return this.request(`/api/v1/trading/limit-orders${params}`, { method: 'GET' });\n }\n\n /**\n * Cancel limit order\n */\n async cancelLimitOrder(orderId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/limit-orders/${orderId}`, { method: 'DELETE' });\n }\n\n /**\n * Set price alert\n */\n async setPriceAlert(params: {\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n notification: 'push' | 'email' | 'both';\n }): Promise<ApiResponse<{ alertId: string }>> {\n return this.request('/api/v1/trading/alerts', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get price alerts\n */\n async getPriceAlerts(): Promise<ApiResponse<{\n id: string;\n tokenSymbol: string;\n targetPrice: number;\n condition: 'above' | 'below';\n status: 'active' | 'triggered' | 'cancelled';\n createdAt: string;\n triggeredAt?: string;\n }[]>> {\n return this.request('/api/v1/trading/alerts', { method: 'GET' });\n }\n\n /**\n * Delete price alert\n */\n async deletePriceAlert(alertId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/trading/alerts/${alertId}`, { method: 'DELETE' });\n }\n\n // ===============================\n // SESSION MANAGEMENT\n // ===============================\n\n /**\n * Get active sessions\n */\n async getActiveSessions(): Promise<ApiResponse<{\n sessions: {\n id: string;\n deviceName: string;\n ipAddress: string;\n lastActive: string;\n current: boolean;\n }[];\n }>> {\n return this.request('/api/v1/auth/sessions', { method: 'GET' });\n }\n\n /**\n * Revoke session\n */\n async revokeSession(sessionId: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/auth/sessions/${sessionId}`, { method: 'DELETE' });\n }\n\n /**\n * Revoke all other sessions\n */\n async revokeAllOtherSessions(): Promise<ApiResponse<{ revokedCount: number }>> {\n return this.request('/api/v1/auth/sessions/revoke-all', { method: 'POST' });\n }\n\n // ========== Webhooks ==========\n\n /**\n * List webhooks for the project\n */\n async listWebhooks(options?: { isActive?: boolean }): Promise<ApiResponse<{ webhooks: Webhook[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/webhooks${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get webhook by ID\n */\n async getWebhook(webhookId: string): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'GET' });\n }\n\n /**\n * Create a webhook\n */\n async createWebhook(input: CreateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request('/api/v1/webhooks', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Update a webhook\n */\n async updateWebhook(webhookId: string, input: UpdateWebhookInput): Promise<ApiResponse<{ webhook: Webhook }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n /**\n * Delete a webhook\n */\n async deleteWebhook(webhookId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/webhooks/${webhookId}`, { method: 'DELETE' });\n }\n\n /**\n * Get webhook deliveries\n */\n async getWebhookDeliveries(\n webhookId: string,\n options?: { status?: 'pending' | 'success' | 'failed'; limit?: number; offset?: number }\n ): Promise<ApiResponse<{ deliveries: WebhookDelivery[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n return this.request(`/api/v1/webhooks/${webhookId}/deliveries${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Test a webhook\n */\n async testWebhook(webhookId: string): Promise<ApiResponse<{\n success: boolean;\n statusCode?: number;\n responseTime?: number;\n error?: string;\n }>> {\n return this.request(`/api/v1/webhooks/${webhookId}/test`, { method: 'POST' });\n }\n\n // ========== Admin (requires admin role) ==========\n\n /**\n * List all users (admin only)\n */\n async adminListUsers(options?: AdminListOptions & {\n role?: 'user' | 'admin';\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminUser>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.role) params.set('role', options.role);\n if (options?.kycStatus) params.set('kycStatus', options.kycStatus);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/users${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user by ID (admin only)\n */\n async adminGetUser(userId: string): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, { method: 'GET' });\n }\n\n /**\n * Update user (admin only)\n */\n async adminUpdateUser(userId: string, data: {\n role?: 'user' | 'admin';\n isActive?: boolean;\n kycStatus?: 'none' | 'pending' | 'verified' | 'rejected';\n }): Promise<ApiResponse<{ user: AdminUser }>> {\n return this.request(`/api/v1/admin/users/${userId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * List all projects (admin only)\n */\n async adminListProjects(options?: AdminListOptions & {\n isActive?: boolean;\n }): Promise<ApiResponse<PaginatedResult<AdminProject>>> {\n const params = new URLSearchParams();\n if (options?.page) params.set('page', String(options.page));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.search) params.set('search', options.search);\n if (options?.sortBy) params.set('sortBy', options.sortBy);\n if (options?.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/admin/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get project by ID (admin only)\n */\n async adminGetProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project (admin only)\n */\n async adminUpdateProject(projectId: string, data: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/admin/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Regenerate project API key (admin only)\n */\n async adminRegenerateApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/admin/projects/${projectId}/regenerate-key`, { method: 'POST' });\n }\n\n /**\n * Get system statistics (admin only)\n */\n async adminGetStats(days?: number): Promise<ApiResponse<SystemStats>> {\n const query = days ? `?days=${days}` : '';\n return this.request(`/api/v1/admin/stats${query}`, { method: 'GET' });\n }\n\n /**\n * Get system logs (admin only)\n */\n async adminGetLogs(options?: {\n level?: 'info' | 'warn' | 'error';\n service?: string;\n limit?: number;\n offset?: number;\n startDate?: string;\n endDate?: string;\n }): Promise<ApiResponse<{ logs: SystemLog[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.level) params.set('level', options.level);\n if (options?.service) params.set('service', options.service);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n if (options?.startDate) params.set('startDate', options.startDate);\n if (options?.endDate) params.set('endDate', options.endDate);\n const query = params.toString();\n return this.request(`/api/v1/admin/logs${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get rate limit status (admin only)\n */\n async adminGetRateLimits(options?: {\n identifier?: string;\n limit?: number;\n }): Promise<ApiResponse<{ limits: RateLimitInfo[] }>> {\n const params = new URLSearchParams();\n if (options?.identifier) params.set('identifier', options.identifier);\n if (options?.limit) params.set('limit', String(options.limit));\n const query = params.toString();\n return this.request(`/api/v1/admin/rate-limits${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Clear rate limits for an identifier (admin only)\n */\n async adminClearRateLimits(identifier: string): Promise<ApiResponse<{ success: boolean }>> {\n return this.request(`/api/v1/admin/rate-limits/${identifier}`, { method: 'DELETE' });\n }\n\n // ========== AI Agent Configuration ==========\n\n /**\n * Get all AI agent configurations\n * This returns the full agent setup including tiers, cycles, and trading parameters\n */\n async getAgentConfigs(options?: {\n includeInactive?: boolean;\n agentId?: string;\n }): Promise<ApiResponse<{\n agents?: Array<{\n id: string;\n name: string;\n name_zh: string;\n description: string;\n description_zh: string;\n category: string;\n risk_level: number;\n icon: string;\n color: string;\n tiers: Array<{ tier: number; amount: number; label: string; label_zh: string }>;\n supported_cycles: number[];\n default_cycle: number;\n supported_pairs: string[];\n supported_chains: string[];\n is_active: boolean;\n preview: {\n tier: { tier: number; amount: number; label: string };\n cycle: number;\n dailyLots: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n };\n }>;\n agent?: any;\n shareRates?: Record<number, number>;\n }>> {\n const params = new URLSearchParams();\n if (options?.includeInactive) params.set('includeInactive', 'true');\n if (options?.agentId) params.set('agentId', options.agentId);\n const query = params.toString();\n return this.request(`/api/v1/agents${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Calculate subscription parameters for an agent\n */\n async calculateAgentParams(params: {\n agentId: string;\n amount: number;\n cycleDays: number;\n }): Promise<ApiResponse<{\n dailyLots: number;\n effectiveCapital: number;\n stabilityScore: number;\n roiRange: { min: number; max: number; userMin: number; userMax: number };\n shareRate: number;\n profitEstimate: { monthlyMin: number; monthlyMax: number; cycleMin: number; cycleMax: number };\n }>> {\n return this.request('/api/v1/agents/calculate', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get supported trading pairs from agents\n */\n async getTradingPairs(): Promise<ApiResponse<{\n pairs: string[];\n byAgent: Record<string, string[]>;\n }>> {\n const result = await this.getAgentConfigs();\n if (result.success && result.data?.agents) {\n const allPairs = new Set<string>();\n const byAgent: Record<string, string[]> = {};\n for (const agent of result.data.agents) {\n byAgent[agent.id] = agent.supported_pairs;\n agent.supported_pairs.forEach(p => allPairs.add(p));\n }\n return { success: true, data: { pairs: Array.from(allPairs), byAgent } };\n }\n return { success: false, error: result.error };\n }\n\n // ========== AI Quant Trading ==========\n\n /**\n * Get all AI trading strategies\n */\n async getAIStrategies(filters?: {\n category?: StrategyCategory;\n riskLevel?: number;\n minTvl?: number;\n isActive?: boolean;\n }): Promise<ApiResponse<{ strategies: AIStrategy[] }>> {\n const params = new URLSearchParams();\n if (filters?.category) params.set('category', filters.category);\n if (filters?.riskLevel) params.set('risk_level', String(filters.riskLevel));\n if (filters?.minTvl) params.set('min_tvl', String(filters.minTvl));\n if (filters?.isActive !== undefined) params.set('is_active', String(filters.isActive));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI strategy details\n */\n async getAIStrategy(strategyId: string, include?: ('performance' | 'market' | 'trades')[]): Promise<ApiResponse<{\n strategy: AIStrategy;\n performance?: AINavSnapshot[];\n marketData?: AIMarketData[];\n trades?: AITradeExecution[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get strategy performance history\n */\n async getAIStrategyPerformance(strategyId: string, days = 30): Promise<ApiResponse<{ performance: AINavSnapshot[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=performance&days=${days}`, { method: 'GET' });\n }\n\n /**\n * Get real-time market data for strategy pairs\n */\n async getAIStrategyMarketData(strategyId: string): Promise<ApiResponse<{ marketData: AIMarketData[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=market`, { method: 'GET' });\n }\n\n /**\n * Create AI trading order\n */\n async createAIOrder(request: CreateAIOrderRequest): Promise<ApiResponse<{ order: AIOrder }>> {\n return this.request('/api/v1/ai-quant/orders', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get user's AI orders\n */\n async getAIOrders(filters?: {\n strategyId?: string;\n status?: AIOrderStatus;\n }): Promise<ApiResponse<{ orders: AIOrder[] }>> {\n const params = new URLSearchParams();\n if (filters?.strategyId) params.set('strategy_id', filters.strategyId);\n if (filters?.status) params.set('status', filters.status);\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/orders${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get AI order details\n */\n async getAIOrder(orderId: string): Promise<ApiResponse<{\n order: AIOrder;\n strategy: AIStrategy;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}`, { method: 'GET' });\n }\n\n /**\n * Pause AI order\n */\n async pauseAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/pause`, { method: 'POST' });\n }\n\n /**\n * Resume AI order\n */\n async resumeAIOrder(orderId: string): Promise<ApiResponse<{ order: AIOrder; message: string }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/resume`, { method: 'POST' });\n }\n\n /**\n * Request redemption for AI order\n */\n async redeemAIOrder(orderId: string): Promise<ApiResponse<{\n success: boolean;\n redemption: AIRedemptionResult;\n message: string;\n }>> {\n return this.request(`/api/v1/ai-quant/orders/${orderId}/redeem`, { method: 'POST' });\n }\n\n /**\n * Get AI portfolio summary\n */\n async getAIPortfolio(include?: ('allocations' | 'orders')[]): Promise<ApiResponse<{\n portfolio: AIPortfolioSummary;\n allocations?: AITradeAllocation[];\n orders?: AIOrder[];\n }>> {\n const params = new URLSearchParams();\n if (include?.length) params.set('include', include.join(','));\n const query = params.toString();\n return this.request(`/api/v1/ai-quant/portfolio${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Get user's trade allocations\n */\n async getAITradeAllocations(limit = 50): Promise<ApiResponse<{ allocations: AITradeAllocation[] }>> {\n return this.request(`/api/v1/ai-quant/portfolio?include=allocations&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get trade history for a strategy\n */\n async getAITradeHistory(strategyId: string, limit = 50): Promise<ApiResponse<{ trades: AITradeExecution[] }>> {\n return this.request(`/api/v1/ai-quant/strategies/${strategyId}?include=trades&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Execute AI signals for a strategy (admin only)\n */\n async executeAISignals(strategyId: string): Promise<ApiResponse<{\n executions: AITradeExecution[];\n count: number;\n message: string;\n }>> {\n return this.request('/api/v1/ai-quant/execute', {\n method: 'POST',\n body: JSON.stringify({ strategyId }),\n });\n }\n\n // ========== Free Price APIs (No API Key Required) ==========\n\n /**\n * Get cryptocurrency prices (FREE - uses CoinGecko/Binance/CoinCap)\n */\n async getCryptoPrices(symbols: string[]): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?symbols=${symbols.join(',')}`, { method: 'GET' });\n }\n\n /**\n * Get single cryptocurrency price (FREE)\n */\n async getCryptoPrice(symbol: string): Promise<ApiResponse<{\n price: {\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n };\n }>> {\n return this.request(`/api/v1/prices/${symbol}`, { method: 'GET' });\n }\n\n /**\n * Get OHLCV candles for charting (FREE - from Binance)\n */\n async getCryptoCandles(\n symbol: string,\n interval: '1m' | '5m' | '15m' | '1h' | '4h' | '1d' = '1h',\n limit = 100\n ): Promise<ApiResponse<{\n symbol: string;\n interval: string;\n candles: Array<{\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n }>;\n }>> {\n return this.request(`/api/v1/prices/${symbol}?candles=true&interval=${interval}&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get top cryptocurrencies by market cap (FREE)\n */\n async getTopCryptos(limit = 20): Promise<ApiResponse<{\n prices: Array<{\n symbol: string;\n price: number;\n change24h: number;\n changePercent24h: number;\n high24h: number;\n low24h: number;\n volume24h: number;\n marketCap?: number;\n lastUpdated: string;\n }>;\n }>> {\n return this.request(`/api/v1/prices?type=top&limit=${limit}`, { method: 'GET' });\n }\n\n /**\n * Get crypto market overview (FREE)\n */\n async getCryptoMarketOverview(): Promise<ApiResponse<{\n overview: {\n totalMarketCap: number;\n totalVolume24h: number;\n btcDominance: number;\n marketCapChange24h: number;\n activeCryptocurrencies: number;\n };\n }>> {\n return this.request('/api/v1/prices?type=overview', { method: 'GET' });\n }\n\n // ========== Project Management ==========\n\n /**\n * Get user's projects\n */\n async getProjects(options?: {\n isActive?: boolean;\n }): Promise<ApiResponse<{ projects: AdminProject[]; total: number }>> {\n const params = new URLSearchParams();\n if (options?.isActive !== undefined) params.set('isActive', String(options.isActive));\n const query = params.toString();\n return this.request(`/api/v1/projects${query ? `?${query}` : ''}`, { method: 'GET' });\n }\n\n /**\n * Create a new project for ecosystem partners\n */\n async createProject(params: {\n name: string;\n slug: string;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request('/api/v1/projects', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Get project details\n */\n async getProject(projectId: string): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'GET' });\n }\n\n /**\n * Update project settings\n */\n async updateProject(projectId: string, updates: {\n name?: string;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n }): Promise<ApiResponse<{ project: AdminProject }>> {\n return this.request(`/api/v1/projects/${projectId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Get project features status\n */\n async getProjectFeatures(projectId: string): Promise<ApiResponse<{\n features: Record<string, {\n enabled: boolean;\n name: string;\n description: string;\n description_zh: string;\n }>;\n availableFeatures: string[];\n }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, { method: 'GET' });\n }\n\n /**\n * Enable/disable features for a project\n */\n async updateProjectFeatures(projectId: string, features: {\n wallet?: boolean;\n swap?: boolean;\n contracts?: boolean;\n fiat?: boolean;\n payments?: boolean;\n quant?: boolean;\n ai?: boolean;\n x402?: boolean;\n }): Promise<ApiResponse<{ project: AdminProject; message: string }>> {\n return this.request(`/api/v1/projects/${projectId}/features`, {\n method: 'PATCH',\n body: JSON.stringify(features),\n });\n }\n\n /**\n * Regenerate project API key\n */\n async regenerateProjectApiKey(projectId: string): Promise<ApiResponse<{ apiKey: string }>> {\n return this.request(`/api/v1/projects/${projectId}/api-key`, { method: 'POST' });\n }\n\n /**\n * Delete project\n */\n async deleteProject(projectId: string): Promise<ApiResponse<{ deleted: boolean }>> {\n return this.request(`/api/v1/projects/${projectId}`, { method: 'DELETE' });\n }\n}\n\n// Factory function\nexport function createOneEngineClient(options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n}): OneEngineClient {\n return new OneEngineClient(options);\n}\n","import { createClient, SupabaseClient } from '@supabase/supabase-js';\nimport { getConfig } from '../config';\n\nlet supabaseInstance: SupabaseClient | null = null;\n\nexport function createSupabaseClient(url?: string, anonKey?: string): SupabaseClient {\n const config = getConfig();\n const supabaseUrl = url || config.supabaseUrl;\n const supabaseAnonKey = anonKey || config.supabaseAnonKey;\n\n if (!supabaseUrl || !supabaseAnonKey) {\n throw new Error('Supabase URL and Anon Key are required');\n }\n\n return createClient(supabaseUrl, supabaseAnonKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n },\n });\n}\n\nexport function getSupabaseClient(): SupabaseClient {\n if (!supabaseInstance) {\n supabaseInstance = createSupabaseClient();\n }\n return supabaseInstance;\n}\n\nexport class SupabaseService {\n private client: SupabaseClient;\n\n constructor(client?: SupabaseClient) {\n this.client = client || getSupabaseClient();\n }\n\n // ===== Auth Methods =====\n async signInWithEmail(email: string) {\n const { data, error } = await this.client.auth.signInWithOtp({\n email,\n options: {\n shouldCreateUser: true,\n },\n });\n return { data, error };\n }\n\n async verifyOtp(email: string, token: string) {\n const { data, error } = await this.client.auth.verifyOtp({\n email,\n token,\n type: 'email',\n });\n return { data, error };\n }\n\n async signOut() {\n const { error } = await this.client.auth.signOut();\n return { error };\n }\n\n async getSession() {\n const { data, error } = await this.client.auth.getSession();\n return { session: data.session, error };\n }\n\n async getUser() {\n const { data, error } = await this.client.auth.getUser();\n return { user: data.user, error };\n }\n\n // ===== User Profile Methods =====\n async getUserProfile(userId: string) {\n const { data, error } = await this.client\n .from('user_profiles')\n .select('*')\n .eq('user_id', userId)\n .single();\n return { data, error };\n }\n\n async updateUserProfile(userId: string, updates: Record<string, any>) {\n const { data, error } = await this.client\n .from('user_profiles')\n .update(updates)\n .eq('user_id', userId)\n .select()\n .single();\n return { data, error };\n }\n\n // ===== Transaction Methods =====\n async getTransactions(userId: string, limit = 50) {\n const { data, error } = await this.client\n .from('transactions')\n .select('*')\n .eq('user_id', userId)\n .order('created_at', { ascending: false })\n .limit(limit);\n return { data, error };\n }\n\n async createTransaction(transaction: Record<string, any>) {\n const { data, error } = await this.client\n .from('transactions')\n .insert(transaction)\n .select()\n .single();\n return { data, error };\n }\n\n // ===== AI Trading Methods =====\n async getStrategies(status = 'active') {\n const { data, error } = await this.client\n .from('ai_strategies')\n .select('*')\n .eq('status', status)\n .order('total_aum', { ascending: false });\n return { data, error };\n }\n\n async getStrategyById(strategyId: string) {\n const { data, error } = await this.client\n .from('ai_strategies')\n .select('*')\n .eq('id', strategyId)\n .single();\n return { data, error };\n }\n\n async getUserOrders(userId: string) {\n const { data, error } = await this.client\n .from('ai_orders')\n .select(`*, ai_strategies (name)`)\n .eq('user_id', userId)\n .order('created_at', { ascending: false });\n return { data, error };\n }\n\n async createOrder(order: Record<string, any>) {\n const { data, error } = await this.client\n .from('ai_orders')\n .insert(order)\n .select()\n .single();\n return { data, error };\n }\n\n // ===== Card Methods =====\n async getUserCards(userId: string) {\n const { data, error } = await this.client\n .from('cards')\n .select('*')\n .eq('user_id', userId)\n .order('created_at', { ascending: false });\n return { data, error };\n }\n\n // ===== Realtime Subscriptions =====\n subscribeToTransactions(userId: string, callback: (payload: any) => void) {\n return this.client\n .channel(`transactions:${userId}`)\n .on(\n 'postgres_changes',\n {\n event: '*',\n schema: 'public',\n table: 'transactions',\n filter: `user_id=eq.${userId}`,\n },\n callback\n )\n .subscribe();\n }\n\n unsubscribe(channel: ReturnType<typeof this.client.channel>) {\n return this.client.removeChannel(channel);\n }\n}\n","import { COINGECKO_IDS } from '../config';\nimport type { TokenPrice } from '../types';\n\nconst COINGECKO_API = 'https://api.coingecko.com/api/v3';\n\n// Fallback prices when API is unavailable\nconst FALLBACK_PRICES: Record<string, number> = {\n ETH: 3500,\n BTC: 95000,\n BNB: 700,\n MATIC: 0.5,\n AVAX: 40,\n USDT: 1,\n USDC: 1,\n DAI: 1,\n WBTC: 95000,\n WETH: 3500,\n ARB: 1.2,\n OP: 2.5,\n LINK: 20,\n UNI: 12,\n AAVE: 250,\n SOL: 200,\n};\n\nexport class PriceService {\n private cache: Map<string, { price: TokenPrice; timestamp: number }> = new Map();\n private cacheTTL = 60 * 1000; // 1 minute cache\n\n async getPrice(symbol: string): Promise<TokenPrice> {\n const upperSymbol = symbol.toUpperCase();\n\n // Check cache first\n const cached = this.cache.get(upperSymbol);\n if (cached && Date.now() - cached.timestamp < this.cacheTTL) {\n return cached.price;\n }\n\n const coinId = COINGECKO_IDS[upperSymbol];\n if (!coinId) {\n return this.getFallbackPrice(upperSymbol);\n }\n\n try {\n const response = await fetch(\n `${COINGECKO_API}/simple/price?ids=${coinId}&vs_currencies=usd&include_24hr_change=true&include_market_cap=true&include_24hr_vol=true`,\n { headers: { Accept: 'application/json' } }\n );\n\n if (!response.ok) {\n throw new Error(`CoinGecko API error: ${response.status}`);\n }\n\n const data = await response.json();\n const coinData = data[coinId];\n\n if (!coinData) {\n return this.getFallbackPrice(upperSymbol);\n }\n\n const change24h = coinData.usd_24h_change || 0;\n const price: TokenPrice = {\n symbol: upperSymbol,\n price: coinData.usd || 0,\n change24h,\n changePercent24h: change24h,\n priceChange24h: change24h,\n marketCap: coinData.usd_market_cap,\n volume24h: coinData.usd_24h_vol,\n };\n\n this.cache.set(upperSymbol, { price, timestamp: Date.now() });\n return price;\n } catch (error) {\n console.warn(`Failed to fetch price for ${upperSymbol}:`, error);\n return this.getFallbackPrice(upperSymbol);\n }\n }\n\n async getPrices(symbols: string[]): Promise<Record<string, TokenPrice>> {\n const results: Record<string, TokenPrice> = {};\n\n // Group symbols by whether they have CoinGecko IDs\n const withIds: string[] = [];\n const withoutIds: string[] = [];\n\n for (const symbol of symbols) {\n const upper = symbol.toUpperCase();\n if (COINGECKO_IDS[upper]) {\n withIds.push(upper);\n } else {\n withoutIds.push(upper);\n }\n }\n\n // Handle symbols without CoinGecko IDs\n for (const symbol of withoutIds) {\n results[symbol] = this.getFallbackPrice(symbol);\n }\n\n if (withIds.length === 0) {\n return results;\n }\n\n // Fetch prices in batch for symbols with IDs\n const coinIds = withIds.map((s) => COINGECKO_IDS[s]).join(',');\n\n try {\n const response = await fetch(\n `${COINGECKO_API}/simple/price?ids=${coinIds}&vs_currencies=usd&include_24hr_change=true`,\n { headers: { Accept: 'application/json' } }\n );\n\n if (!response.ok) {\n throw new Error(`CoinGecko API error: ${response.status}`);\n }\n\n const data = await response.json();\n\n for (const symbol of withIds) {\n const coinId = COINGECKO_IDS[symbol];\n const coinData = data[coinId];\n\n if (coinData) {\n const change24h = coinData.usd_24h_change || 0;\n results[symbol] = {\n symbol,\n price: coinData.usd || 0,\n change24h,\n changePercent24h: change24h,\n priceChange24h: change24h,\n };\n } else {\n results[symbol] = this.getFallbackPrice(symbol);\n }\n }\n } catch (error) {\n console.warn('Failed to fetch batch prices:', error);\n for (const symbol of withIds) {\n results[symbol] = this.getFallbackPrice(symbol);\n }\n }\n\n return results;\n }\n\n private getFallbackPrice(symbol: string): TokenPrice {\n const price = FALLBACK_PRICES[symbol] || 0;\n return {\n symbol,\n price,\n change24h: 0,\n changePercent24h: 0,\n priceChange24h: 0,\n };\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n}\n\n// Singleton instance\nexport const priceService = new PriceService();\n","/**\n * Usage Tracking Service\n * Tracks AI usage for Personal Assistant and Trading Agent\n */\n\nimport { getConfig } from '../config';\n\n// Usage categories (internal)\nexport type UsageCategory =\n | 'wallet'\n | 'payment'\n | 'exchange_onramper'\n | 'exchange_swap'\n | 'ai_thirdweb'\n | 'ai_trading_engine';\n\n// Display categories (client-facing)\nexport type DisplayCategory = 'personal_assistant' | 'trading_agent';\n\nexport interface UsageRecord {\n userId: string;\n category: UsageCategory;\n action: string;\n requestTokens?: number;\n responseTokens?: number;\n creditsUsed?: number;\n metadata?: Record<string, any>;\n}\n\nexport interface UsageSummary {\n personal_assistant: {\n requestCount: number;\n totalTokens: number;\n totalCredits: number;\n };\n trading_agent: {\n requestCount: number;\n totalTokens: number;\n totalCredits: number;\n };\n}\n\nexport interface UsageActivity {\n type: DisplayCategory;\n action: string;\n tokens: number;\n credits: number;\n timestamp: string;\n}\n\nexport interface UsageResponse {\n summary: UsageSummary;\n dailyBreakdown: Array<{\n date: string;\n personal_assistant: number;\n trading_agent: number;\n }>;\n recentActivity: UsageActivity[];\n period: {\n days: number;\n startDate: string;\n endDate: string;\n };\n}\n\n/**\n * Usage Tracking Service\n */\nexport class UsageService {\n private baseUrl: string;\n private userId: string | null = null;\n\n constructor(baseUrl?: string) {\n this.baseUrl = baseUrl || getConfig().oneEngineUrl || '';\n }\n\n /**\n * Set the current user ID for tracking\n */\n setUserId(userId: string): void {\n this.userId = userId;\n }\n\n /**\n * Record Personal Assistant usage (Thirdweb AI)\n */\n async trackPersonalAssistant(\n action: string,\n tokens?: { request?: number; response?: number },\n credits?: number,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'ai_thirdweb',\n action,\n requestTokens: tokens?.request,\n responseTokens: tokens?.response,\n creditsUsed: credits,\n metadata,\n });\n }\n\n /**\n * Record Trading Agent usage (Engine AI)\n */\n async trackTradingAgent(\n action: string,\n credits?: number,\n metadata?: Record<string, any>\n ): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'ai_trading_engine',\n action,\n creditsUsed: credits,\n metadata,\n });\n }\n\n /**\n * Record wallet operation usage\n */\n async trackWallet(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'wallet',\n action,\n metadata,\n });\n }\n\n /**\n * Record payment usage\n */\n async trackPayment(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'payment',\n action,\n metadata,\n });\n }\n\n /**\n * Record exchange usage (onramper)\n */\n async trackOnramper(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'exchange_onramper',\n action,\n metadata,\n });\n }\n\n /**\n * Record exchange usage (swap)\n */\n async trackSwap(action: string, metadata?: Record<string, any>): Promise<boolean> {\n return this.recordUsage({\n userId: this.userId!,\n category: 'exchange_swap',\n action,\n metadata,\n });\n }\n\n /**\n * Record any usage\n */\n async recordUsage(record: UsageRecord): Promise<boolean> {\n if (!record.userId) {\n console.warn('[UsageService] No userId set, skipping usage tracking');\n return false;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/api/v1/usage/user`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n userId: record.userId,\n category: record.category,\n action: record.action,\n requestTokens: record.requestTokens || 0,\n responseTokens: record.responseTokens || 0,\n creditsUsed: record.creditsUsed || 0,\n metadata: record.metadata || {},\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n console.error('[UsageService] Failed to record usage:', error);\n return false;\n }\n\n return true;\n } catch (error) {\n console.error('[UsageService] Error recording usage:', error);\n return false;\n }\n }\n\n /**\n * Get AI usage summary for current user\n */\n async getAIUsage(days: number = 30): Promise<UsageResponse | null> {\n if (!this.userId) {\n console.warn('[UsageService] No userId set');\n return null;\n }\n\n try {\n const response = await fetch(\n `${this.baseUrl}/api/v1/usage/user?userId=${this.userId}&days=${days}`\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n console.error('[UsageService] Failed to get usage:', error);\n return null;\n }\n\n const result = await response.json();\n return result.data;\n } catch (error) {\n console.error('[UsageService] Error getting usage:', error);\n return null;\n }\n }\n}\n\n// Singleton instance\nlet usageServiceInstance: UsageService | null = null;\n\nexport function getUsageService(): UsageService {\n if (!usageServiceInstance) {\n usageServiceInstance = new UsageService();\n }\n return usageServiceInstance;\n}\n\nexport function createUsageService(baseUrl?: string): UsageService {\n return new UsageService(baseUrl);\n}\n","// ForexSimulationEngine.ts - StableFX RFQ+PvP on-chain forex simulation engine\n// Simulates Circle StableFX-style foreign exchange operations using USDC stablecoin pairs\n\nimport type {\n ForexLogEntry,\n ForexLogType,\n ForexCurrencyPair,\n ForexTradeRecord,\n ForexPosition,\n ForexPoolTransaction,\n} from '../../types/forex';\nimport { FOREX_CURRENCY_PAIRS } from '../../types/forex';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ntype LogCallback = (entry: ForexLogEntry) => void;\ntype PoolTxCallback = (tx: ForexPoolTransaction) => void;\n\ninterface PairState {\n pair: ForexCurrencyPair;\n currentPrice: number;\n bidPrice: number;\n askPrice: number;\n lastSpread: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `fxlog_${Date.now()}_${++idCounter}`;\n}\n\nfunction tradeId(): string {\n return `FXT_${Date.now().toString(36).toUpperCase()}_${(++idCounter).toString(36).toUpperCase()}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction formatRate(price: number, pair: ForexCurrencyPair): string {\n if (pair.pipSize >= 0.01) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── News Headlines ───────────────────────────────────────────────────────────\n\nconst FX_NEWS = [\n 'ECB signals potential rate adjustment, EUR pairs volatile',\n 'BOJ maintains yield curve control, JPY weakens further',\n 'Fed minutes reveal hawkish sentiment, USD strengthens',\n 'UK CPI data beats expectations, GBP rallies',\n 'RBA holds rates steady, AUD consolidates',\n 'SNB intervenes in currency markets, CHF stabilizes',\n 'Bank of Canada rate decision pending, CAD in focus',\n 'Cross-border stablecoin settlement volume hits $2.1B daily',\n 'Circle USDC reserves fully backed, attestation report released',\n 'DeFi forex protocol TVL reaches new high at $890M',\n 'On-chain FX liquidity deepens across major pairs',\n 'Institutional adoption of on-chain forex accelerates',\n];\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass ForexSimulationEngine {\n private listeners: LogCallback[] = [];\n private poolTxListeners: PoolTxCallback[] = [];\n private cycleTimer: ReturnType<typeof setTimeout> | null = null;\n private pairStates: Map<string, PairState> = new Map();\n private running = false;\n private openPositions: ForexPosition[] = [];\n private totalPnl = 0;\n private totalTrades = 0;\n private totalPips = 0;\n private totalLots = 0;\n\n constructor() {\n for (const pair of FOREX_CURRENCY_PAIRS) {\n const jitter = pair.basePrice * rand(-0.003, 0.003);\n const price = pair.basePrice + jitter;\n const halfSpread = pair.spreadPips * pair.pipSize / 2;\n this.pairStates.set(pair.id, {\n pair,\n currentPrice: price,\n bidPrice: price - halfSpread,\n askPrice: price + halfSpread,\n lastSpread: pair.spreadPips,\n });\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n start(): void {\n this.running = true;\n this.scheduleCycle();\n }\n\n stop(): void {\n this.running = false;\n if (this.cycleTimer) {\n clearTimeout(this.cycleTimer);\n this.cycleTimer = null;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n onPoolTransaction(callback: PoolTxCallback): () => void {\n this.poolTxListeners.push(callback);\n return () => {\n this.poolTxListeners = this.poolTxListeners.filter(l => l !== callback);\n };\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getStats(): { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number; positions: number } {\n return {\n totalPnl: this.totalPnl,\n totalTrades: this.totalTrades,\n totalPips: this.totalPips,\n totalLots: this.totalLots,\n positions: this.openPositions.length,\n };\n }\n\n getPairStates(): Map<string, PairState> {\n return this.pairStates;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing StableFX Engine v2.1.0...', delay: 0 },\n { msg: 'Connecting to Circle StableFX RFQ network...', delay: 500 },\n { msg: 'Loading USDC stablecoin pair feeds (6 pairs)...', delay: 1200 },\n { msg: 'Calibrating PvP settlement engine...', delay: 2000 },\n { msg: 'Initializing clearing pool ($12.5M)...', delay: 2800 },\n { msg: 'Initializing hedging pool ($7.5M)...', delay: 3400 },\n { msg: 'Initializing insurance pool ($5.0M)...', delay: 4000 },\n { msg: 'Risk management module online (max exposure: 25%)', delay: 4500 },\n { msg: '=== StableFX Engine ready. Starting RFQ cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.poolTxListeners = [];\n this.pairStates.clear();\n this.openPositions = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: ForexLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private emitPoolTx(tx: ForexPoolTransaction): void {\n for (const listener of this.poolTxListeners) {\n listener(tx);\n }\n }\n\n private generatePoolTxFromEvent(\n type: 'SETTLE' | 'HEDGE' | 'CLEAR',\n data: { pnl?: number; volume?: number; lots?: number },\n ): void {\n try {\n const { ForexPoolDataGenerator } = require('./ForexPoolDataGenerator');\n const generator = ForexPoolDataGenerator.getInstance();\n\n if (type === 'SETTLE' && data.pnl !== undefined) {\n const tx = generator.generateLiveTransaction('clearing', 'fee_collection', Math.abs(data.pnl) * rand(0.001, 0.003));\n this.emitPoolTx(tx);\n } else if (type === 'HEDGE') {\n const tx = generator.generateLiveTransaction('hedging', data.pnl && data.pnl < 0 ? 'loss_absorption' : 'profit_distribution', Math.abs(data.lots || 1) * rand(50, 200));\n this.emitPoolTx(tx);\n } else if (type === 'CLEAR') {\n const tx = generator.generateLiveTransaction('clearing', 'profit_distribution', (data.volume || 100000) * rand(0.0001, 0.0005));\n this.emitPoolTx(tx);\n }\n } catch {\n // Generator not available\n }\n }\n\n private scheduleCycle(): void {\n if (!this.running) return;\n const interval = rand(8000, 14000);\n this.cycleTimer = setTimeout(() => {\n if (this.running) {\n this.runTradeCycle();\n this.scheduleCycle();\n }\n }, interval);\n }\n\n private simulatePrice(pairId: string): number {\n const state = this.pairStates.get(pairId);\n if (!state) return 0;\n const volatility = state.pair.id.includes('JPYC') ? 0.0008 : 0.0004;\n const drift = rand(-volatility, volatility);\n const newPrice = state.currentPrice * (1 + drift);\n const halfSpread = (state.pair.spreadPips + rand(-0.3, 0.3)) * state.pair.pipSize / 2;\n state.currentPrice = newPrice;\n state.bidPrice = newPrice - halfSpread;\n state.askPrice = newPrice + halfSpread;\n state.lastSpread = halfSpread * 2 / state.pair.pipSize;\n return newPrice;\n }\n\n private runTradeCycle(): void {\n const pairState = pick(Array.from(this.pairStates.values()));\n const pair = pairState.pair;\n const entries: Array<{ entry: Omit<ForexLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // Update price\n const price = this.simulatePrice(pair.id);\n\n // 1. RFQ - Request for Quote\n const side = Math.random() > 0.5 ? 'BUY' : 'SELL';\n const lots = parseFloat((rand(0.1, 2.5)).toFixed(2));\n const notional = lots * 100000;\n const rfqId = tradeId();\n\n entries.push({\n entry: {\n type: 'RFQ',\n message: `RFQ ${rfqId} | ${pair.symbol} ${side} ${lots.toFixed(2)} lots ($${(notional / 1000).toFixed(0)}K) | Mid: ${formatRate(price, pair)}`,\n data: { rfqId, pair: pair.id, side, lots, price },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(400, 800);\n\n // 2. QUOTE - Price quote from LP\n const quoteSpread = rand(0.5, 2.0) * pair.pipSize;\n const quotePrice = side === 'BUY'\n ? price + quoteSpread\n : price - quoteSpread;\n const quotePips = Math.abs(quotePrice - price) / pair.pipSize;\n\n entries.push({\n entry: {\n type: 'QUOTE',\n message: `QUOTE ${rfqId} | ${pair.symbol} @ ${formatRate(quotePrice, pair)} | Spread: ${quotePips.toFixed(1)} pips | Valid: 3s`,\n data: { rfqId, quotePrice, spread: quotePips },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(500, 1000);\n\n // 3. MATCH - Trade matching (85% success rate)\n const matched = Math.random() < 0.85;\n if (matched) {\n const matchPrice = quotePrice * (1 + rand(-0.00005, 0.00005));\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH ${rfqId} | ${pair.symbol} ${side} @ ${formatRate(matchPrice, pair)} | ${lots.toFixed(2)} lots | Counterparty: LP-${randInt(1, 8)}`,\n data: { rfqId, matchPrice, counterparty: `LP-${randInt(1, 8)}` },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(1000, 2500);\n\n // 4. SETTLE - PvP Settlement\n const settlePrice = matchPrice * (1 + rand(-0.00002, 0.00002));\n const pips = ((settlePrice - price) / pair.pipSize) * (side === 'BUY' ? 1 : -1);\n const pnl = pips * pair.pipSize * lots * 100000;\n\n entries.push({\n entry: {\n type: 'SETTLE',\n message: `SETTLE ${rfqId} | PvP confirmed | ${pair.symbol} @ ${formatRate(settlePrice, pair)} | P&L: ${pips >= 0 ? '+' : ''}${pips.toFixed(1)} pips ($${pnl >= 0 ? '+' : ''}${pnl.toFixed(2)})`,\n data: { rfqId, settlePrice, pips, pnl, pvp: true },\n importance: 'high',\n pairId: pair.id,\n },\n delay,\n });\n delay += rand(300, 600);\n\n // 5. PVP - Settlement confirmation\n entries.push({\n entry: {\n type: 'PVP',\n message: `PvP ${rfqId} | Atomic settlement confirmed on-chain | USDC transferred: $${notional.toLocaleString()} | Gas: ~$0.${randInt(10, 50)}`,\n data: { rfqId, settled: true, gasWei: randInt(10, 50) },\n importance: 'medium',\n pairId: pair.id,\n },\n delay,\n });\n\n // Generate pool transaction for settlement\n this.generatePoolTxFromEvent('SETTLE', { pnl });\n\n // Update stats\n this.totalTrades++;\n this.totalPnl += pnl;\n this.totalPips += pips;\n this.totalLots += lots;\n\n // Update positions\n if (Math.random() < 0.4) {\n this.openPositions.push({\n id: rfqId,\n pairId: pair.id,\n side: side as 'BUY' | 'SELL',\n lots,\n pips,\n entryPrice: matchPrice,\n currentPrice: settlePrice,\n pnl,\n openTime: Date.now(),\n });\n if (this.openPositions.length > 5) {\n this.openPositions.shift();\n }\n }\n } else {\n entries.push({\n entry: {\n type: 'MATCH',\n message: `MATCH FAILED ${rfqId} | ${pair.symbol} | No counterparty at requested price | Requoting...`,\n data: { rfqId, matched: false },\n importance: 'low',\n pairId: pair.id,\n },\n delay,\n });\n }\n\n // 6. HEDGE - Pool hedging operations (20% chance)\n if (Math.random() < 0.2) {\n delay += rand(400, 800);\n const hedgePair = pick(FOREX_CURRENCY_PAIRS);\n const hedgeLots = parseFloat(rand(0.5, 5.0).toFixed(2));\n const hedgeDirection = Math.random() > 0.5 ? 'LONG' : 'SHORT';\n entries.push({\n entry: {\n type: 'HEDGE',\n message: `HEDGE | ${hedgePair.symbol} ${hedgeDirection} ${hedgeLots.toFixed(2)} lots | Pool delta neutralization | Exposure: ${rand(5, 20).toFixed(1)}%`,\n data: { pair: hedgePair.id, direction: hedgeDirection, lots: hedgeLots },\n importance: 'medium',\n },\n delay,\n });\n this.generatePoolTxFromEvent('HEDGE', { lots: hedgeLots });\n }\n\n // 7. CLEAR - Clearing pool operations (15% chance)\n if (Math.random() < 0.15) {\n delay += rand(300, 600);\n const clearAmount = randInt(50000, 500000);\n entries.push({\n entry: {\n type: 'CLEAR',\n message: `CLEAR | Netting cycle complete | Volume: $${(clearAmount / 1000).toFixed(0)}K | Pairs settled: ${randInt(2, 6)} | Pool util: ${rand(60, 85).toFixed(1)}%`,\n data: { volume: clearAmount, pairsSettled: randInt(2, 6) },\n importance: 'low',\n },\n delay,\n });\n this.generatePoolTxFromEvent('CLEAR', { volume: clearAmount });\n }\n\n // 8. POSITION - Position update (25% chance)\n if (this.openPositions.length > 0 && Math.random() < 0.25) {\n delay += rand(300, 600);\n const posUpdates = this.openPositions.slice(0, 3).map(pos => {\n const pState = this.pairStates.get(pos.pairId);\n if (pState) {\n pos.currentPrice = pState.currentPrice;\n pos.pips = ((pos.currentPrice - pos.entryPrice) / pState.pair.pipSize) * (pos.side === 'BUY' ? 1 : -1);\n pos.pnl = pos.pips * pState.pair.pipSize * pos.lots * 100000;\n }\n return `${pState?.pair.symbol || pos.pairId} ${pos.side}: ${pos.pips >= 0 ? '+' : ''}${pos.pips.toFixed(1)} pips`;\n });\n entries.push({\n entry: {\n type: 'POSITION',\n message: `POSITION | ${posUpdates.join(' | ')} | Open: ${this.openPositions.length}`,\n data: { positions: this.openPositions.length },\n importance: 'low',\n },\n delay,\n });\n\n // Close old positions\n if (this.openPositions.length > 2 && Math.random() < 0.3) {\n const closed = this.openPositions.shift()!;\n this.totalPnl += closed.pnl * rand(0.01, 0.03);\n }\n }\n\n // 9. PNL - Periodic P&L summary (30% chance)\n if (Math.random() < 0.3) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'PNL',\n message: `PNL | Session: $${this.totalPnl >= 0 ? '+' : ''}${this.totalPnl.toFixed(2)} | Trades: ${this.totalTrades} | Pips: ${this.totalPips >= 0 ? '+' : ''}${this.totalPips.toFixed(1)} | Lots: ${this.totalLots.toFixed(2)}`,\n data: { totalPnl: this.totalPnl, totalTrades: this.totalTrades, totalPips: this.totalPips },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 10. NEWS (10% chance)\n if (Math.random() < 0.1) {\n delay += rand(300, 600);\n entries.push({\n entry: {\n type: 'SYSTEM',\n message: `[Market] ${pick(FX_NEWS)}`,\n importance: 'medium',\n },\n delay,\n });\n }\n\n // Emit all entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n}\n\n// ── Singleton Export ──────────────────────────────────────────────────────────\n\nexport const forexSimulationEngine = new ForexSimulationEngine();\nexport type { PairState };\n","/**\n * ONE SDK - Forex Trading Services\n * Simulation engines and data generators for StableFX on-chain forex\n */\n\n// Forex RFQ+PvP Simulation Engine\nexport { forexSimulationEngine } from './ForexSimulationEngine';\nexport type { PairState } from './ForexSimulationEngine';\n\n// Pool Data Generator (historical snapshots & transactions)\nexport { ForexPoolDataGenerator } from './ForexPoolDataGenerator';\n\n// Bot Simulation Engine (AI crypto trading strategies)\nexport {\n botSimulationEngine,\n STRATEGY_PERSONALITIES,\n INVESTMENT_TIERS,\n INVESTMENT_CYCLES,\n calculateDailyYield,\n estimateReturns,\n} from './BotSimulationEngine';\nexport type {\n BotLogType,\n BotLogEntry,\n IndicatorSnapshot,\n BotState,\n StrategyPersonality,\n StrategyCategory,\n InvestmentTier,\n TierConfig,\n CycleConfig,\n} from './BotSimulationEngine';\n","// BotSimulationEngine.ts - Core simulation engine for trading bot console\n// Runs independent simulation loops for each strategy bot with distinct personalities\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport type BotLogType =\n | 'SCAN'\n | 'INDICATOR'\n | 'NEWS'\n | 'SIGNAL'\n | 'ANALYSIS'\n | 'DECISION'\n | 'ORDER'\n | 'FILLED'\n | 'PNL'\n | 'RISK'\n | 'SYSTEM'\n | 'STRATEGY' // Strategy reasoning and context\n | 'THINKING'; // AI thinking process\n\nexport interface BotLogEntry {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n type: BotLogType;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface IndicatorSnapshot {\n rsi: number;\n macd: { value: number; signal: number; histogram: number };\n ema: { short: number; long: number; crossover: 'golden' | 'death' | 'none' };\n bollinger: { upper: number; middle: number; lower: number; width: number; position: number };\n volume: { current: number; average: number; ratio: number };\n}\n\nexport interface BotState {\n strategyId: string;\n strategyName: string;\n isRunning: boolean;\n currentPair: string;\n currentPrice: number;\n indicators: IndicatorSnapshot;\n openPositions: OpenPosition[];\n totalPnl: number;\n totalTrades: number;\n winRate: number;\n lastSignal: string;\n lastSignalConfidence: number;\n}\n\ninterface OpenPosition {\n id: string;\n pair: string;\n side: 'LONG' | 'SHORT';\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n pnl: number;\n pnlPercent: number;\n}\n\nexport interface StrategyPersonality {\n id: string;\n name: string;\n shortName: string;\n color: string;\n scanIntervalMin: number;\n scanIntervalMax: number;\n tradeFrequency: number;\n positionSizeMin: number;\n positionSizeMax: number;\n leverageMin: number;\n leverageMax: number;\n primaryIndicators: string[];\n riskTolerance: 'low' | 'medium' | 'high';\n preferredPairs: string[];\n rsiBias: number;\n // Yield configuration\n tier: InvestmentTier;\n dailyYieldMin: number; // Min daily interest rate (%)\n dailyYieldMax: number; // Max daily interest rate (%)\n description: string;\n category: StrategyCategory;\n}\n\nexport type StrategyCategory =\n | 'conservative' // 保守型 - 稳健收益\n | 'balanced' // 平衡型 - 风险收益均衡\n | 'growth' // 成长型 - 较高收益\n | 'aggressive' // 激进型 - 高风险高收益\n | 'quantitative'; // 量化型 - AI驱动\n\nexport type InvestmentTier = 'starter' | 'basic' | 'standard' | 'premium' | 'elite' | 'vip';\n\n// ── Investment Tier Configuration ─────────────────────────────────────────────\n\nexport interface TierConfig {\n id: InvestmentTier;\n name: string;\n nameCn: string;\n minInvestment: number;\n maxInvestment: number;\n color: string;\n icon: string;\n}\n\nexport const INVESTMENT_TIERS: Record<InvestmentTier, TierConfig> = {\n starter: {\n id: 'starter',\n name: 'Starter',\n nameCn: '入门版',\n minInvestment: 100,\n maxInvestment: 999,\n color: '#6B7280',\n icon: '🌱',\n },\n basic: {\n id: 'basic',\n name: 'Basic',\n nameCn: '基础版',\n minInvestment: 1000,\n maxInvestment: 4999,\n color: '#3B82F6',\n icon: '📊',\n },\n standard: {\n id: 'standard',\n name: 'Standard',\n nameCn: '标准版',\n minInvestment: 5000,\n maxInvestment: 19999,\n color: '#10B981',\n icon: '💎',\n },\n premium: {\n id: 'premium',\n name: 'Premium',\n nameCn: '高级版',\n minInvestment: 20000,\n maxInvestment: 49999,\n color: '#8B5CF6',\n icon: '👑',\n },\n elite: {\n id: 'elite',\n name: 'Elite',\n nameCn: '精英版',\n minInvestment: 50000,\n maxInvestment: 99999,\n color: '#F59E0B',\n icon: '🏆',\n },\n vip: {\n id: 'vip',\n name: 'VIP',\n nameCn: 'VIP专属',\n minInvestment: 100000,\n maxInvestment: Infinity,\n color: '#EF4444',\n icon: '🔥',\n },\n};\n\n// ── Investment Cycle Configuration ────────────────────────────────────────────\n\nexport interface CycleConfig {\n id: string;\n days: number;\n name: string;\n nameCn: string;\n profitSharePercent: number; // Platform takes this %, user gets (100 - this)%\n bonusMultiplier: number; // Bonus yield multiplier for longer cycles\n earlyWithdrawPenalty: number; // Penalty % for early withdrawal\n}\n\nexport const INVESTMENT_CYCLES: CycleConfig[] = [\n {\n id: 'flexible',\n days: 0,\n name: 'Flexible',\n nameCn: '灵活期',\n profitSharePercent: 30, // Platform 30%, User 70%\n bonusMultiplier: 1.0,\n earlyWithdrawPenalty: 0,\n },\n {\n id: 'week',\n days: 7,\n name: '7 Days',\n nameCn: '7天期',\n profitSharePercent: 25, // Platform 25%, User 75%\n bonusMultiplier: 1.1,\n earlyWithdrawPenalty: 5,\n },\n {\n id: 'biweek',\n days: 14,\n name: '14 Days',\n nameCn: '14天期',\n profitSharePercent: 22, // Platform 22%, User 78%\n bonusMultiplier: 1.2,\n earlyWithdrawPenalty: 8,\n },\n {\n id: 'month',\n days: 30,\n name: '30 Days',\n nameCn: '30天期',\n profitSharePercent: 20, // Platform 20%, User 80%\n bonusMultiplier: 1.35,\n earlyWithdrawPenalty: 10,\n },\n {\n id: 'quarter',\n days: 90,\n name: '90 Days',\n nameCn: '90天期',\n profitSharePercent: 15, // Platform 15%, User 85%\n bonusMultiplier: 1.5,\n earlyWithdrawPenalty: 15,\n },\n {\n id: 'halfyear',\n days: 180,\n name: '180 Days',\n nameCn: '180天期',\n profitSharePercent: 12, // Platform 12%, User 88%\n bonusMultiplier: 1.8,\n earlyWithdrawPenalty: 20,\n },\n {\n id: 'year',\n days: 365,\n name: '365 Days',\n nameCn: '365天期',\n profitSharePercent: 10, // Platform 10%, User 90%\n bonusMultiplier: 2.0,\n earlyWithdrawPenalty: 25,\n },\n];\n\n// ── Yield Calculator ──────────────────────────────────────────────────────────\n\nexport function calculateDailyYield(\n strategy: StrategyPersonality,\n tier: InvestmentTier,\n cycle: CycleConfig\n): { grossYield: number; netYield: number; platformFee: number } {\n // Base yield from strategy\n const baseYield = (strategy.dailyYieldMin + strategy.dailyYieldMax) / 2;\n\n // Tier bonus (higher tiers get slightly better rates)\n const tierBonuses: Record<InvestmentTier, number> = {\n starter: 0,\n basic: 0.02,\n standard: 0.05,\n premium: 0.08,\n elite: 0.12,\n vip: 0.15,\n };\n\n // Calculate gross yield with bonuses\n const grossYield = baseYield * cycle.bonusMultiplier * (1 + tierBonuses[tier]);\n\n // Calculate platform fee and net yield\n const platformFee = grossYield * (cycle.profitSharePercent / 100);\n const netYield = grossYield - platformFee;\n\n return { grossYield, netYield, platformFee };\n}\n\nexport function estimateReturns(\n principal: number,\n strategy: StrategyPersonality,\n tier: InvestmentTier,\n cycle: CycleConfig\n): {\n dailyReturn: number;\n totalReturn: number;\n finalAmount: number;\n platformProfit: number;\n userProfit: number;\n apr: number;\n} {\n const { netYield, platformFee } = calculateDailyYield(strategy, tier, cycle);\n const days = cycle.days || 30; // Default to 30 days for flexible\n\n const dailyReturn = principal * (netYield / 100);\n const totalReturn = dailyReturn * days;\n const finalAmount = principal + totalReturn;\n const platformProfit = principal * (platformFee / 100) * days;\n const userProfit = totalReturn;\n const apr = netYield * 365;\n\n return { dailyReturn, totalReturn, finalAmount, platformProfit, userProfit, apr };\n}\n\ntype LogCallback = (entry: BotLogEntry) => void;\n\n// ── Strategy Personalities ─────────────────────────────────────────────────────\n\nexport const STRATEGY_PERSONALITIES: StrategyPersonality[] = [\n // ═══════════════════════════════════════════════════════════════════════════\n // CONSERVATIVE STRATEGIES (保守型) - Low risk, stable returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'stable-yield-01',\n name: 'Stable Yield',\n shortName: 'STB',\n color: '#6B7280',\n scanIntervalMin: 80000,\n scanIntervalMax: 120000,\n tradeFrequency: 0.15,\n positionSizeMin: 5,\n positionSizeMax: 15,\n leverageMin: 1,\n leverageMax: 3,\n primaryIndicators: ['Bollinger', 'Volume'],\n riskTolerance: 'low',\n preferredPairs: ['BTC/USDT', 'ETH/USDT'],\n rsiBias: 45,\n tier: 'starter',\n dailyYieldMin: 0.15,\n dailyYieldMax: 0.25,\n description: '稳健收益策略,低风险低波动,适合新手入门',\n category: 'conservative',\n },\n {\n id: 'conservative-shield-01',\n name: 'Conservative Shield',\n shortName: 'CON',\n color: '#10B981',\n scanIntervalMin: 60000,\n scanIntervalMax: 90000,\n tradeFrequency: 0.25,\n positionSizeMin: 10,\n positionSizeMax: 20,\n leverageMin: 2,\n leverageMax: 5,\n primaryIndicators: ['Bollinger', 'Volume', 'RSI'],\n riskTolerance: 'low',\n preferredPairs: ['BTC/USDT', 'ETH/USDT'],\n rsiBias: 45,\n tier: 'basic',\n dailyYieldMin: 0.25,\n dailyYieldMax: 0.40,\n description: '保守防御策略,注重资金安全,稳定收益',\n category: 'conservative',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // BALANCED STRATEGIES (平衡型) - Moderate risk, balanced returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'balanced-alpha-01',\n name: 'Balanced Alpha',\n shortName: 'BAL',\n color: '#3B82F6',\n scanIntervalMin: 45000,\n scanIntervalMax: 70000,\n tradeFrequency: 0.4,\n positionSizeMin: 15,\n positionSizeMax: 35,\n leverageMin: 3,\n leverageMax: 10,\n primaryIndicators: ['RSI', 'MACD'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT'],\n rsiBias: 50,\n tier: 'standard',\n dailyYieldMin: 0.40,\n dailyYieldMax: 0.65,\n description: '平衡型策略,风险收益均衡,适合稳健投资者',\n category: 'balanced',\n },\n {\n id: 'smart-rebalance-01',\n name: 'Smart Rebalance',\n shortName: 'SRB',\n color: '#06B6D4',\n scanIntervalMin: 50000,\n scanIntervalMax: 75000,\n tradeFrequency: 0.35,\n positionSizeMin: 12,\n positionSizeMax: 30,\n leverageMin: 3,\n leverageMax: 8,\n primaryIndicators: ['RSI', 'EMA', 'Volume'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'BNB/USDT', 'SOL/USDT'],\n rsiBias: 50,\n tier: 'standard',\n dailyYieldMin: 0.45,\n dailyYieldMax: 0.70,\n description: '智能再平衡策略,动态调整持仓,优化收益',\n category: 'balanced',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // GROWTH STRATEGIES (成长型) - Higher risk, higher returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'growth-momentum-01',\n name: 'Growth Momentum',\n shortName: 'GRO',\n color: '#8B5CF6',\n scanIntervalMin: 40000,\n scanIntervalMax: 60000,\n tradeFrequency: 0.45,\n positionSizeMin: 20,\n positionSizeMax: 40,\n leverageMin: 5,\n leverageMax: 12,\n primaryIndicators: ['RSI', 'MACD', 'EMA'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'AVAX/USDT'],\n rsiBias: 52,\n tier: 'premium',\n dailyYieldMin: 0.60,\n dailyYieldMax: 0.95,\n description: '成长动量策略,追求较高收益,适合有经验投资者',\n category: 'growth',\n },\n {\n id: 'trend-hunter-01',\n name: 'Trend Hunter',\n shortName: 'TRH',\n color: '#EC4899',\n scanIntervalMin: 38000,\n scanIntervalMax: 55000,\n tradeFrequency: 0.48,\n positionSizeMin: 22,\n positionSizeMax: 42,\n leverageMin: 5,\n leverageMax: 15,\n primaryIndicators: ['EMA', 'MACD', 'Volume', 'Bollinger'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'ARB/USDT', 'OP/USDT'],\n rsiBias: 53,\n tier: 'premium',\n dailyYieldMin: 0.65,\n dailyYieldMax: 1.00,\n description: '趋势猎手策略,捕捉市场趋势,追求超额收益',\n category: 'growth',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // AGGRESSIVE STRATEGIES (激进型) - High risk, high returns\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'aggressive-momentum-01',\n name: 'Aggressive Momentum',\n shortName: 'AGG',\n color: '#EF4444',\n scanIntervalMin: 35000,\n scanIntervalMax: 55000,\n tradeFrequency: 0.5,\n positionSizeMin: 25,\n positionSizeMax: 50,\n leverageMin: 5,\n leverageMax: 20,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'DOGE/USDT', 'AVAX/USDT'],\n rsiBias: 55,\n tier: 'elite',\n dailyYieldMin: 0.85,\n dailyYieldMax: 1.40,\n description: '激进动量策略,高风险高收益,适合风险承受能力强的投资者',\n category: 'aggressive',\n },\n {\n id: 'leverage-maximizer-01',\n name: 'Leverage Maximizer',\n shortName: 'LEV',\n color: '#F97316',\n scanIntervalMin: 30000,\n scanIntervalMax: 50000,\n tradeFrequency: 0.55,\n positionSizeMin: 30,\n positionSizeMax: 55,\n leverageMin: 10,\n leverageMax: 25,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'DOGE/USDT', 'AVAX/USDT', 'ARB/USDT'],\n rsiBias: 55,\n tier: 'elite',\n dailyYieldMin: 1.00,\n dailyYieldMax: 1.80,\n description: '杠杆最大化策略,追求极致收益,需要专业投资经验',\n category: 'aggressive',\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // QUANTITATIVE STRATEGIES (量化型) - AI-driven, advanced algorithms\n // ═══════════════════════════════════════════════════════════════════════════\n {\n id: 'ai-quant-alpha-01',\n name: 'AI Quant Alpha',\n shortName: 'AQA',\n color: '#A855F7',\n scanIntervalMin: 42000,\n scanIntervalMax: 65000,\n tradeFrequency: 0.42,\n positionSizeMin: 18,\n positionSizeMax: 38,\n leverageMin: 4,\n leverageMax: 12,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'BNB/USDT'],\n rsiBias: 51,\n tier: 'premium',\n dailyYieldMin: 0.70,\n dailyYieldMax: 1.10,\n description: 'AI量化Alpha策略,机器学习驱动,智能风控',\n category: 'quantitative',\n },\n {\n id: 'neural-trader-01',\n name: 'Neural Trader',\n shortName: 'NRT',\n color: '#14B8A6',\n scanIntervalMin: 40000,\n scanIntervalMax: 62000,\n tradeFrequency: 0.44,\n positionSizeMin: 20,\n positionSizeMax: 40,\n leverageMin: 5,\n leverageMax: 15,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'medium',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'AVAX/USDT', 'LINK/USDT'],\n rsiBias: 52,\n tier: 'elite',\n dailyYieldMin: 0.80,\n dailyYieldMax: 1.25,\n description: '神经网络交易策略,深度学习模型,自适应市场',\n category: 'quantitative',\n },\n {\n id: 'quantum-edge-01',\n name: 'Quantum Edge',\n shortName: 'QTE',\n color: '#6366F1',\n scanIntervalMin: 35000,\n scanIntervalMax: 55000,\n tradeFrequency: 0.5,\n positionSizeMin: 25,\n positionSizeMax: 50,\n leverageMin: 8,\n leverageMax: 20,\n primaryIndicators: ['RSI', 'MACD', 'EMA', 'Volume', 'Bollinger'],\n riskTolerance: 'high',\n preferredPairs: ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'AVAX/USDT', 'ARB/USDT', 'OP/USDT'],\n rsiBias: 54,\n tier: 'vip',\n dailyYieldMin: 1.20,\n dailyYieldMax: 2.00,\n description: 'VIP量子优势策略,顶级AI算法,极致收益追求',\n category: 'quantitative',\n },\n];\n\n// ── Trading pairs with base prices ─────────────────────────────────────────────\n\nconst PAIR_PRICES: Record<string, number> = {\n 'BTC/USDT': 67500,\n 'ETH/USDT': 3450,\n 'BNB/USDT': 605,\n 'SOL/USDT': 178,\n 'XRP/USDT': 0.62,\n 'DOGE/USDT': 0.165,\n 'ADA/USDT': 0.45,\n 'AVAX/USDT': 38.5,\n 'ARB/USDT': 1.18,\n 'MATIC/USDT': 0.72,\n 'LINK/USDT': 14.5,\n 'UNI/USDT': 7.8,\n 'AAVE/USDT': 92,\n 'OP/USDT': 2.45,\n 'APT/USDT': 8.9,\n 'INJ/USDT': 24.5,\n 'TIA/USDT': 11.2,\n 'SUI/USDT': 1.65,\n 'DOT/USDT': 7.2,\n 'ATOM/USDT': 9.8,\n 'FIL/USDT': 5.6,\n 'LTC/USDT': 72,\n 'NEAR/USDT': 5.1,\n 'FTM/USDT': 0.42,\n};\n\nconst CHAIN_INFO: Record<string, { name: string; shortName: string; icon: string }> = {\n ethereum: { name: 'Ethereum', shortName: 'ETH', icon: 'Ξ' },\n arbitrum: { name: 'Arbitrum', shortName: 'ARB', icon: '◆' },\n bsc: { name: 'BSC', shortName: 'BSC', icon: '◆' },\n base: { name: 'Base', shortName: 'BASE', icon: '●' },\n polygon: { name: 'Polygon', shortName: 'POLY', icon: '⬡' },\n optimism: { name: 'Optimism', shortName: 'OP', icon: '◉' },\n avalanche: { name: 'Avalanche', shortName: 'AVAX', icon: '▲' },\n linea: { name: 'Linea', shortName: 'LINEA', icon: '═' },\n zksync: { name: 'zkSync', shortName: 'ZK', icon: '⬢' },\n scroll: { name: 'Scroll', shortName: 'SCRL', icon: '◎' },\n};\n\nconst NEWS_HEADLINES = [\n 'Fed signals potential rate pause, crypto markets react positively',\n 'Major institutional investor increases BTC allocation by 15%',\n 'On-chain data shows whale accumulation pattern forming',\n 'DeFi TVL reaches new monthly high across major protocols',\n 'Exchange outflows surge as holders move to cold storage',\n 'Options market signals increased volatility expected this week',\n 'Mining difficulty adjustment approaching, hash rate stable',\n 'Regulatory clarity in EU boosts market sentiment',\n 'Stablecoin supply expanding, potential bullish indicator',\n 'Social sentiment score shifts to extreme greed zone',\n 'Cross-chain bridge volume hits record daily high',\n 'Layer 2 adoption metrics show 40% MoM growth',\n];\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nlet idCounter = 0;\nfunction genId(): string {\n return `log_${Date.now()}_${++idCounter}`;\n}\n\nfunction rand(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(rand(min, max + 1));\n}\n\nfunction pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val));\n}\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) return price.toFixed(2);\n if (price >= 1) return price.toFixed(3);\n return price.toFixed(5);\n}\n\n// ── Engine ─────────────────────────────────────────────────────────────────────\n\nclass BotSimulationEngine {\n private listeners: LogCallback[] = [];\n private botTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private botStates: Map<string, BotState> = new Map();\n private priceState: Map<string, number> = new Map();\n private indicatorState: Map<string, IndicatorSnapshot> = new Map();\n private running = false;\n private userPairs: string[] = [];\n private userChains: string[] = [];\n\n constructor() {\n // Initialize prices with some jitter\n for (const [pair, base] of Object.entries(PAIR_PRICES)) {\n this.priceState.set(pair, base * (1 + rand(-0.02, 0.02)));\n }\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n getStrategies(): StrategyPersonality[] {\n return STRATEGY_PERSONALITIES;\n }\n\n start(strategyIds?: string[], userPairs?: string[], userChains?: string[]): void {\n this.running = true;\n // Convert pair IDs (e.g. 'BTC') to full symbols (e.g. 'BTC/USDT') if needed\n this.userPairs = (userPairs || [])\n .map(p => p.includes('/') ? p : `${p}/USDT`)\n .filter(p => p in PAIR_PRICES);\n this.userChains = (userChains || []).filter(c => c in CHAIN_INFO);\n const strategies = strategyIds\n ? STRATEGY_PERSONALITIES.filter(s => strategyIds.includes(s.id))\n : STRATEGY_PERSONALITIES;\n\n for (const strategy of strategies) {\n this.initBotState(strategy);\n this.scheduleCycle(strategy);\n }\n }\n\n stop(strategyIds?: string[]): void {\n const ids = strategyIds || Array.from(this.botTimers.keys());\n for (const id of ids) {\n const timer = this.botTimers.get(id);\n if (timer) {\n clearTimeout(timer);\n this.botTimers.delete(id);\n }\n }\n if (!strategyIds) {\n this.running = false;\n }\n }\n\n onLog(callback: LogCallback): () => void {\n this.listeners.push(callback);\n return () => {\n this.listeners = this.listeners.filter(l => l !== callback);\n };\n }\n\n getBotState(strategyId: string): BotState | undefined {\n return this.botStates.get(strategyId);\n }\n\n getAllBotStates(): Map<string, BotState> {\n return this.botStates;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n emitBootSequence(): void {\n const bootMessages: Array<{ msg: string; delay: number }> = [\n { msg: 'Initializing ONE Trading Engine v3.2.1...', delay: 0 },\n { msg: 'Loading market data feeds...', delay: 500 },\n { msg: 'Connecting to exchange WebSocket streams...', delay: 1200 },\n { msg: 'Calibrating indicator engines (RSI, MACD, EMA, Bollinger)...', delay: 2000 },\n { msg: 'Loading strategy personalities: balanced-01, conservative-01, aggressive-01', delay: 2800 },\n { msg: 'Risk management module initialized (max drawdown: 15%)', delay: 3600 },\n { msg: 'Portfolio allocation engine ready', delay: 4200 },\n { msg: '=== All systems online. Starting trading cycles ===', delay: 5000 },\n ];\n\n for (const { msg, delay } of bootMessages) {\n setTimeout(() => {\n this.emit({\n id: genId(),\n timestamp: Date.now(),\n strategyId: 'system',\n strategyName: 'SYSTEM',\n type: 'SYSTEM',\n message: msg,\n importance: 'medium',\n });\n }, delay);\n }\n }\n\n destroy(): void {\n this.stop();\n this.listeners = [];\n this.botStates.clear();\n this.priceState.clear();\n this.indicatorState.clear();\n this.userPairs = [];\n this.userChains = [];\n }\n\n // ── Private Methods ────────────────────────────────────────────────────────\n\n private emit(entry: BotLogEntry): void {\n for (const listener of this.listeners) {\n listener(entry);\n }\n }\n\n private getActivePairs(strategy: StrategyPersonality): string[] {\n return this.userPairs.length > 0 ? this.userPairs : strategy.preferredPairs;\n }\n\n private getActiveChain(): string {\n const chains = this.userChains.length > 0\n ? this.userChains\n : ['ethereum', 'arbitrum', 'bsc'];\n return pick(chains);\n }\n\n private getChainLabel(chainId: string): string {\n const info = CHAIN_INFO[chainId];\n return info ? info.shortName : chainId;\n }\n\n private initBotState(strategy: StrategyPersonality): void {\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n this.botStates.set(strategy.id, {\n strategyId: strategy.id,\n strategyName: strategy.name,\n isRunning: true,\n currentPair: pair,\n currentPrice: price,\n indicators,\n openPositions: [],\n totalPnl: rand(-50, 200),\n totalTrades: randInt(5, 25),\n winRate: rand(0.48, 0.68),\n lastSignal: 'HOLD',\n lastSignalConfidence: 0,\n });\n }\n\n private scheduleCycle(strategy: StrategyPersonality): void {\n if (!this.running) return;\n const interval = rand(strategy.scanIntervalMin, strategy.scanIntervalMax);\n const timer = setTimeout(() => {\n if (this.running) {\n this.runBotCycle(strategy);\n this.scheduleCycle(strategy);\n }\n }, interval);\n this.botTimers.set(strategy.id, timer);\n }\n\n private async runBotCycle(strategy: StrategyPersonality): Promise<void> {\n const state = this.botStates.get(strategy.id);\n if (!state) return;\n\n const activePairs = this.getActivePairs(strategy);\n const pair = pick(activePairs);\n const price = this.simulatePrice(pair);\n const indicators = this.generateIndicators(strategy, price);\n this.indicatorState.set(strategy.id, indicators);\n\n state.currentPair = pair;\n state.currentPrice = price;\n state.indicators = indicators;\n\n const entries: Array<{ entry: Omit<BotLogEntry, 'id' | 'timestamp'>; delay: number }> = [];\n let delay = 0;\n\n // 1. SCAN - Always (slower delay)\n const chain = this.getActiveChain();\n const chainLabel = this.getChainLabel(chain);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SCAN',\n message: `Scanning ${pair} on ${chainLabel} | Price: $${formatPrice(price)}`,\n data: { pair, chain, chainLabel },\n importance: 'low',\n },\n delay,\n });\n delay += rand(2000, 3500); // 2-3.5s after SCAN\n\n // 2. THINKING - AI reasoning process (new)\n const thinkingMessages = this.generateThinkingProcess(strategy, pair, price);\n for (const thinking of thinkingMessages) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'THINKING',\n message: thinking,\n importance: 'low',\n },\n delay,\n });\n delay += rand(1500, 2500); // 1.5-2.5s between thoughts\n }\n\n // 3. INDICATOR - Always (slower delay)\n const indicatorParts = [];\n if (strategy.primaryIndicators.includes('RSI') || strategy.primaryIndicators.includes('MACD')) {\n indicatorParts.push(`RSI: ${indicators.rsi.toFixed(1)}`);\n }\n if (strategy.primaryIndicators.includes('MACD') || strategy.primaryIndicators.includes('RSI')) {\n indicatorParts.push(`MACD: ${indicators.macd.histogram > 0 ? '+' : ''}${indicators.macd.histogram.toFixed(3)}`);\n }\n if (strategy.primaryIndicators.includes('EMA')) {\n indicatorParts.push(`EMA: ${indicators.ema.short.toFixed(1)}/${indicators.ema.long.toFixed(1)}`);\n if (indicators.ema.crossover !== 'none') {\n indicatorParts.push(`[${indicators.ema.crossover.toUpperCase()} CROSS]`);\n }\n }\n if (strategy.primaryIndicators.includes('Bollinger')) {\n indicatorParts.push(`BB: ${indicators.bollinger.position.toFixed(1)}% width=${indicators.bollinger.width.toFixed(2)}`);\n }\n if (strategy.primaryIndicators.includes('Volume')) {\n indicatorParts.push(`Vol: ${indicators.volume.ratio.toFixed(2)}x avg`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'INDICATOR',\n message: indicatorParts.join(' | '),\n data: { indicators },\n importance: 'low',\n },\n delay,\n });\n delay += rand(2000, 3500); // 2-3.5s after INDICATOR\n\n // 4. NEWS - 12% chance\n if (Math.random() < 0.12) {\n const sentiment = Math.random() > 0.4 ? 'Bullish' : 'Bearish';\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'NEWS',\n message: `[${sentiment}] ${pick(NEWS_HEADLINES)}`,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(2500, 4000); // 2.5-4s after NEWS\n }\n\n // 5. ANALYSIS - 40% chance\n if (Math.random() < 0.4) {\n const analysis = this.generateAnalysis(strategy, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ANALYSIS',\n message: analysis,\n importance: 'medium',\n },\n delay,\n });\n delay += rand(2500, 4000); // 2.5-4s after ANALYSIS\n }\n\n // 6-10. Signal evaluation and potential trade\n const signal = this.evaluateSignal(strategy, indicators);\n state.lastSignal = signal.direction;\n state.lastSignalConfidence = signal.confidence;\n\n if (signal.direction !== 'HOLD') {\n // 6. STRATEGY - Show strategy reasoning context (NEW)\n const strategyContext = this.generateStrategyContext(strategy, signal, indicators, pair);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'STRATEGY',\n message: strategyContext,\n data: {\n strategy: strategy.name,\n riskTolerance: strategy.riskTolerance,\n primaryIndicators: strategy.primaryIndicators,\n signal: signal.direction,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(3000, 5000); // 3-5s after STRATEGY\n\n // 7. SIGNAL\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'SIGNAL',\n message: `${signal.direction} signal detected | Confidence: ${(signal.confidence * 100).toFixed(1)}% | ${signal.reason}`,\n data: { signal },\n importance: 'high',\n },\n delay,\n });\n delay += rand(3000, 4500); // 3-4.5s after SIGNAL\n\n // 8. DECISION\n const decision = this.makeTradeDecision(strategy, signal, state);\n if (decision.execute) {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `Execute ${signal.direction} | Size: ${decision.positionSize.toFixed(1)}% | Leverage: ${decision.leverage}x | Risk/Reward: 1:${decision.riskReward.toFixed(1)}`,\n data: {\n strategyName: strategy.name,\n strategyId: strategy.id,\n riskTolerance: strategy.riskTolerance,\n signalReason: signal.reason,\n confidence: signal.confidence,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(2500, 4000); // 2.5-4s after DECISION\n\n // 9. ORDER\n const orderId = `ORD_${Date.now().toString(36).toUpperCase()}`;\n const orderPrice = signal.direction === 'LONG'\n ? price * (1 - rand(0.0001, 0.0005))\n : price * (1 + rand(0.0001, 0.0005));\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'ORDER',\n message: `Submitting ${signal.direction} order | ${pair} @ $${formatPrice(orderPrice)} on ${chainLabel} | ID: ${orderId}`,\n data: {\n orderId,\n pair,\n side: signal.direction,\n price: orderPrice,\n leverage: decision.leverage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n strategyContext: strategyContext,\n signalReason: signal.reason,\n },\n importance: 'high',\n },\n delay,\n });\n delay += rand(4000, 7000); // 4-7s for order execution\n\n // 10. FILLED\n const fillPrice = orderPrice * (1 + rand(-0.0003, 0.0003));\n const slippage = Math.abs(fillPrice - orderPrice) / orderPrice * 100;\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'FILLED',\n message: `Order FILLED | ${pair} ${signal.direction} @ $${formatPrice(fillPrice)} on ${chainLabel} | Slippage: ${slippage.toFixed(4)}% | ID: ${orderId}`,\n data: {\n orderId,\n fillPrice,\n slippage,\n chain,\n chainLabel,\n strategyName: strategy.name,\n executedBy: strategy.id,\n },\n importance: 'high',\n },\n delay,\n });\n\n // Update state with new position\n const position: OpenPosition = {\n id: orderId,\n pair,\n side: signal.direction as 'LONG' | 'SHORT',\n entryPrice: fillPrice,\n currentPrice: price,\n size: decision.positionSize,\n leverage: decision.leverage,\n pnl: 0,\n pnlPercent: 0,\n };\n state.openPositions = [...state.openPositions.slice(-2), position];\n state.totalTrades++;\n } else {\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'DECISION',\n message: `SKIP - ${decision.reason}`,\n importance: 'medium',\n },\n delay,\n });\n }\n }\n\n // 11. PNL - Update open positions\n if (state.openPositions.length > 0 && Math.random() < 0.5) {\n delay += rand(3500, 5500); // 3.5-5.5s before PNL\n let totalPositionPnl = 0;\n const pnlParts: string[] = [];\n\n for (const pos of state.openPositions) {\n pos.currentPrice = this.simulatePrice(pos.pair);\n const priceDiff = pos.side === 'LONG'\n ? (pos.currentPrice - pos.entryPrice) / pos.entryPrice\n : (pos.entryPrice - pos.currentPrice) / pos.entryPrice;\n pos.pnlPercent = priceDiff * pos.leverage * 100;\n pos.pnl = priceDiff * pos.leverage * pos.size;\n totalPositionPnl += pos.pnl;\n pnlParts.push(`${pos.pair} ${pos.side}: ${pos.pnlPercent >= 0 ? '+' : ''}${pos.pnlPercent.toFixed(2)}%`);\n }\n\n state.totalPnl += totalPositionPnl * rand(0.01, 0.05);\n\n // Sometimes close a position\n if (state.openPositions.length > 1 && Math.random() < 0.3) {\n const closed = state.openPositions.shift()!;\n const finalPnl = closed.pnlPercent;\n if (finalPnl > 0) {\n state.winRate = state.winRate * 0.95 + 0.05;\n } else {\n state.winRate = state.winRate * 0.95;\n }\n state.winRate = clamp(state.winRate, 0.35, 0.75);\n pnlParts.push(`CLOSED ${closed.pair}: ${finalPnl >= 0 ? '+' : ''}${finalPnl.toFixed(2)}%`);\n }\n\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'PNL',\n message: pnlParts.join(' | '),\n data: { totalPnl: state.totalPnl, positions: state.openPositions.length },\n importance: 'medium',\n },\n delay,\n });\n }\n\n // 12. RISK - Periodic check\n if (Math.random() < 0.2) {\n delay += rand(3000, 5000); // 3-5s before RISK\n const exposure = state.openPositions.reduce((sum, p) => sum + p.size * p.leverage, 0);\n const maxDrawdown = rand(2, 12);\n entries.push({\n entry: {\n strategyId: strategy.id,\n strategyName: strategy.shortName,\n type: 'RISK',\n message: `Portfolio exposure: ${exposure.toFixed(1)}% | Max drawdown: ${maxDrawdown.toFixed(1)}% | Open positions: ${state.openPositions.length} | Win rate: ${(state.winRate * 100).toFixed(1)}%`,\n importance: exposure > 80 ? 'high' : 'low',\n },\n delay,\n });\n }\n\n // Emit entries with delays\n for (const { entry, delay: d } of entries) {\n setTimeout(() => {\n if (this.running) {\n this.emit({\n ...entry,\n id: genId(),\n timestamp: Date.now(),\n });\n }\n }, d);\n }\n }\n\n private simulatePrice(pair: string): number {\n const current = this.priceState.get(pair) || PAIR_PRICES[pair] || 50000;\n const volatility = pair.includes('DOGE') ? 0.005 : pair.includes('BTC') ? 0.002 : 0.003;\n const drift = rand(-volatility, volatility);\n const newPrice = current * (1 + drift);\n this.priceState.set(pair, newPrice);\n return newPrice;\n }\n\n private generateIndicators(strategy: StrategyPersonality, price: number): IndicatorSnapshot {\n const prev = this.indicatorState.get(strategy.id);\n const prevRsi = prev?.rsi ?? strategy.rsiBias;\n\n // RSI: mean-reverting around bias\n const rsiMean = strategy.rsiBias;\n const rsiDrift = rand(-8, 8);\n const rsiReversion = (rsiMean - prevRsi) * 0.15;\n const rsi = clamp(prevRsi + rsiDrift + rsiReversion, 8, 95);\n\n // MACD: correlated with RSI\n const macdBias = rsi > 65 ? 0.3 : rsi < 35 ? -0.3 : 0;\n const prevHist = prev?.macd.histogram ?? 0;\n const histogram = clamp(prevHist * 0.7 + rand(-0.5, 0.5) + macdBias, -2, 2);\n const macdValue = histogram * rand(0.8, 1.5);\n const macdSignal = macdValue - histogram;\n\n // EMA: occasional crossovers\n const prevShort = prev?.ema.short ?? price;\n const prevLong = prev?.ema.long ?? price;\n const emaShort = prevShort * 0.9 + price * 0.1;\n const emaLong = prevLong * 0.95 + price * 0.05;\n let crossover: 'golden' | 'death' | 'none' = 'none';\n if (prevShort <= prevLong && emaShort > emaLong) crossover = 'golden';\n else if (prevShort >= prevLong && emaShort < emaLong) crossover = 'death';\n\n // Bollinger\n const bbMiddle = price;\n const bbWidth = price * rand(0.01, 0.04);\n const bbUpper = bbMiddle + bbWidth;\n const bbLower = bbMiddle - bbWidth;\n const bbPosition = ((price - bbLower) / (bbUpper - bbLower)) * 100;\n\n // Volume\n const volRatio = rand(0.3, 2.5);\n const volCurrent = rand(100000, 5000000);\n\n return {\n rsi,\n macd: { value: macdValue, signal: macdSignal, histogram },\n ema: { short: emaShort, long: emaLong, crossover },\n bollinger: { upper: bbUpper, middle: bbMiddle, lower: bbLower, width: bbWidth / price, position: bbPosition },\n volume: { current: volCurrent, average: volCurrent / volRatio, ratio: volRatio },\n };\n }\n\n private generateThinkingProcess(strategy: StrategyPersonality, pair: string, price: number): string[] {\n const thoughts: string[] = [];\n const pairBase = pair.split('/')[0];\n\n // Generate 1-3 thinking steps\n const thinkingTemplates = [\n `Analyzing ${pairBase} market structure...`,\n `Checking ${strategy.primaryIndicators.join(', ')} confluence...`,\n `Evaluating risk parameters for ${strategy.riskTolerance} tolerance...`,\n `Scanning order book depth at $${formatPrice(price)}...`,\n `Cross-referencing with historical patterns...`,\n `Calculating optimal entry zone...`,\n `Assessing market sentiment indicators...`,\n `Monitoring whale activity on ${pairBase}...`,\n `Comparing momentum across timeframes...`,\n `Validating support/resistance levels...`,\n ];\n\n const numThoughts = randInt(1, 3);\n const shuffled = [...thinkingTemplates].sort(() => Math.random() - 0.5);\n\n for (let i = 0; i < numThoughts; i++) {\n thoughts.push(shuffled[i]);\n }\n\n return thoughts;\n }\n\n private generateStrategyContext(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number; reason: string },\n indicators: IndicatorSnapshot,\n pair: string\n ): string {\n const contexts = [];\n\n // Strategy personality context\n contexts.push(`[${strategy.name}]`);\n\n // Risk context\n const riskLevel = strategy.riskTolerance === 'high' ? 'aggressive' : strategy.riskTolerance === 'low' ? 'conservative' : 'balanced';\n contexts.push(`Risk: ${riskLevel}`);\n\n // Key indicator that triggered\n if (indicators.rsi < 35 || indicators.rsi > 65) {\n contexts.push(`RSI ${indicators.rsi < 35 ? 'oversold' : 'overbought'} (${indicators.rsi.toFixed(1)})`);\n }\n if (indicators.ema.crossover !== 'none') {\n contexts.push(`EMA ${indicators.ema.crossover} cross`);\n }\n if (Math.abs(indicators.macd.histogram) > 0.3) {\n contexts.push(`MACD ${indicators.macd.histogram > 0 ? 'bullish' : 'bearish'} momentum`);\n }\n\n // Confidence interpretation\n const confLevel = signal.confidence > 0.7 ? 'HIGH' : signal.confidence > 0.5 ? 'MEDIUM' : 'LOW';\n contexts.push(`Confidence: ${confLevel}`);\n\n return contexts.join(' | ');\n }\n\n private generateAnalysis(strategy: StrategyPersonality, indicators: IndicatorSnapshot, pair: string): string {\n const analyses = [];\n\n if (indicators.rsi > 70) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - overbought territory, watching for reversal`);\n } else if (indicators.rsi < 30) {\n analyses.push(`RSI at ${indicators.rsi.toFixed(1)} - oversold, potential bounce setup`);\n } else if (indicators.rsi > 55) {\n analyses.push(`RSI trending bullish at ${indicators.rsi.toFixed(1)}`);\n } else {\n analyses.push(`RSI neutral at ${indicators.rsi.toFixed(1)}, no clear direction`);\n }\n\n if (indicators.macd.histogram > 0.5) {\n analyses.push('MACD histogram expanding positive - momentum building');\n } else if (indicators.macd.histogram < -0.5) {\n analyses.push('MACD histogram expanding negative - bearish pressure');\n }\n\n if (indicators.ema.crossover === 'golden') {\n analyses.push('EMA golden cross detected - strong bullish signal');\n } else if (indicators.ema.crossover === 'death') {\n analyses.push('EMA death cross detected - bearish warning');\n }\n\n if (indicators.bollinger.position > 90) {\n analyses.push(`Price near upper Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential resistance`);\n } else if (indicators.bollinger.position < 10) {\n analyses.push(`Price near lower Bollinger band (${indicators.bollinger.position.toFixed(0)}%) - potential support`);\n }\n\n if (indicators.volume.ratio > 1.8) {\n analyses.push(`Volume spike ${indicators.volume.ratio.toFixed(1)}x average - high activity`);\n }\n\n return analyses.length > 0 ? analyses.join(' | ') : `${pair} consolidating - waiting for clearer setup`;\n }\n\n private evaluateSignal(\n strategy: StrategyPersonality,\n indicators: IndicatorSnapshot,\n ): { direction: 'LONG' | 'SHORT' | 'HOLD'; confidence: number; reason: string } {\n let bullScore = 0;\n let bearScore = 0;\n const reasons: string[] = [];\n\n // RSI\n if (indicators.rsi < 30) { bullScore += 2; reasons.push('RSI oversold'); }\n else if (indicators.rsi < 40) { bullScore += 1; reasons.push('RSI low'); }\n else if (indicators.rsi > 70) { bearScore += 2; reasons.push('RSI overbought'); }\n else if (indicators.rsi > 60) { bearScore += 1; reasons.push('RSI high'); }\n\n // MACD\n if (indicators.macd.histogram > 0.3) { bullScore += 1.5; reasons.push('MACD bullish'); }\n else if (indicators.macd.histogram < -0.3) { bearScore += 1.5; reasons.push('MACD bearish'); }\n\n // EMA\n if (indicators.ema.crossover === 'golden') { bullScore += 2.5; reasons.push('Golden cross'); }\n else if (indicators.ema.crossover === 'death') { bearScore += 2.5; reasons.push('Death cross'); }\n else if (indicators.ema.short > indicators.ema.long) { bullScore += 0.5; }\n else { bearScore += 0.5; }\n\n // Bollinger\n if (indicators.bollinger.position < 15) { bullScore += 1; reasons.push('BB support'); }\n else if (indicators.bollinger.position > 85) { bearScore += 1; reasons.push('BB resistance'); }\n\n // Volume confirmation\n if (indicators.volume.ratio > 1.5) {\n if (bullScore > bearScore) bullScore += 1;\n else bearScore += 1;\n reasons.push('Volume confirms');\n }\n\n const netScore = bullScore - bearScore;\n const confidence = Math.min(Math.abs(netScore) / 6, 0.95);\n const threshold = strategy.riskTolerance === 'high' ? 1.5 : strategy.riskTolerance === 'medium' ? 2.0 : 2.5;\n\n // Apply trade frequency filter\n if (Math.random() > strategy.tradeFrequency) {\n return { direction: 'HOLD', confidence: 0, reason: 'Cycle skip' };\n }\n\n if (netScore > threshold) {\n return { direction: 'LONG', confidence, reason: reasons.slice(0, 3).join(', ') };\n } else if (netScore < -threshold) {\n return { direction: 'SHORT', confidence, reason: reasons.slice(0, 3).join(', ') };\n }\n\n return { direction: 'HOLD', confidence: 0, reason: 'No clear signal' };\n }\n\n private makeTradeDecision(\n strategy: StrategyPersonality,\n signal: { direction: string; confidence: number },\n state: BotState,\n ): { execute: boolean; positionSize: number; leverage: number; riskReward: number; reason: string } {\n // Check position limits\n if (state.openPositions.length >= 3) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: 'Max positions reached (3)' };\n }\n\n // Confidence threshold\n const minConfidence = strategy.riskTolerance === 'high' ? 0.3 : strategy.riskTolerance === 'medium' ? 0.45 : 0.6;\n if (signal.confidence < minConfidence) {\n return { execute: false, positionSize: 0, leverage: 0, riskReward: 0, reason: `Confidence too low (${(signal.confidence * 100).toFixed(0)}% < ${(minConfidence * 100).toFixed(0)}%)` };\n }\n\n const positionSize = rand(strategy.positionSizeMin, strategy.positionSizeMax);\n const leverage = randInt(strategy.leverageMin, strategy.leverageMax);\n const riskReward = rand(1.2, 3.5);\n\n return { execute: true, positionSize, leverage, riskReward, reason: '' };\n }\n}\n\n// ── Singleton Export ────────────────────────────────────────────────────────────\n\nexport const botSimulationEngine = new BotSimulationEngine();\n"]}