@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/services/forex/ForexSimulationEngine.ts","../src/config/index.ts","../src/types/aiTrading.ts","../src/types/console.ts","../src/services/engine.ts","../src/services/price.ts","../src/utils/index.ts","../src/components/ai/OneChainSelector.tsx","../src/components/ai/OneTierSelector.tsx","../src/components/ai/OneCycleSelector.tsx","../src/components/ai/OnePairSelector.tsx","../src/components/ai/OneForexPoolCard.tsx","../src/components/ai/OneForexCapitalSplit.tsx","../src/components/ai/OneForexConsoleView.tsx","../src/components/ai/OneForexPairSelector.tsx","../src/components/ai/OneForexTradeHistory.tsx","../src/hooks/useForexTrading.ts","../src/react-native.ts","../src/services/forex/BotSimulationEngine.ts"],"names":["pick","formatDate","genId","rand","randInt","ForexPoolDataGenerator","config","jsxs","View","styles","jsx","Text","TouchableOpacity","StyleSheet","MONO","Platform","ScrollView","useEffect","inv","useRef","forexSimulationEngine","idCounter"],"mappings":"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","file":"react-native.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","// 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 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 SDK - AI Trading Types & Constants\n// Shared types for AI-powered crypto trading strategies\n// ══════════════════════════════════════════════════════════════════════════════\n\nexport type StrategyCategory = 'conservative' | 'balanced' | 'aggressive' | 'hedge' | 'arbitrage' | 'trend' | 'grid' | 'dca';\nexport type OrderStatus = 'pending' | 'active' | 'paused' | 'completed' | 'cancelled' | 'pending_redemption' | 'redeemed';\nexport type TradeAction = 'buy' | 'sell' | 'long' | 'short' | 'close_long' | 'close_short';\nexport type TradeStatus = 'open' | 'closed' | 'liquidated' | 'cancelled';\nexport type FeeType = 'management' | 'performance' | 'withdrawal' | 'early_redemption_penalty';\nexport type OrderEventType = 'created' | 'activated' | 'paused' | 'resumed' | 'redemption_requested' | 'redeemed' | 'cancelled' | 'fee_deducted' | 'profit_realized';\n\nexport interface AIStrategyConfig {\n id: string;\n name: string;\n description: string | null;\n category: StrategyCategory;\n riskLevel: 1 | 2 | 3 | 4 | 5;\n minInvestment: number;\n maxInvestment: number | null;\n lockPeriodDays: number;\n expectedApyMin: number | null;\n expectedApyMax: number | null;\n managementFeeRate: number;\n performanceFeeRate: number;\n supportedPairs: string[];\n supportedChains: string[];\n supportedCurrencies: string[];\n leverageMin: number;\n leverageMax: number;\n isActive: boolean;\n}\n\nexport interface AIOrderCreateInput {\n strategyId: string;\n amount: number;\n currency: string;\n chain: string;\n lockPeriodDays: number;\n}\n\nexport interface AIOrderSummary {\n orderId: string;\n strategyId: string;\n strategyName: string;\n amount: number;\n currentValue: number;\n profit: number;\n profitPercent: number;\n status: OrderStatus;\n daysRemaining: number;\n lockProgress: number;\n}\n\nexport interface AIPortfolioSummary {\n totalInvested: number;\n totalValue: number;\n totalProfit: number;\n totalProfitPercent: number;\n activeOrders: number;\n totalTrades: number;\n profitToday: number;\n profit7d: number;\n profit30d: number;\n}\n\nexport interface AITradeLog {\n id: string;\n timestamp: string;\n action: TradeAction;\n pair: string;\n entryPrice: number;\n exitPrice: number | null;\n amount: number;\n pnl: number;\n pnlPercent: number;\n leverage: number;\n status: TradeStatus;\n aiConfidence: number | null;\n aiReasoning: string | null;\n}\n\nexport interface AIPenaltyCalculation {\n completionRate: number;\n penaltyRate: number;\n estimatedPenalty: number;\n estimatedRedemption: number;\n isEarlyWithdrawal: boolean;\n}\n\nexport interface AIPerformanceChart {\n date: string;\n nav: number;\n dailyPnl: number;\n cumulativePnl: number;\n}\n\nexport const PENALTY_TIERS = [\n { minProgress: 0.75, maxProgress: 1.0, rate: 0.50, label: '50%' },\n { minProgress: 0.50, maxProgress: 0.75, rate: 0.60, label: '60%' },\n { minProgress: 0.25, maxProgress: 0.50, rate: 0.70, label: '70%' },\n { minProgress: 0.00, maxProgress: 0.25, rate: 0.80, label: '80%' },\n] as const;\n\nexport function calculateEarlyWithdrawalPenalty(\n investedAmount: number,\n profit: number,\n lockProgress: number,\n): AIPenaltyCalculation {\n const totalValue = investedAmount + profit;\n const isEarlyWithdrawal = lockProgress < 1.0;\n let penaltyRate = 0;\n if (isEarlyWithdrawal) {\n if (lockProgress >= 0.75) penaltyRate = 0.50;\n else if (lockProgress >= 0.50) penaltyRate = 0.60;\n else if (lockProgress >= 0.25) penaltyRate = 0.70;\n else penaltyRate = 0.80;\n }\n const estimatedPenalty = totalValue * penaltyRate;\n const estimatedRedemption = totalValue - estimatedPenalty;\n return { completionRate: lockProgress, penaltyRate, estimatedPenalty, estimatedRedemption, isEarlyWithdrawal };\n}\n\nexport const STRATEGY_CATEGORIES: Record<StrategyCategory, { labelKey: string; color: string; icon: string }> = {\n conservative: { labelKey: 'ai.category_conservative', color: '#10B981', icon: '\\u{1F6E1}\\u{FE0F}' },\n balanced: { labelKey: 'ai.category_balanced', color: '#3B82F6', icon: '\\u{2696}\\u{FE0F}' },\n aggressive: { labelKey: 'ai.category_aggressive', color: '#EF4444', icon: '\\u{1F680}' },\n hedge: { labelKey: 'ai.category_hedge', color: '#8B5CF6', icon: '\\u{1F512}' },\n arbitrage: { labelKey: 'ai.category_arbitrage', color: '#F59E0B', icon: '\\u{26A1}' },\n trend: { labelKey: 'ai.category_trend', color: '#EC4899', icon: '\\u{1F4C8}' },\n grid: { labelKey: 'ai.category_grid', color: '#6366F1', icon: '\\u{25A6}' },\n dca: { labelKey: 'ai.category_dca', color: '#14B8A6', icon: '\\u{1F4CA}' },\n};\n\nexport const RISK_LEVELS: Record<number, { labelKey: string; color: string; bgColor: string }> = {\n 1: { labelKey: 'ai.risk_very_low', color: '#10B981', bgColor: '#D1FAE5' },\n 2: { labelKey: 'ai.risk_low', color: '#22C55E', bgColor: '#DCFCE7' },\n 3: { labelKey: 'ai.risk_medium', color: '#F59E0B', bgColor: '#FEF3C7' },\n 4: { labelKey: 'ai.risk_high', color: '#F97316', bgColor: '#FFEDD5' },\n 5: { labelKey: 'ai.risk_very_high', color: '#EF4444', bgColor: '#FEE2E2' },\n};\n\nexport const ORDER_STATUS_CONFIG: Record<OrderStatus, { labelKey: string; color: string; bgColor: string }> = {\n pending: { labelKey: 'ai.status_pending', color: '#F59E0B', bgColor: '#FEF3C7' },\n active: { labelKey: 'ai.status_active', color: '#10B981', bgColor: '#D1FAE5' },\n paused: { labelKey: 'ai.status_paused', color: '#6B7280', bgColor: '#F3F4F6' },\n completed: { labelKey: 'ai.status_completed', color: '#3B82F6', bgColor: '#DBEAFE' },\n cancelled: { labelKey: 'ai.status_cancelled', color: '#EF4444', bgColor: '#FEE2E2' },\n pending_redemption: { labelKey: 'ai.status_pending_redemption', color: '#8B5CF6', bgColor: '#EDE9FE' },\n redeemed: { labelKey: 'ai.status_redeemed', color: '#14B8A6', bgColor: '#CCFBF1' },\n};\n","// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - Trading Console Types & Constants\n// Shared types for real-time trading console components\n// ══════════════════════════════════════════════════════════════════════════════\n\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\nimport type { ForexLogEntry, ForexPoolTransaction, ForexLogType } from './forex';\n\n// ── Re-exports for convenience ────────────────────────────────────────────────\n\nexport type { BotLogEntry, BotLogType, BotState, IndicatorSnapshot, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Console Log Types ─────────────────────────────────────────────────────────\n\nexport type AILogType =\n | 'SCAN' | 'THINKING' | 'INDICATOR' | 'ANALYSIS' | 'SIGNAL'\n | 'STRATEGY' | 'DECISION' | 'ORDER' | 'FILLED' | 'PNL'\n | 'RISK' | 'NEWS' | 'SYSTEM';\n\nexport const AI_LOG_COLORS: Record<AILogType, string> = {\n SCAN: '#06B6D4', // Cyan\n THINKING: '#A855F7', // Purple\n INDICATOR: '#3B82F6', // Blue\n ANALYSIS: '#6366F1', // Indigo\n SIGNAL: '#F59E0B', // Amber\n STRATEGY: '#D946EF', // Fuchsia\n DECISION: '#F97316', // Orange\n ORDER: '#EC4899', // Pink\n FILLED: '#10B981', // Green\n PNL: '#22C55E', // Emerald\n RISK: '#EF4444', // Red\n NEWS: '#14B8A6', // Teal\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// Forex log type colors (for ForexSimulationEngine logs)\nexport const FOREX_LOG_COLORS: Record<ForexLogType, string> = {\n RFQ: '#06B6D4', // Cyan\n QUOTE: '#8B5CF6', // Purple\n MATCH: '#10B981', // Green\n SETTLE: '#F59E0B', // Amber\n PVP: '#3B82F6', // Blue\n HEDGE: '#EC4899', // Pink\n CLEAR: '#14B8A6', // Teal\n POSITION: '#6366F1', // Indigo\n PNL: '#22C55E', // Emerald\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// ── AI Position Types ─────────────────────────────────────────────────────────\n\nexport type PositionSide = 'LONG' | 'SHORT';\nexport type PositionStatus = 'open' | 'closed' | 'liquidated' | 'pending';\n\nexport interface AIPosition {\n id: string;\n strategyId: string;\n strategyName: string;\n pair: string;\n side: PositionSide;\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n margin: number;\n pnl: number;\n pnlPercent: number;\n status: PositionStatus;\n stopLoss?: number;\n takeProfit?: number;\n liquidationPrice?: number;\n openTime: number;\n closeTime?: number;\n chain?: string;\n orderId?: string;\n aiConfidence?: number;\n aiReasoning?: string;\n}\n\n// ── AI Decision Types ─────────────────────────────────────────────────────────\n\nexport type DecisionAction = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT' | 'HOLD' | 'SKIP';\n\nexport interface AIDecision {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n pair: string;\n action: DecisionAction;\n confidence: number;\n reasoning: string;\n indicators: {\n rsi?: number;\n macd?: number;\n ema?: string;\n volume?: number;\n bollinger?: string;\n };\n signals: string[];\n executed: boolean;\n positionId?: string;\n price?: number;\n size?: number;\n leverage?: number;\n}\n\n// ── Risk Status Types ─────────────────────────────────────────────────────────\n\nexport type RiskLevel = 'low' | 'medium' | 'high' | 'critical';\nexport type TradingStatus = 'active' | 'paused' | 'stopped' | 'cooldown';\n\nexport interface RiskStatus {\n timestamp: number;\n // Portfolio exposure\n totalExposure: number;\n maxExposure: number;\n exposurePercent: number;\n // Daily limits\n dailyPnl: number;\n dailyPnlLimit: number;\n dailyPnlPercent: number;\n dailyTradeCount: number;\n dailyTradeLimit: number;\n // Drawdown\n currentDrawdown: number;\n maxDrawdown: number;\n drawdownPercent: number;\n // Position limits\n openPositions: number;\n maxPositions: number;\n // Risk assessment\n riskLevel: RiskLevel;\n tradingStatus: TradingStatus;\n warnings: string[];\n // Per-strategy risk\n strategyRisks?: Record<string, {\n exposure: number;\n drawdown: number;\n riskLevel: RiskLevel;\n }>;\n}\n\nexport const RISK_LEVEL_COLORS: Record<RiskLevel, { color: string; bgColor: string }> = {\n low: { color: '#10B981', bgColor: '#D1FAE5' },\n medium: { color: '#F59E0B', bgColor: '#FEF3C7' },\n high: { color: '#F97316', bgColor: '#FFEDD5' },\n critical: { color: '#EF4444', bgColor: '#FEE2E2' },\n};\n\nexport const TRADING_STATUS_COLORS: Record<TradingStatus, { color: string; bgColor: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7' },\n stopped: { color: '#EF4444', bgColor: '#FEE2E2' },\n cooldown: { color: '#6366F1', bgColor: '#E0E7FF' },\n};\n\n// ── Console Metrics Types ─────────────────────────────────────────────────────\n\nexport interface ConsoleMetrics {\n // NAV & Performance\n nav: number;\n navChange24h: number;\n navChangePercent24h: number;\n // P&L\n totalPnl: number;\n realizedPnl: number;\n unrealizedPnl: number;\n pnlToday: number;\n pnl7d: number;\n pnl30d: number;\n // Trading stats\n totalTrades: number;\n tradesToday: number;\n winRate: number;\n winCount: number;\n lossCount: number;\n avgWin: number;\n avgLoss: number;\n profitFactor: number;\n // Position stats\n openPositions: number;\n totalExposure: number;\n avgLeverage: number;\n // By strategy\n strategyMetrics?: Record<string, {\n pnl: number;\n trades: number;\n winRate: number;\n exposure: number;\n }>;\n}\n\n// ── Agent Types ───────────────────────────────────────────────────────────────\n\nexport type AgentStatus = 'active' | 'paused' | 'idle' | 'error' | 'initializing';\n\nexport interface AIAgent {\n id: string;\n strategyId: string;\n name: string;\n shortName: string;\n color: string;\n status: AgentStatus;\n // Performance\n totalPnl: number;\n pnlToday: number;\n winRate: number;\n totalTrades: number;\n tradesToday: number;\n // Current state\n currentPair?: string;\n currentPrice?: number;\n lastSignal?: string;\n lastSignalConfidence?: number;\n lastActivity?: number;\n // Positions\n openPositions: number;\n totalExposure: number;\n // Risk\n riskLevel: RiskLevel;\n drawdown: number;\n // Config\n riskTolerance: 'low' | 'medium' | 'high';\n primaryIndicators: string[];\n preferredPairs: string[];\n leverageRange: [number, number];\n}\n\nexport const AGENT_STATUS_COLORS: Record<AgentStatus, { color: string; bgColor: string; label: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5', label: 'Active' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7', label: 'Paused' },\n idle: { color: '#6B7280', bgColor: '#F3F4F6', label: 'Idle' },\n error: { color: '#EF4444', bgColor: '#FEE2E2', label: 'Error' },\n initializing: { color: '#3B82F6', bgColor: '#DBEAFE', label: 'Starting' },\n};\n\n// ── Combined Console State ────────────────────────────────────────────────────\n\nexport interface CombinedLogEntry {\n id: string;\n timestamp: number;\n source: 'ai' | 'forex';\n strategyId?: string;\n strategyName?: string;\n type: string;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface TradingConsoleState {\n ai: {\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n positions: AIPosition[];\n decisions: AIDecision[];\n riskStatus: RiskStatus | null;\n simulationLogs: BotLogEntry[];\n botStates: Map<string, BotState>;\n };\n forex: {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n stats: {\n totalPnl: number;\n totalTrades: number;\n totalPips: number;\n totalLots: number;\n };\n };\n metrics: ConsoleMetrics;\n combinedLogs: CombinedLogEntry[];\n}\n\n// ── Hook Options ──────────────────────────────────────────────────────────────\n\nexport interface TradingConsoleOptions {\n simulation?: boolean;\n pollInterval?: number;\n maxLogs?: number;\n strategyIds?: string[];\n autoStart?: boolean;\n}\n\nexport interface AIQuantConsoleOptions {\n strategyIds?: string[];\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\nexport interface AgentConsoleOptions {\n strategyId: string;\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\n// ── Default Values ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONSOLE_OPTIONS: TradingConsoleOptions = {\n simulation: true,\n pollInterval: 5000,\n maxLogs: 500,\n autoStart: false,\n};\n\nexport const DEFAULT_RISK_STATUS: RiskStatus = {\n timestamp: Date.now(),\n totalExposure: 0,\n maxExposure: 100000,\n exposurePercent: 0,\n dailyPnl: 0,\n dailyPnlLimit: 5000,\n dailyPnlPercent: 0,\n dailyTradeCount: 0,\n dailyTradeLimit: 50,\n currentDrawdown: 0,\n maxDrawdown: 15,\n drawdownPercent: 0,\n openPositions: 0,\n maxPositions: 10,\n riskLevel: 'low',\n tradingStatus: 'active',\n warnings: [],\n};\n\nexport const DEFAULT_CONSOLE_METRICS: ConsoleMetrics = {\n nav: 0,\n navChange24h: 0,\n navChangePercent24h: 0,\n totalPnl: 0,\n realizedPnl: 0,\n unrealizedPnl: 0,\n pnlToday: 0,\n pnl7d: 0,\n pnl30d: 0,\n totalTrades: 0,\n tradesToday: 0,\n winRate: 0,\n winCount: 0,\n lossCount: 0,\n avgWin: 0,\n avgLoss: 0,\n profitFactor: 0,\n openPositions: 0,\n totalExposure: 0,\n avgLeverage: 0,\n};\n\n// ── Utility Functions ─────────────────────────────────────────────────────────\n\nexport function calculateRiskLevel(\n exposurePercent: number,\n drawdownPercent: number,\n dailyPnlPercent: number\n): RiskLevel {\n const worstMetric = Math.max(exposurePercent, drawdownPercent, Math.abs(dailyPnlPercent));\n if (worstMetric >= 90) return 'critical';\n if (worstMetric >= 70) return 'high';\n if (worstMetric >= 40) return 'medium';\n return 'low';\n}\n\nexport function formatPnl(pnl: number): string {\n const sign = pnl >= 0 ? '+' : '';\n if (Math.abs(pnl) >= 1000000) {\n return `${sign}$${(pnl / 1000000).toFixed(2)}M`;\n }\n if (Math.abs(pnl) >= 1000) {\n return `${sign}$${(pnl / 1000).toFixed(2)}K`;\n }\n return `${sign}$${pnl.toFixed(2)}`;\n}\n\nexport function formatPercent(value: number, showSign = true): string {\n const sign = showSign && value >= 0 ? '+' : '';\n return `${sign}${value.toFixed(2)}%`;\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 { 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","// ===== Address Utilities =====\nexport function shortenAddress(address: string, chars = 4): string {\n if (!address) return '';\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\nexport function isValidAddress(address: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\nexport function checksumAddress(address: string): string {\n // Basic checksum - for proper checksum use ethers/viem\n return address.toLowerCase();\n}\n\n// ===== Number Formatting =====\nexport function formatNumber(\n value: number,\n options: {\n decimals?: number;\n compact?: boolean;\n currency?: string;\n locale?: string;\n } = {}\n): string {\n const { decimals = 2, compact = false, currency, locale = 'en-US' } = options;\n\n if (currency) {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? 'compact' : 'standard',\n }).format(value);\n }\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? 'compact' : 'standard',\n }).format(value);\n}\n\nexport function formatUSD(value: number, compact = false): string {\n return formatNumber(value, { currency: 'USD', compact });\n}\n\nexport function formatPercent(value: number, decimals = 2): string {\n const sign = value >= 0 ? '+' : '';\n return `${sign}${value.toFixed(decimals)}%`;\n}\n\nexport function formatTokenAmount(amount: number, decimals = 6): string {\n if (amount === 0) return '0';\n if (amount < 0.000001) return '<0.000001';\n if (amount < 1) return amount.toFixed(decimals);\n if (amount < 1000) return amount.toFixed(4);\n if (amount < 1000000) return formatNumber(amount, { decimals: 2 });\n return formatNumber(amount, { decimals: 2, compact: true });\n}\n\n// ===== Date & Time Utilities =====\nexport function formatDate(\n date: string | Date,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }\n): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleDateString('en-US', options);\n}\n\nexport function formatDateTime(date: string | Date): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function formatRelativeTime(date: string | Date): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n\n if (diffSec < 60) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n if (diffHour < 24) return `${diffHour}h ago`;\n if (diffDay < 7) return `${diffDay}d ago`;\n\n return formatDate(d);\n}\n\n// ===== Validation Utilities =====\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\nexport function isValidPhone(phone: string): boolean {\n const phoneRegex = /^\\+?[1-9]\\d{1,14}$/;\n return phoneRegex.test(phone.replace(/[\\s-()]/g, ''));\n}\n\n// ===== String Utilities =====\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\nexport function truncate(str: string, length: number): string {\n if (str.length <= length) return str;\n return `${str.slice(0, length)}...`;\n}\n\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\n// ===== Async Utilities =====\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: { maxAttempts?: number; delay?: number; backoff?: number } = {}\n): Promise<T> {\n const { maxAttempts = 3, delay = 1000, backoff = 2 } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < maxAttempts) {\n await sleep(delay * Math.pow(backoff, attempt - 1));\n }\n }\n }\n\n throw lastError;\n}\n\n// ===== Object Utilities =====\nexport function omit<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n}\n\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n// ===== Error Handling =====\nexport class OneSDKError extends Error {\n code: string;\n details?: any;\n\n constructor(message: string, code: string, details?: any) {\n super(message);\n this.name = 'OneSDKError';\n this.code = code;\n this.details = details;\n }\n}\n\nexport function isOneSDKError(error: unknown): error is OneSDKError {\n return error instanceof OneSDKError;\n}\n","/**\n * OneChainSelector - Multi-chain selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\n// Chain configuration with branding\nexport const CHAIN_CONFIG: Record<string, { name: string; icon: string; color: string }> = {\n ethereum: { name: 'Ethereum', icon: 'Ξ', color: '#627EEA' },\n arbitrum: { name: 'Arbitrum', icon: '◆', color: '#28A0F0' },\n bsc: { name: 'BSC', icon: '◆', color: '#F3BA2F' },\n base: { name: 'Base', icon: '●', color: '#0052FF' },\n polygon: { name: 'Polygon', icon: '⬡', color: '#8247E5' },\n optimism: { name: 'Optimism', icon: '◉', color: '#FF0420' },\n avalanche: { name: 'Avalanche', icon: '▲', color: '#E84142' },\n linea: { name: 'Linea', icon: '═', color: '#121212' },\n zksync: { name: 'zkSync', icon: '⬢', color: '#8C8DFC' },\n scroll: { name: 'Scroll', icon: '◎', color: '#FFEEDA' },\n};\n\nexport interface OneChainSelectorProps {\n /** List of supported chain IDs */\n supportedChains: string[];\n /** Currently selected chains */\n selectedChains: string[];\n /** Callback when chain selection changes */\n onSelectChain: (chain: string) => void;\n /** Enable multi-select (default: true) */\n multiSelect?: boolean;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Minimum required selections (for multi-select) */\n minSelections?: number;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OneChainSelector: React.FC<OneChainSelectorProps> = ({\n supportedChains,\n selectedChains,\n onSelectChain,\n multiSelect = true,\n accentColor = '#188775',\n title,\n subtitle,\n minSelections = 1,\n style,\n titleStyle,\n}) => {\n const handleSelect = (chain: string) => {\n if (multiSelect) {\n // In multi-select, prevent deselecting if at minimum\n if (selectedChains.includes(chain) && selectedChains.length <= minSelections) {\n return;\n }\n onSelectChain(chain);\n } else {\n // Single select - always allow selection\n if (!selectedChains.includes(chain)) {\n onSelectChain(chain);\n }\n }\n };\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.chainsContainer}>\n {supportedChains.map((chain) => {\n const chainInfo = CHAIN_CONFIG[chain] || { name: chain, icon: '●', color: '#888' };\n const isSelected = selectedChains.includes(chain);\n\n return (\n <TouchableOpacity\n key={chain}\n style={[\n styles.chainChip,\n isSelected && styles.chainChipSelected,\n isSelected && { borderColor: accentColor, backgroundColor: accentColor + '15' }\n ]}\n onPress={() => handleSelect(chain)}\n activeOpacity={0.7}\n >\n <View style={[styles.chainIconBg, { backgroundColor: chainInfo.color + '20' }]}>\n <Text style={[styles.chainIcon, { color: chainInfo.color }]}>{chainInfo.icon}</Text>\n </View>\n <Text style={[\n styles.chainText,\n isSelected && { color: accentColor, fontWeight: '600' }\n ]}>\n {chainInfo.name}\n </Text>\n {isSelected && (\n <Text style={[styles.checkmark, { color: accentColor }]}>✓</Text>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n\n {multiSelect && selectedChains.length > 0 && (\n <View style={styles.selectedInfo}>\n <Text style={styles.selectedText}>\n {selectedChains.length} chain{selectedChains.length > 1 ? 's' : ''} selected\n </Text>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n chainsContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n chainChip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: '#fff',\n borderRadius: 12,\n borderWidth: 2,\n borderColor: '#e5e5e5',\n gap: 8,\n },\n chainChipSelected: {\n borderWidth: 2,\n },\n chainIconBg: {\n width: 28,\n height: 28,\n borderRadius: 14,\n alignItems: 'center',\n justifyContent: 'center',\n },\n chainIcon: {\n fontSize: 14,\n fontWeight: '700',\n },\n chainText: {\n fontSize: 14,\n color: '#666',\n },\n checkmark: {\n fontSize: 16,\n fontWeight: '700',\n },\n selectedInfo: {\n marginTop: 8,\n paddingVertical: 4,\n },\n selectedText: {\n fontSize: 12,\n color: '#888',\n },\n});\n","/**\n * OneTierSelector - Investment tier selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\nexport interface Tier {\n tier: number;\n amount: number;\n label: string;\n label_zh?: string;\n}\n\nexport interface OneTierSelectorProps {\n /** Available investment tiers */\n tiers: Tier[];\n /** Currently selected tier */\n selectedTier: Tier | null;\n /** Callback when tier selection changes */\n onSelectTier: (tier: Tier) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Show recommended badge on middle tier */\n showRecommended?: boolean;\n /** Recommended label text */\n recommendedLabel?: string;\n /** Use Chinese labels */\n useZhLabels?: boolean;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OneTierSelector: React.FC<OneTierSelectorProps> = ({\n tiers,\n selectedTier,\n onSelectTier,\n accentColor = '#188775',\n title,\n subtitle,\n showRecommended = true,\n recommendedLabel = 'Recommended',\n useZhLabels = false,\n style,\n titleStyle,\n}) => {\n // Middle tier is usually recommended\n const recommendedTierIndex = Math.floor(tiers.length / 2);\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.tiersContainer}>\n {tiers.map((tier, index) => {\n const isSelected = selectedTier?.tier === tier.tier;\n const isRecommended = showRecommended && index === recommendedTierIndex;\n\n return (\n <TouchableOpacity\n key={tier.tier}\n style={[\n styles.tierCard,\n isSelected && styles.tierCardSelected,\n isSelected && { borderColor: accentColor }\n ]}\n onPress={() => onSelectTier(tier)}\n activeOpacity={0.7}\n >\n {isRecommended && (\n <View style={[styles.recommendedBadge, { backgroundColor: accentColor }]}>\n <Text style={styles.recommendedText}>{recommendedLabel}</Text>\n </View>\n )}\n\n <Text style={[\n styles.tierLabel,\n isSelected && { color: accentColor },\n isRecommended && styles.tierLabelWithBadge\n ]}>\n {useZhLabels && tier.label_zh ? tier.label_zh : tier.label}\n </Text>\n\n <Text style={[\n styles.tierAmount,\n isSelected && { color: accentColor }\n ]}>\n ${tier.amount.toLocaleString()}\n </Text>\n\n {isSelected && (\n <View style={[styles.checkCircle, { backgroundColor: accentColor }]}>\n <Text style={styles.checkmark}>✓</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n tiersContainer: {\n flexDirection: 'row',\n gap: 8,\n },\n tierCard: {\n flex: 1,\n padding: 16,\n backgroundColor: '#fff',\n borderRadius: 12,\n borderWidth: 2,\n borderColor: '#e5e5e5',\n alignItems: 'center',\n position: 'relative',\n overflow: 'hidden',\n },\n tierCardSelected: {\n backgroundColor: '#fff',\n },\n tierLabel: {\n fontSize: 12,\n color: '#666',\n marginBottom: 4,\n },\n tierLabelWithBadge: {\n marginTop: 16,\n },\n tierAmount: {\n fontSize: 20,\n fontWeight: '700',\n color: '#1a1a1a',\n },\n checkCircle: {\n position: 'absolute',\n top: -8,\n right: -8,\n width: 28,\n height: 28,\n borderRadius: 14,\n alignItems: 'center',\n justifyContent: 'center',\n },\n checkmark: {\n fontSize: 14,\n fontWeight: '700',\n color: '#fff',\n },\n recommendedBadge: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n paddingVertical: 4,\n alignItems: 'center',\n },\n recommendedText: {\n fontSize: 10,\n fontWeight: '700',\n color: '#fff',\n textTransform: 'uppercase',\n },\n});\n","/**\n * OneCycleSelector - Investment cycle selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\n// Default share rates by cycle (platform takes this percentage)\nexport const DEFAULT_SHARE_RATES: Record<number, number> = {\n 7: 25,\n 14: 22,\n 30: 18,\n 60: 15,\n 90: 12,\n};\n\nexport interface OneCycleSelectorProps {\n /** List of supported cycle days */\n supportedCycles: number[];\n /** Currently selected cycle */\n selectedCycle: number;\n /** Callback when cycle selection changes */\n onSelectCycle: (cycle: number) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Custom share rates by cycle (overrides defaults) */\n shareRates?: Record<number, number>;\n /** Days label */\n daysLabel?: string;\n /** Your share label */\n yourShareLabel?: string;\n /** Platform fee label */\n platformFeeLabel?: string;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OneCycleSelector: React.FC<OneCycleSelectorProps> = ({\n supportedCycles,\n selectedCycle,\n onSelectCycle,\n accentColor = '#188775',\n title,\n subtitle,\n shareRates = DEFAULT_SHARE_RATES,\n daysLabel = 'days',\n yourShareLabel = 'Your share',\n platformFeeLabel = 'Platform fee',\n style,\n titleStyle,\n}) => {\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.cyclesContainer}>\n {supportedCycles.map((cycle) => {\n const isSelected = selectedCycle === cycle;\n const shareRate = shareRates[cycle] || 20;\n const userRate = 100 - shareRate;\n\n return (\n <TouchableOpacity\n key={cycle}\n style={[\n styles.cycleOption,\n isSelected && styles.cycleOptionSelected,\n isSelected && { borderColor: accentColor, backgroundColor: accentColor + '10' }\n ]}\n onPress={() => onSelectCycle(cycle)}\n activeOpacity={0.7}\n >\n <Text style={[\n styles.cycleDays,\n isSelected && { color: accentColor }\n ]}>\n {cycle}\n </Text>\n <Text style={styles.cycleDaysLabel}>{daysLabel}</Text>\n\n <View style={styles.cycleEarnings}>\n <Text style={[\n styles.cycleEarningsValue,\n isSelected && { color: accentColor }\n ]}>\n {userRate}%\n </Text>\n <Text style={styles.cycleEarningsLabel}>{yourShareLabel}</Text>\n </View>\n\n <Text style={styles.cycleFee}>\n {shareRate}% {platformFeeLabel}\n </Text>\n </TouchableOpacity>\n );\n })}\n </View>\n\n <View style={styles.infoBox}>\n <Text style={styles.infoText}>\n Longer cycles = higher user share\n </Text>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n cyclesContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n cycleOption: {\n flex: 1,\n minWidth: '45%',\n padding: 16,\n borderRadius: 12,\n borderWidth: 2,\n borderColor: '#e5e5e5',\n backgroundColor: '#fff',\n alignItems: 'center',\n },\n cycleOptionSelected: {\n borderWidth: 2,\n },\n cycleDays: {\n fontSize: 28,\n fontWeight: '700',\n color: '#1a1a1a',\n },\n cycleDaysLabel: {\n fontSize: 12,\n color: '#666',\n marginBottom: 8,\n },\n cycleEarnings: {\n alignItems: 'center',\n },\n cycleEarningsValue: {\n fontSize: 18,\n fontWeight: '700',\n color: '#10B981',\n },\n cycleEarningsLabel: {\n fontSize: 11,\n color: '#666',\n },\n cycleFee: {\n fontSize: 11,\n color: '#888',\n marginTop: 4,\n },\n infoBox: {\n marginTop: 12,\n padding: 8,\n backgroundColor: '#f5f5f5',\n borderRadius: 8,\n },\n infoText: {\n fontSize: 12,\n color: '#666',\n textAlign: 'center',\n },\n});\n","/**\n * OnePairSelector - Trading pair selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\n// Common trading pairs with icons\nexport const PAIR_ICONS: Record<string, string> = {\n 'BTC/USDT': '₿',\n 'ETH/USDT': 'Ξ',\n 'SOL/USDT': '◎',\n 'BNB/USDT': '◆',\n 'XRP/USDT': '✕',\n 'DOGE/USDT': 'Ð',\n 'ADA/USDT': '◈',\n 'AVAX/USDT': '▲',\n 'DOT/USDT': '●',\n 'MATIC/USDT': '⬡',\n 'LINK/USDT': '◇',\n 'UNI/USDT': '🦄',\n 'ATOM/USDT': '⚛',\n 'LTC/USDT': 'Ł',\n 'ARB/USDT': '◆',\n 'OP/USDT': '◉',\n};\n\nexport interface OnePairSelectorProps {\n /** List of supported trading pairs */\n supportedPairs: string[];\n /** Currently selected pairs */\n selectedPairs: string[];\n /** Callback when pair selection changes */\n onTogglePair: (pair: string) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Minimum required selections */\n minSelections?: number;\n /** Maximum allowed selections (0 = unlimited) */\n maxSelections?: number;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OnePairSelector: React.FC<OnePairSelectorProps> = ({\n supportedPairs,\n selectedPairs,\n onTogglePair,\n accentColor = '#188775',\n title,\n subtitle,\n minSelections = 1,\n maxSelections = 0,\n style,\n titleStyle,\n}) => {\n const handleToggle = (pair: string) => {\n const isSelected = selectedPairs.includes(pair);\n\n // Prevent deselecting below minimum\n if (isSelected && selectedPairs.length <= minSelections) {\n return;\n }\n\n // Prevent selecting above maximum\n if (!isSelected && maxSelections > 0 && selectedPairs.length >= maxSelections) {\n return;\n }\n\n onTogglePair(pair);\n };\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.pairsContainer}>\n {supportedPairs.map((pair) => {\n const isSelected = selectedPairs.includes(pair);\n const icon = PAIR_ICONS[pair] || '●';\n const baseSymbol = pair.split('/')[0];\n\n return (\n <TouchableOpacity\n key={pair}\n style={[\n styles.pairChip,\n isSelected && styles.pairChipSelected,\n isSelected && { backgroundColor: accentColor + '15', borderColor: accentColor }\n ]}\n onPress={() => handleToggle(pair)}\n activeOpacity={0.7}\n >\n <Text style={styles.pairIcon}>{icon}</Text>\n <Text style={[\n styles.pairText,\n isSelected && { color: accentColor, fontWeight: '600' }\n ]}>\n {baseSymbol}\n </Text>\n {isSelected && (\n <Text style={[styles.checkmark, { color: accentColor }]}>✓</Text>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n\n <View style={styles.selectedInfo}>\n <Text style={styles.selectedText}>\n {selectedPairs.length} pair{selectedPairs.length !== 1 ? 's' : ''} selected\n {minSelections > 0 && ` (min: ${minSelections})`}\n {maxSelections > 0 && ` (max: ${maxSelections})`}\n </Text>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n pairsContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n pairChip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: '#fff',\n borderRadius: 8,\n borderWidth: 1,\n borderColor: '#e5e5e5',\n gap: 6,\n },\n pairChipSelected: {\n borderWidth: 2,\n },\n pairIcon: {\n fontSize: 14,\n },\n pairText: {\n fontSize: 14,\n color: '#666',\n },\n checkmark: {\n fontSize: 14,\n fontWeight: '700',\n },\n selectedInfo: {\n marginTop: 8,\n paddingVertical: 4,\n },\n selectedText: {\n fontSize: 12,\n color: '#888',\n },\n});\n","/**\n * OneForexPoolCard - Displays a forex liquidity pool with metrics\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport type { ForexPool } from '../../types/forex';\n\nexport interface OneForexPoolCardProps {\n /** Pool data object */\n pool: ForexPool;\n /** Pool display name (provide translated string) */\n poolName?: string;\n /** Whether to show enhanced metrics (APY, flow, tx count) */\n showMetrics?: boolean;\n /** Custom accent color override */\n accentColor?: string;\n /** Custom container style */\n style?: ViewStyle;\n /** Dark mode */\n dark?: boolean;\n}\n\nexport const OneForexPoolCard: React.FC<OneForexPoolCardProps> = ({\n pool,\n poolName,\n showMetrics = true,\n accentColor,\n style,\n dark = true,\n}) => {\n const color = accentColor || pool.color;\n const bg = dark ? '#111111' : '#ffffff';\n const border = dark ? '#1a1a1a' : '#e5e5e5';\n const textPrimary = dark ? '#ffffff' : '#1a1a1a';\n const textSecondary = dark ? '#9ca3af' : '#666666';\n const textMuted = dark ? '#666666' : '#999999';\n const barBg = dark ? '#1a1a1a' : '#e5e5e5';\n\n return (\n <View style={[styles.container, { backgroundColor: bg, borderColor: border }, style]}>\n <View style={styles.header}>\n <View style={[styles.dot, { backgroundColor: color }]} />\n <Text style={[styles.name, { color: textPrimary }]}>\n {poolName || pool.nameKey}\n </Text>\n <Text style={[styles.alloc, { color: textSecondary }]}>\n {(pool.allocation * 100).toFixed(0)}%\n </Text>\n </View>\n\n <View style={[styles.barOuter, { backgroundColor: barBg }]}>\n <View style={[styles.barFill, { width: `${pool.utilization * 100}%`, backgroundColor: color }]} />\n </View>\n\n <View style={styles.statsRow}>\n <Text style={[styles.statValue, { color: textSecondary }]}>\n ${(pool.totalSize / 1_000_000).toFixed(1)}M\n </Text>\n <Text style={[styles.statLabel, { color: textMuted }]}>\n {(pool.utilization * 100).toFixed(1)}% util\n </Text>\n </View>\n\n {showMetrics && (\n <View style={[styles.metricsRow, { borderTopColor: border }]}>\n <View style={styles.metricItem}>\n <Text style={[styles.metricLabel, { color: textMuted }]}>APY 7d</Text>\n <Text style={[styles.metricValue, { color: '#10B981' }]}>\n {pool.apy7d.toFixed(1)}%\n </Text>\n </View>\n <View style={styles.metricItem}>\n <Text style={[styles.metricLabel, { color: textMuted }]}>24h Flow</Text>\n <Text style={[styles.metricValue, { color: pool.netFlow24h >= 0 ? '#10B981' : '#EF4444' }]}>\n {pool.netFlow24h >= 0 ? '+' : ''}${(pool.netFlow24h / 1000).toFixed(0)}K\n </Text>\n </View>\n <View style={styles.metricItem}>\n <Text style={[styles.metricLabel, { color: textMuted }]}>Txs</Text>\n <Text style={[styles.metricValue, { color: textPrimary }]}>{pool.txCount24h}</Text>\n </View>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { borderRadius: 8, borderWidth: 1, padding: 14 },\n header: { flexDirection: 'row', alignItems: 'center', marginBottom: 8, gap: 8 },\n dot: { width: 8, height: 8, borderRadius: 4 },\n name: { fontSize: 13, fontWeight: '600', flex: 1 },\n alloc: { fontSize: 12 },\n barOuter: { height: 6, borderRadius: 3, overflow: 'hidden', marginBottom: 6 },\n barFill: { height: '100%', borderRadius: 3 },\n statsRow: { flexDirection: 'row', justifyContent: 'space-between' },\n statValue: { fontSize: 12, fontWeight: '600' },\n statLabel: { fontSize: 11 },\n metricsRow: { flexDirection: 'row', justifyContent: 'space-between', paddingTop: 8, marginTop: 8, borderTopWidth: 1 },\n metricItem: { alignItems: 'center', flex: 1 },\n metricLabel: { fontSize: 9, textTransform: 'uppercase', letterSpacing: 0.5, marginBottom: 2 },\n metricValue: { fontSize: 12, fontWeight: '600' },\n});\n","/**\n * OneForexCapitalSplit - Displays 50/50 capital allocation split\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport { FOREX_CAPITAL_SPLIT, FOREX_POOL_DEFAULTS, computePoolAllocations } from '../../types/forex';\n\nexport interface OneForexCapitalSplitProps {\n /** Total investment amount */\n amount: number;\n /** Labels (provide translated strings) */\n labels?: {\n title?: string;\n tradingCapital?: string;\n poolReserves?: string;\n clearing?: string;\n hedging?: string;\n insurance?: string;\n };\n /** Show pool breakdown within reserves */\n showPoolBreakdown?: boolean;\n /** Custom container style */\n style?: ViewStyle;\n /** Dark mode */\n dark?: boolean;\n}\n\nexport const OneForexCapitalSplit: React.FC<OneForexCapitalSplitProps> = ({\n amount,\n labels = {},\n showPoolBreakdown = true,\n style,\n dark = false,\n}) => {\n const allocs = computePoolAllocations(amount);\n const bg = dark ? '#111111' : '#ffffff';\n const border = dark ? '#1a1a1a' : '#e5e5e5';\n const textPrimary = dark ? '#ffffff' : '#1a1a1a';\n const textSecondary = dark ? '#9ca3af' : '#666666';\n const itemBg = dark ? '#0a0a0a' : '#f5f5f5';\n\n return (\n <View style={[styles.container, { backgroundColor: bg, borderColor: border }, style]}>\n {labels.title && <Text style={[styles.title, { color: textPrimary }]}>{labels.title}</Text>}\n\n <View style={styles.splitRow}>\n <View style={[styles.splitItem, { backgroundColor: itemBg }]}>\n <View style={[styles.dot, { backgroundColor: '#0EA5E9' }]} />\n <Text style={[styles.splitLabel, { color: textSecondary }]}>\n {labels.tradingCapital || 'Active Trading (RFQ)'}\n </Text>\n <Text style={[styles.splitPct, { color: textSecondary }]}>50%</Text>\n <Text style={[styles.splitAmt, { color: textPrimary }]}>\n ${allocs.tradingCapital.toLocaleString()}\n </Text>\n </View>\n <View style={[styles.splitItem, { backgroundColor: itemBg }]}>\n <View style={[styles.dot, { backgroundColor: '#8B5CF6' }]} />\n <Text style={[styles.splitLabel, { color: textSecondary }]}>\n {labels.poolReserves || 'Pool Reserves'}\n </Text>\n <Text style={[styles.splitPct, { color: textSecondary }]}>50%</Text>\n <Text style={[styles.splitAmt, { color: textPrimary }]}>\n ${allocs.totalPoolReserves.toLocaleString()}\n </Text>\n </View>\n </View>\n\n {showPoolBreakdown && amount > 0 && (\n <View style={[styles.breakdown, { borderTopColor: border }]}>\n {FOREX_POOL_DEFAULTS.map(pool => {\n const poolAmt = allocs[pool.id as keyof typeof allocs] as number;\n return (\n <View key={pool.id} style={styles.poolRow}>\n <View style={[styles.poolDot, { backgroundColor: pool.color }]} />\n <Text style={[styles.poolName, { color: textSecondary }]}>\n {(labels as any)?.[pool.id] || pool.nameKey}\n </Text>\n <View style={[styles.poolBar, { backgroundColor: dark ? '#1a1a1a' : '#e5e5e5' }]}>\n <View style={[styles.poolBarFill, { width: `${pool.allocation * 100}%`, backgroundColor: pool.color }]} />\n </View>\n <Text style={[styles.poolAmt, { color: textPrimary }]}>\n ${poolAmt.toLocaleString()}\n </Text>\n </View>\n );\n })}\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { borderRadius: 8, borderWidth: 1, padding: 14 },\n title: { fontSize: 14, fontWeight: '600', marginBottom: 12 },\n splitRow: { gap: 8 },\n splitItem: { flexDirection: 'row', alignItems: 'center', paddingVertical: 10, paddingHorizontal: 12, borderRadius: 8 },\n dot: { width: 10, height: 10, borderRadius: 5, marginRight: 8 },\n splitLabel: { flex: 1, fontSize: 13, fontWeight: '500' },\n splitPct: { fontSize: 12, fontWeight: '600', marginRight: 12 },\n splitAmt: { fontSize: 14, fontWeight: '700' },\n breakdown: { marginTop: 12, paddingTop: 12, borderTopWidth: 1 },\n poolRow: { flexDirection: 'row', alignItems: 'center', marginBottom: 8 },\n poolDot: { width: 8, height: 8, borderRadius: 4, marginRight: 8 },\n poolName: { width: 80, fontSize: 12 },\n poolBar: { flex: 1, height: 6, borderRadius: 3, overflow: 'hidden', marginHorizontal: 8 },\n poolBarFill: { height: '100%', borderRadius: 3 },\n poolAmt: { width: 70, fontSize: 12, fontWeight: '600', textAlign: 'right' },\n});\n","/**\n * OneForexConsoleView - Displays live forex trading console log feed\n * Part of ONE Ecosystem SDK\n */\n\nimport React, { useRef, useEffect } from 'react';\nimport { View, Text, StyleSheet, ScrollView, ViewStyle, Platform } from 'react-native';\nimport type { ForexLogEntry } from '../../types/forex';\nimport { FOREX_LOG_COLORS } from '../../types/console';\n\nconst MONO = Platform.OS === 'ios' ? 'Courier New' : 'monospace';\n\nexport interface OneForexConsoleViewProps {\n /** Array of log entries to display */\n logs: ForexLogEntry[];\n /** Maximum visible entries */\n maxItems?: number;\n /** Auto-scroll to bottom */\n autoScroll?: boolean;\n /** Custom container style */\n style?: ViewStyle;\n /** Console height */\n height?: number;\n}\n\nexport const OneForexConsoleView: React.FC<OneForexConsoleViewProps> = ({\n logs,\n maxItems = 100,\n autoScroll = true,\n style,\n height = 400,\n}) => {\n const scrollRef = useRef<ScrollView>(null);\n const visibleLogs = logs.slice(-maxItems);\n\n useEffect(() => {\n if (autoScroll && scrollRef.current) {\n setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 50);\n }\n }, [logs.length, autoScroll]);\n\n const formatTime = (ts: number) => {\n const d = new Date(ts);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}:${d.getSeconds().toString().padStart(2, '0')}`;\n };\n\n return (\n <View style={[styles.container, { height }, style]}>\n <ScrollView ref={scrollRef} style={styles.scroll} contentContainerStyle={styles.scrollContent}>\n {visibleLogs.map((log) => (\n <View key={log.id} style={styles.logRow}>\n <Text style={styles.timestamp}>{formatTime(log.timestamp)}</Text>\n <Text style={[styles.type, { color: FOREX_LOG_COLORS[log.type] || '#9CA3AF' }]}>\n {log.type.padEnd(8)}\n </Text>\n <Text style={[\n styles.message,\n log.importance === 'high' && styles.messageHigh,\n ]} numberOfLines={2}>\n {log.message}\n </Text>\n </View>\n ))}\n {visibleLogs.length === 0 && (\n <Text style={styles.emptyText}>Waiting for trading activity...</Text>\n )}\n </ScrollView>\n </View>\n );\n};\n\n// Terminal palette – always dark regardless of app theme\nconst T = {\n base: '#0A0A0C',\n border: '#2A2A35',\n muted: '#555560',\n secondary: '#9CA3AF',\n};\n\nconst styles = StyleSheet.create({\n container: { backgroundColor: T.base, borderRadius: 8, borderWidth: 1, borderColor: T.border, overflow: 'hidden' },\n scroll: { flex: 1 },\n scrollContent: { padding: 8 },\n logRow: { flexDirection: 'row', paddingVertical: 3 },\n timestamp: { fontFamily: MONO, fontSize: 10, color: T.muted, width: 60, marginRight: 6 },\n type: { fontFamily: MONO, fontSize: 10, fontWeight: '700', width: 65, marginRight: 6 },\n message: { fontFamily: MONO, fontSize: 10, color: T.secondary, flex: 1 },\n messageHigh: { color: '#ffffff', fontWeight: '600' },\n emptyText: { fontFamily: MONO, fontSize: 11, color: T.muted, textAlign: 'center', paddingVertical: 40 },\n});\n","/**\n * OneForexPairSelector - Stablecoin FX pair selection for forex trading\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle } from 'react-native';\nimport { FOREX_CURRENCY_PAIRS } from '../../types/forex';\nimport type { ForexCurrencyPair } from '../../types/forex';\n\nexport interface OneForexPairSelectorProps {\n /** Currently selected pair IDs */\n selectedPairs: string[];\n /** Callback when a pair is toggled */\n onTogglePair: (pairId: string) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Custom pairs list (defaults to FOREX_CURRENCY_PAIRS) */\n pairs?: ForexCurrencyPair[];\n /** Custom container style */\n style?: ViewStyle;\n}\n\nexport const OneForexPairSelector: React.FC<OneForexPairSelectorProps> = ({\n selectedPairs,\n onTogglePair,\n accentColor = '#0EA5E9',\n title,\n subtitle,\n pairs = FOREX_CURRENCY_PAIRS,\n style,\n}) => {\n const handleToggle = (pairId: string) => {\n if (selectedPairs.includes(pairId) && selectedPairs.length <= 1) return;\n onTogglePair(pairId);\n };\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={styles.title}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.pairGrid}>\n {pairs.map((pair) => {\n const isSelected = selectedPairs.includes(pair.id);\n return (\n <TouchableOpacity\n key={pair.id}\n style={[\n styles.pairBtn,\n isSelected && styles.pairBtnActive,\n isSelected && { borderColor: accentColor, backgroundColor: accentColor + '08' },\n ]}\n onPress={() => handleToggle(pair.id)}\n activeOpacity={0.7}\n >\n <Text style={styles.pairFlag}>{pair.flag}</Text>\n <View style={styles.pairInfo}>\n <Text style={[styles.pairSymbol, isSelected && { color: accentColor, fontWeight: '600' }]}>\n {pair.symbol}\n </Text>\n <Text style={styles.pairName}>{pair.name}</Text>\n </View>\n {isSelected && (\n <Text style={[styles.check, { color: accentColor }]}>{'\\u2713'}</Text>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n\n <Text style={styles.selectedInfo}>\n {selectedPairs.length} pair{selectedPairs.length !== 1 ? 's' : ''} selected (min: 1)\n </Text>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { marginBottom: 16 },\n title: { fontSize: 16, fontWeight: '600', color: '#1a1a1a', marginBottom: 4 },\n subtitle: { fontSize: 12, color: '#666', marginBottom: 12 },\n pairGrid: { gap: 8 },\n pairBtn: {\n flexDirection: 'row', alignItems: 'center',\n paddingHorizontal: 12, paddingVertical: 12,\n borderRadius: 8, borderWidth: 1.5, borderColor: '#e5e5e5',\n backgroundColor: '#fff', gap: 10,\n },\n pairBtnActive: { borderWidth: 2 },\n pairFlag: { fontSize: 20 },\n pairInfo: { flex: 1 },\n pairSymbol: { fontSize: 14, color: '#666' },\n pairName: { fontSize: 11, color: '#999' },\n check: { fontSize: 16, fontWeight: '700' },\n selectedInfo: { fontSize: 12, color: '#888', marginTop: 8 },\n});\n","/**\n * OneForexTradeHistory - Displays trade history with settlement details\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, ScrollView, ViewStyle, Platform } from 'react-native';\nimport type { ForexTradeRecord } from '../../types/forex';\n\nconst MONO = Platform.OS === 'ios' ? 'Courier New' : 'monospace';\n\nexport interface OneForexTradeHistoryProps {\n /** Trade records to display */\n trades: ForexTradeRecord[];\n /** Maximum trades to show */\n maxItems?: number;\n /** Show settlement details (clearing/hedging/insurance fees) */\n showSettlementDetails?: boolean;\n /** Show transaction hash */\n showTxHash?: boolean;\n /** Empty state text */\n emptyText?: string;\n /** Custom container style */\n style?: ViewStyle;\n}\n\nexport const OneForexTradeHistory: React.FC<OneForexTradeHistoryProps> = ({\n trades,\n maxItems = 50,\n showSettlementDetails = true,\n showTxHash = true,\n emptyText = 'No trade history yet',\n style,\n}) => {\n const visibleTrades = trades.slice(-maxItems).reverse();\n\n if (visibleTrades.length === 0) {\n return (\n <View style={[styles.empty, style]}>\n <Text style={styles.emptyText}>{emptyText}</Text>\n </View>\n );\n }\n\n return (\n <ScrollView style={[styles.container, style]} contentContainerStyle={styles.scrollContent}>\n {visibleTrades.map((trade) => (\n <View key={trade.id} style={styles.card}>\n <View style={styles.header}>\n <Text style={styles.pair}>{trade.pairSymbol}</Text>\n <View style={[\n styles.sideBadge,\n { backgroundColor: trade.side === 'BUY' ? '#10B98118' : '#EF444418', borderColor: trade.side === 'BUY' ? '#10B98140' : '#EF444440' },\n ]}>\n <Text style={[styles.sideText, { color: trade.side === 'BUY' ? '#10B981' : '#EF4444' }]}>\n {trade.side}\n </Text>\n </View>\n <Text style={[styles.pnl, { color: trade.pnl >= 0 ? '#10B981' : '#EF4444' }]}>\n {trade.pnl >= 0 ? '+' : ''}${trade.pnl.toFixed(2)}\n </Text>\n </View>\n\n <View style={styles.details}>\n <Text style={styles.detail}>\n {trade.lots.toFixed(2)} lots | {trade.pips >= 0 ? '+' : ''}{trade.pips.toFixed(1)} pips\n </Text>\n <Text style={styles.time}>{new Date(trade.timestamp).toLocaleString()}</Text>\n </View>\n\n {showSettlementDetails && trade.clearingFee !== undefined && (\n <View style={styles.settlement}>\n <Text style={styles.settlementText}>\n CLR: ${trade.clearingFee.toFixed(2)} | HDG: ${(trade.hedgingCost || 0).toFixed(2)} | INS: ${(trade.insuranceReserve || 0).toFixed(2)}\n </Text>\n </View>\n )}\n\n {showTxHash && trade.txHash && (\n <Text style={styles.txHash}>\n {trade.txHash.slice(0, 10)}...{trade.txHash.slice(-6)}\n </Text>\n )}\n </View>\n ))}\n </ScrollView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n scrollContent: { paddingBottom: 16 },\n empty: { alignItems: 'center', justifyContent: 'center', padding: 40 },\n emptyText: { fontSize: 14, color: '#666' },\n card: { backgroundColor: '#111111', borderRadius: 6, borderWidth: 1, borderColor: '#1a1a1a', padding: 12, marginBottom: 8 },\n header: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n pair: { fontSize: 13, fontWeight: '600', color: '#ffffff' },\n sideBadge: { paddingHorizontal: 6, paddingVertical: 2, borderRadius: 3, borderWidth: 1 },\n sideText: { fontSize: 9, fontWeight: '700', letterSpacing: 0.5 },\n pnl: { fontFamily: MONO, marginLeft: 'auto', fontSize: 13, fontWeight: '700' },\n details: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 6 },\n detail: { fontFamily: MONO, fontSize: 11, color: '#9ca3af' },\n time: { fontSize: 11, color: '#666' },\n settlement: { marginTop: 6, paddingTop: 6, borderTopWidth: 1, borderTopColor: '#1a1a1a' },\n settlementText: { fontFamily: MONO, fontSize: 10, color: '#666' },\n txHash: { fontFamily: MONO, fontSize: 9, color: '#444', marginTop: 2 },\n});\n","/**\n * ONE SDK - Forex Trading Hooks\n * Provides React hooks for StableFX on-chain forex trading integration\n * Can be used by any ecosystem partner\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type {\n ForexPool,\n ForexPoolType,\n ForexInvestment,\n ForexLogEntry,\n ForexPoolTransaction,\n ForexPoolDailySnapshot,\n ForexTradeRecord,\n} from '../types/forex';\nimport {\n FOREX_POOL_DEFAULTS,\n FOREX_CYCLE_OPTIONS,\n FOREX_AGENT,\n FOREX_CAPITAL_SPLIT,\n computePoolAllocations,\n estimateForexProfit,\n} from '../types/forex';\n\n// ── Configuration ────────────────────────────────────────────────────────────\n\nlet _forexAccessToken: string | null = null;\nlet _forexEngineUrl: string = 'https://api.one23.io';\n\n/** Set the access token for authenticated forex API calls */\nexport function setForexAccessToken(token: string): void {\n _forexAccessToken = token;\n}\n\n/** Clear the forex access token */\nexport function clearForexAccessToken(): void {\n _forexAccessToken = null;\n}\n\n/** Configure the engine URL for forex API calls */\nexport function setForexEngineUrl(url: string): void {\n _forexEngineUrl = url;\n}\n\n// ── Internal API Helper ──────────────────────────────────────────────────────\n\nasync function forexApi<T>(path: string, options?: RequestInit): Promise<T | null> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (_forexAccessToken) {\n headers['Authorization'] = `Bearer ${_forexAccessToken}`;\n }\n const res = await fetch(`${_forexEngineUrl}${path}`, { ...options, headers });\n if (!res.ok) return null;\n const json = await res.json();\n return json?.data ?? json;\n } catch {\n return null;\n }\n}\n\n// ── useForexPools ────────────────────────────────────────────────────────────\n\nexport interface UseForexPoolsResult {\n pools: ForexPool[];\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\nexport function useForexPools(options?: { refreshInterval?: number }): UseForexPoolsResult {\n const [pools, setPools] = useState<ForexPool[]>(FOREX_POOL_DEFAULTS);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPools = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ pools: any[] }>('/api/forex/pools');\n if (data?.pools) {\n setPools(data.pools.map((p: any) => ({\n id: p.type ?? p.id,\n nameKey: `forex.pool_${p.type ?? p.id}`,\n descriptionKey: `forex.pool_${p.type ?? p.id}_desc`,\n allocation: p.allocation ?? (p.type === 'clearing' ? 0.50 : p.type === 'hedging' ? 0.30 : 0.20),\n totalSize: p.totalSize ?? p.total_size ?? 0,\n utilization: p.utilization ?? 0,\n color: p.type === 'clearing' ? '#3B82F6' : p.type === 'hedging' ? '#F59E0B' : '#10B981',\n apy7d: p.apy7d ?? 0,\n apy30d: p.apy30d ?? 0,\n netFlow24h: p.netFlow24h ?? 0,\n txCount24h: p.txCount24h ?? 0,\n txCountTotal: p.txCountTotal ?? 0,\n totalDeposits: p.totalDeposits ?? 0,\n totalWithdrawals: p.totalWithdrawals ?? 0,\n profitDistributed: p.profitDistributed ?? 0,\n lastUpdated: p.lastUpdated ?? Date.now(),\n })));\n }\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch pools');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchPools();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchPools, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchPools, options?.refreshInterval]);\n\n return { pools, isLoading, error, refresh: fetchPools };\n}\n\n// ── useForexInvestments ──────────────────────────────────────────────────────\n\nexport interface UseForexInvestmentsResult {\n investments: ForexInvestment[];\n isLoading: boolean;\n error: string | null;\n createInvestment: (params: { amount: number; selectedPairs: string[]; cycleDays: number }) => Promise<ForexInvestment | null>;\n redeemInvestment: (investmentId: string) => Promise<boolean>;\n refresh: () => void;\n portfolioSummary: {\n totalInvested: number;\n totalValue: number;\n totalProfit: number;\n activeCount: number;\n };\n}\n\nexport function useForexInvestments(options?: { refreshInterval?: number }): UseForexInvestmentsResult {\n const [investments, setInvestments] = useState<ForexInvestment[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchInvestments = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investments: any[] }>('/api/forex/investments');\n if (data?.investments) {\n setInvestments(data.investments.map(mapInvestment));\n }\n setError(null);\n } catch {\n setError('Failed to fetch investments');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const createInvestment = useCallback(async (params: {\n amount: number; selectedPairs: string[]; cycleDays: number;\n }): Promise<ForexInvestment | null> => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investment: any }>('/api/forex/investments', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n if (data?.investment) {\n const inv = mapInvestment(data.investment);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n }\n // Local fallback\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } catch {\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const redeemInvestment = useCallback(async (investmentId: string): Promise<boolean> => {\n try {\n await forexApi(`/api/forex/investments/${investmentId}/redeem`, { method: 'POST' });\n setInvestments(prev => prev.map(inv =>\n inv.id === investmentId ? { ...inv, status: 'redeemed' as const } : inv\n ));\n return true;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n fetchInvestments();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchInvestments, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchInvestments, options?.refreshInterval]);\n\n const portfolioSummary = useMemo(() => {\n const active = investments.filter(i => i.status === 'active');\n return {\n totalInvested: active.reduce((s, i) => s + i.amount, 0),\n totalValue: active.reduce((s, i) => s + i.currentValue, 0),\n totalProfit: active.reduce((s, i) => s + i.profit, 0),\n activeCount: active.length,\n };\n }, [investments]);\n\n return { investments, isLoading, error, createInvestment, redeemInvestment, refresh: fetchInvestments, portfolioSummary };\n}\n\n// ── useForexSimulation ───────────────────────────────────────────────────────\n\nexport interface UseForexSimulationResult {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n isRunning: boolean;\n stats: { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number };\n start: () => void;\n stop: () => void;\n clearLogs: () => void;\n}\n\nexport function useForexSimulation(options?: { maxLogs?: number }): UseForexSimulationResult {\n const maxLogs = options?.maxLogs ?? 500;\n const [logs, setLogs] = useState<ForexLogEntry[]>([]);\n const [poolTxs, setPoolTxs] = useState<ForexPoolTransaction[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [stats, setStats] = useState({ totalPnl: 0, totalTrades: 0, totalPips: 0, totalLots: 0 });\n const engineRef = useRef<any>(null);\n\n const getEngine = useCallback(() => {\n if (!engineRef.current) {\n try {\n const { forexSimulationEngine } = require('../services/forex/ForexSimulationEngine');\n engineRef.current = forexSimulationEngine;\n } catch { /* not available */ }\n }\n return engineRef.current;\n }, []);\n\n const start = useCallback(() => {\n const engine = getEngine();\n if (!engine) return;\n if (!engine.isRunning()) engine.start();\n setIsRunning(true);\n }, [getEngine]);\n\n const stop = useCallback(() => {\n const engine = getEngine();\n if (engine) engine.stop();\n setIsRunning(false);\n }, [getEngine]);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n setPoolTxs([]);\n }, []);\n\n useEffect(() => {\n const engine = getEngine();\n if (!engine) return;\n\n const unsubLog = engine.onLog((entry: ForexLogEntry) => {\n setLogs(prev => {\n const next = [...prev, entry];\n return next.length > maxLogs ? next.slice(-maxLogs) : next;\n });\n const s = engine.getStats();\n setStats({ totalPnl: s.totalPnl, totalTrades: s.totalTrades, totalPips: s.totalPips, totalLots: s.totalLots });\n });\n\n const unsubTx = engine.onPoolTransaction((tx: ForexPoolTransaction) => {\n setPoolTxs(prev => [...prev.slice(-999), tx]);\n });\n\n return () => {\n unsubLog();\n unsubTx();\n };\n }, [getEngine, maxLogs]);\n\n return { logs, poolTransactions: poolTxs, isRunning, stats, start, stop, clearLogs };\n}\n\n// ── useForexPoolData ─────────────────────────────────────────────────────────\n\nexport interface UseForexPoolDataResult {\n snapshots: Record<ForexPoolType, ForexPoolDailySnapshot[]>;\n transactions: ForexPoolTransaction[];\n isInitialized: boolean;\n initialize: () => void;\n}\n\nexport function useForexPoolData(): UseForexPoolDataResult {\n const [snapshots, setSnapshots] = useState<Record<ForexPoolType, ForexPoolDailySnapshot[]>>({ clearing: [], hedging: [], insurance: [] });\n const [transactions, setTransactions] = useState<ForexPoolTransaction[]>([]);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const initialize = useCallback(() => {\n if (isInitialized) return;\n try {\n const { ForexPoolDataGenerator } = require('../services/forex/ForexPoolDataGenerator');\n const gen = ForexPoolDataGenerator.getInstance();\n setSnapshots(gen.generateAllSnapshots());\n setTransactions(gen.generateAllTransactions());\n setIsInitialized(true);\n } catch { /* not available */ }\n }, [isInitialized]);\n\n return { snapshots, transactions, isInitialized, initialize };\n}\n\n// ── Combined useForexTrading ─────────────────────────────────────────────────\n\nexport interface UseForexTradingResult {\n pools: UseForexPoolsResult;\n investments: UseForexInvestmentsResult;\n simulation: UseForexSimulationResult;\n poolData: UseForexPoolDataResult;\n // Convenience re-exports\n capitalSplit: typeof FOREX_CAPITAL_SPLIT;\n agent: typeof FOREX_AGENT;\n currencyPairs: typeof import('../types/forex').FOREX_CURRENCY_PAIRS;\n cycleOptions: typeof import('../types/forex').FOREX_CYCLE_OPTIONS;\n computePoolAllocations: typeof computePoolAllocations;\n estimateProfit: typeof estimateForexProfit;\n}\n\nexport function useForexTrading(options?: {\n poolRefreshInterval?: number;\n investmentRefreshInterval?: number;\n}): UseForexTradingResult {\n const pools = useForexPools({ refreshInterval: options?.poolRefreshInterval });\n const investments = useForexInvestments({ refreshInterval: options?.investmentRefreshInterval });\n const simulation = useForexSimulation();\n const poolData = useForexPoolData();\n\n return {\n pools,\n investments,\n simulation,\n poolData,\n capitalSplit: FOREX_CAPITAL_SPLIT,\n agent: FOREX_AGENT,\n currencyPairs: require('../types/forex').FOREX_CURRENCY_PAIRS,\n cycleOptions: require('../types/forex').FOREX_CYCLE_OPTIONS,\n computePoolAllocations,\n estimateProfit: estimateForexProfit,\n };\n}\n\n// ── Internal Helpers ─────────────────────────────────────────────────────────\n\nfunction mapInvestment(raw: any): ForexInvestment {\n const cycleDays = raw.cycleDays ?? raw.cycle_days ?? 90;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const amount = typeof raw.amount === 'string' ? parseFloat(raw.amount) : (raw.amount ?? 0);\n const allocs = computePoolAllocations(amount);\n\n return {\n id: raw.id,\n userId: raw.userId ?? raw.user_id,\n amount,\n currentValue: raw.currentValue ?? raw.current_value ?? amount,\n profit: raw.profit ?? 0,\n status: raw.status ?? 'active',\n selectedPairs: raw.selectedPairs ?? raw.selected_pairs ?? [],\n cycleDays,\n cycleOption,\n feeRate: raw.feeRate ?? cycleOption.feeRate,\n commissionRate: raw.commissionRate ?? cycleOption.commissionRate,\n startDate: raw.startDate ?? raw.start_date ?? new Date().toISOString(),\n endDate: raw.endDate ?? raw.end_date ?? '',\n tradingCapital: raw.tradingCapital ?? allocs.tradingCapital,\n totalPoolReserves: raw.totalPoolReserves ?? allocs.totalPoolReserves,\n poolAllocations: raw.poolAllocations ?? {\n clearing: allocs.clearing,\n hedging: allocs.hedging,\n insurance: allocs.insurance,\n },\n tradeWeight: raw.tradeWeight ?? 0,\n totalLots: raw.totalLots ?? 0,\n totalPips: raw.totalPips ?? 0,\n totalTrades: raw.totalTrades ?? 0,\n positions: raw.positions ?? [],\n tradeHistory: raw.tradeHistory ?? [],\n redeemedAt: raw.redeemedAt,\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt,\n };\n}\n\nfunction createLocalInvestment(params: { amount: number; selectedPairs: string[]; cycleDays: number }): ForexInvestment {\n const { amount, selectedPairs, cycleDays } = params;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const allocs = computePoolAllocations(amount);\n const now = new Date();\n const endDate = new Date(now);\n endDate.setDate(endDate.getDate() + cycleDays);\n\n return {\n id: `fx_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n amount,\n currentValue: amount,\n profit: 0,\n status: 'active',\n selectedPairs,\n cycleDays,\n cycleOption,\n startDate: now.toISOString(),\n endDate: endDate.toISOString(),\n tradingCapital: allocs.tradingCapital,\n totalPoolReserves: allocs.totalPoolReserves,\n poolAllocations: { clearing: allocs.clearing, hedging: allocs.hedging, insurance: allocs.insurance },\n tradeWeight: 0,\n totalLots: 0,\n totalPips: 0,\n totalTrades: 0,\n positions: [],\n tradeHistory: [],\n };\n}\n","/**\n * ONE SDK - React Native Entry Point\n *\n * This file exports SDK features optimized for React Native usage.\n * It excludes web-specific features and includes mobile-specific utilities.\n */\n\n// ===== Configuration =====\nexport { initOneSDK, getConfig, CHAIN_CONFIGS, TOKEN_NAMES, COINGECKO_IDS } from './config';\nexport type { OneConfig } from './config';\n\n// ===== Types =====\nexport * from './types';\n\n// ===== ONE Engine Client =====\nimport { OneEngineClient as _OneEngineClient, createOneEngineClient } from './services/engine';\nexport { _OneEngineClient as OneEngineClient, createOneEngineClient };\n\nexport type {\n EngineAuthResponse,\n EngineWalletBalance,\n EngineTransactionRequest,\n EngineTransactionResponse,\n OnrampSessionRequest,\n OnrampSession,\n OnrampQuote,\n OnrampTransaction,\n SwapQuoteRequest,\n SwapQuote,\n SwapExecuteRequest,\n SwapResult,\n} from './services/engine';\n\n// ===== Price Service =====\nexport { PriceService, priceService } from './services/price';\n\n// ===== Utilities =====\nexport {\n // Address\n shortenAddress,\n isValidAddress,\n checksumAddress,\n // Numbers\n formatNumber,\n formatUSD,\n formatPercent,\n formatTokenAmount,\n // Date/Time\n formatDate,\n formatDateTime,\n formatRelativeTime,\n // Validation\n isValidEmail,\n isValidPhone,\n // Strings\n capitalize,\n truncate,\n slugify,\n // Async\n sleep,\n retry,\n // Objects\n omit,\n pick,\n // Errors\n OneSDKError,\n isOneSDKError,\n} from './utils';\n\n// ===== AI Trading Components =====\n// React Native components for AI trading integration\nexport {\n OneChainSelector,\n CHAIN_CONFIG,\n} from './components/ai/OneChainSelector';\nexport type { OneChainSelectorProps } from './components/ai/OneChainSelector';\n\nexport { OneTierSelector } from './components/ai/OneTierSelector';\nexport type { OneTierSelectorProps, Tier } from './components/ai/OneTierSelector';\n\nexport {\n OneCycleSelector,\n DEFAULT_SHARE_RATES,\n} from './components/ai/OneCycleSelector';\nexport type { OneCycleSelectorProps } from './components/ai/OneCycleSelector';\n\nexport {\n OnePairSelector,\n PAIR_ICONS,\n} from './components/ai/OnePairSelector';\nexport type { OnePairSelectorProps } from './components/ai/OnePairSelector';\n\n// ===== StableFX Forex Components =====\nexport { OneForexPoolCard } from './components/ai/OneForexPoolCard';\nexport type { OneForexPoolCardProps } from './components/ai/OneForexPoolCard';\n\nexport { OneForexCapitalSplit } from './components/ai/OneForexCapitalSplit';\nexport type { OneForexCapitalSplitProps } from './components/ai/OneForexCapitalSplit';\n\nexport { OneForexConsoleView } from './components/ai/OneForexConsoleView';\nexport type { OneForexConsoleViewProps } from './components/ai/OneForexConsoleView';\n\nexport { OneForexPairSelector } from './components/ai/OneForexPairSelector';\nexport type { OneForexPairSelectorProps } from './components/ai/OneForexPairSelector';\n\nexport { OneForexTradeHistory } from './components/ai/OneForexTradeHistory';\nexport type { OneForexTradeHistoryProps } from './components/ai/OneForexTradeHistory';\n\n// ===== Forex Hooks =====\nexport {\n useForexPools,\n useForexInvestments,\n useForexSimulation,\n useForexPoolData,\n useForexTrading,\n setForexAccessToken,\n clearForexAccessToken,\n setForexEngineUrl,\n} from './hooks/useForexTrading';\n\nexport type {\n UseForexPoolsResult,\n UseForexInvestmentsResult,\n UseForexSimulationResult,\n UseForexPoolDataResult,\n UseForexTradingResult,\n} from './hooks/useForexTrading';\n\n// ===== Forex Services =====\nexport { forexSimulationEngine } from './services/forex/ForexSimulationEngine';\nexport { ForexPoolDataGenerator } from './services/forex/ForexPoolDataGenerator';\nexport { botSimulationEngine } from './services/forex/BotSimulationEngine';\n\n// ===== React Native Specific Utilities =====\n\n/**\n * Storage adapter interface for React Native\n * Implement this with AsyncStorage or other storage solutions\n */\nexport interface StorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Create a cached engine client with persistent storage\n */\nexport function createCachedEngineClient(\n storage: StorageAdapter,\n options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n }\n) {\n const client = createOneEngineClient(options);\n\n // Wrapper with token persistence\n return {\n ...client,\n\n /**\n * Initialize with stored token\n */\n async initialize(): Promise<boolean> {\n const token = await storage.getItem('one_access_token');\n if (token) {\n client.setAccessToken(token);\n return true;\n }\n return false;\n },\n\n /**\n * Login and persist token\n */\n async login(email: string, otp: string) {\n const result = await client.verifyEmailOtp(email, otp);\n if (result.success && result.data?.accessToken) {\n await storage.setItem('one_access_token', result.data.accessToken);\n if (result.data.refreshToken) {\n await storage.setItem('one_refresh_token', result.data.refreshToken);\n }\n }\n return result;\n },\n\n /**\n * Logout and clear stored tokens\n */\n async logout() {\n await client.signOut();\n await storage.removeItem('one_access_token');\n await storage.removeItem('one_refresh_token');\n client.clearAccessToken();\n },\n\n /**\n * Refresh token from storage\n */\n async refreshFromStorage() {\n const refreshToken = await storage.getItem('one_refresh_token');\n if (refreshToken) {\n const result = await client.refreshToken(refreshToken);\n if (result.success && result.data?.accessToken) {\n await storage.setItem('one_access_token', result.data.accessToken);\n if (result.data.refreshToken) {\n await storage.setItem('one_refresh_token', result.data.refreshToken);\n }\n return true;\n }\n }\n return false;\n },\n\n // Expose underlying client\n getClient: () => client,\n };\n}\n\n/**\n * Deep linking handler for ONE SDK\n */\nexport interface DeepLinkHandler {\n /**\n * Parse deep link URL\n */\n parse(url: string): {\n type: 'onramp_callback' | 'wallet_connect' | 'payment' | 'unknown';\n params: Record<string, string>;\n };\n\n /**\n * Generate deep link URL\n */\n generate(type: string, params: Record<string, string>): string;\n}\n\nexport function createDeepLinkHandler(scheme: string = 'onewallet'): DeepLinkHandler {\n return {\n parse(url: string) {\n try {\n const urlObj = new URL(url);\n const path = urlObj.pathname.replace(/^\\//, '');\n const params: Record<string, string> = {};\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n let type: 'onramp_callback' | 'wallet_connect' | 'payment' | 'unknown' = 'unknown';\n\n if (path.includes('onramp') || path.includes('callback')) {\n type = 'onramp_callback';\n } else if (path.includes('wc') || path.includes('walletconnect')) {\n type = 'wallet_connect';\n } else if (path.includes('pay') || path.includes('payment')) {\n type = 'payment';\n }\n\n return { type, params };\n } catch {\n return { type: 'unknown', params: {} };\n }\n },\n\n generate(type: string, params: Record<string, string>): string {\n const searchParams = new URLSearchParams(params);\n return `${scheme}://${type}?${searchParams.toString()}`;\n },\n };\n}\n\n/**\n * Biometric authentication helper types\n */\nexport interface BiometricConfig {\n promptMessage: string;\n cancelButtonText?: string;\n fallbackLabel?: string;\n}\n\nexport interface BiometricResult {\n success: boolean;\n error?: string;\n}\n\n/**\n * QR Code scanning result types\n */\nexport interface QRScanResult {\n type: 'address' | 'wallet_connect' | 'payment_request' | 'unknown';\n data: string;\n parsed?: {\n address?: string;\n chainId?: number;\n amount?: string;\n token?: string;\n message?: string;\n };\n}\n\n/**\n * Parse QR code data for wallet operations\n */\nexport function parseQRCode(data: string): QRScanResult {\n // Ethereum address\n if (/^0x[a-fA-F0-9]{40}$/.test(data)) {\n return {\n type: 'address',\n data,\n parsed: { address: data },\n };\n }\n\n // EIP-681 payment request (ethereum:0x...?value=...&token=...)\n if (data.startsWith('ethereum:')) {\n const match = data.match(/^ethereum:(0x[a-fA-F0-9]{40})(?:@(\\d+))?(?:\\?(.*))?$/);\n if (match) {\n const [, address, chainId, queryString] = match;\n const params = new URLSearchParams(queryString || '');\n return {\n type: 'payment_request',\n data,\n parsed: {\n address,\n chainId: chainId ? parseInt(chainId) : undefined,\n amount: params.get('value') || undefined,\n token: params.get('token') || undefined,\n message: params.get('message') || undefined,\n },\n };\n }\n }\n\n // WalletConnect URI\n if (data.startsWith('wc:')) {\n return {\n type: 'wallet_connect',\n data,\n };\n }\n\n return { type: 'unknown', data };\n}\n\n/**\n * Format crypto amount for display on mobile\n */\nexport function formatCryptoAmount(\n amount: number | string,\n symbol: string,\n options: {\n maxDecimals?: number;\n showSymbol?: boolean;\n compact?: boolean;\n } = {}\n): string {\n const { maxDecimals = 6, showSymbol = true, compact = false } = options;\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n\n if (isNaN(num)) return showSymbol ? `0 ${symbol}` : '0';\n\n let formatted: string;\n\n if (compact && num >= 1000000) {\n formatted = (num / 1000000).toFixed(2) + 'M';\n } else if (compact && num >= 1000) {\n formatted = (num / 1000).toFixed(2) + 'K';\n } else if (num < 0.000001 && num > 0) {\n formatted = '<0.000001';\n } else {\n const decimals = num < 1 ? maxDecimals : Math.min(maxDecimals, 4);\n formatted = num.toFixed(decimals).replace(/\\.?0+$/, '');\n }\n\n return showSymbol ? `${formatted} ${symbol}` : formatted;\n}\n\n/**\n * Generate share content for transactions\n */\nexport function generateShareContent(params: {\n type: 'receive' | 'payment_request' | 'transaction';\n address?: string;\n amount?: string;\n token?: string;\n txHash?: string;\n chainId?: number;\n}): { title: string; message: string; url?: string } {\n const { type, address, amount, token, txHash, chainId } = params;\n\n switch (type) {\n case 'receive':\n return {\n title: 'My Wallet Address',\n message: `Send ${token || 'crypto'} to my wallet:\\n${address}`,\n url: address ? `ethereum:${address}${chainId ? `@${chainId}` : ''}` : undefined,\n };\n\n case 'payment_request':\n return {\n title: 'Payment Request',\n message: `Please send ${amount} ${token} to:\\n${address}`,\n url: `ethereum:${address}${chainId ? `@${chainId}` : ''}?value=${amount}${token ? `&token=${token}` : ''}`,\n };\n\n case 'transaction':\n return {\n title: 'Transaction Sent',\n message: `Transaction confirmed!\\nHash: ${txHash}`,\n url: txHash ? getExplorerUrl(chainId || 1, txHash, 'tx') : undefined,\n };\n\n default:\n return { title: '', message: '' };\n }\n}\n\n/**\n * Get block explorer URL\n */\nexport function getExplorerUrl(\n chainId: number,\n hash: string,\n type: 'tx' | 'address' | 'token' = 'tx'\n): string {\n const explorers: Record<number, string> = {\n 1: 'https://etherscan.io',\n 137: 'https://polygonscan.com',\n 42161: 'https://arbiscan.io',\n 10: 'https://optimistic.etherscan.io',\n 8453: 'https://basescan.org',\n 56: 'https://bscscan.com',\n 43114: 'https://snowtrace.io',\n };\n\n const baseUrl = explorers[chainId] || explorers[1];\n return `${baseUrl}/${type}/${hash}`;\n}\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/services/forex/ForexSimulationEngine.ts","../src/config/index.ts","../src/types/aiTrading.ts","../src/types/console.ts","../src/services/engine.ts","../src/services/price.ts","../src/utils/index.ts","../src/components/ai/OneChainSelector.tsx","../src/components/ai/OneTierSelector.tsx","../src/components/ai/OneCycleSelector.tsx","../src/components/ai/OnePairSelector.tsx","../src/components/ai/OneForexPoolCard.tsx","../src/components/ai/OneForexCapitalSplit.tsx","../src/components/ai/OneForexConsoleView.tsx","../src/components/ai/OneForexPairSelector.tsx","../src/components/ai/OneForexTradeHistory.tsx","../src/hooks/useForexTrading.ts","../src/react-native.ts","../src/services/forex/BotSimulationEngine.ts"],"names":["pick","formatDate","genId","rand","randInt","ForexPoolDataGenerator","config","jsxs","View","styles","jsx","Text","TouchableOpacity","StyleSheet","MONO","Platform","ScrollView","useEffect","inv","useRef","forexSimulationEngine","idCounter"],"mappings":"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","file":"react-native.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","// 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 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 SDK - AI Trading Types & Constants\n// Shared types for AI-powered crypto trading strategies\n// ══════════════════════════════════════════════════════════════════════════════\n\nexport type StrategyCategory = 'conservative' | 'balanced' | 'aggressive' | 'hedge' | 'arbitrage' | 'trend' | 'grid' | 'dca';\nexport type OrderStatus = 'pending' | 'active' | 'paused' | 'completed' | 'cancelled' | 'pending_redemption' | 'redeemed';\nexport type TradeAction = 'buy' | 'sell' | 'long' | 'short' | 'close_long' | 'close_short';\nexport type TradeStatus = 'open' | 'closed' | 'liquidated' | 'cancelled';\nexport type FeeType = 'management' | 'performance' | 'withdrawal' | 'early_redemption_penalty';\nexport type OrderEventType = 'created' | 'activated' | 'paused' | 'resumed' | 'redemption_requested' | 'redeemed' | 'cancelled' | 'fee_deducted' | 'profit_realized';\n\nexport interface AIStrategyConfig {\n id: string;\n name: string;\n description: string | null;\n category: StrategyCategory;\n riskLevel: 1 | 2 | 3 | 4 | 5;\n minInvestment: number;\n maxInvestment: number | null;\n lockPeriodDays: number;\n expectedApyMin: number | null;\n expectedApyMax: number | null;\n managementFeeRate: number;\n performanceFeeRate: number;\n supportedPairs: string[];\n supportedChains: string[];\n supportedCurrencies: string[];\n leverageMin: number;\n leverageMax: number;\n isActive: boolean;\n}\n\nexport interface AIOrderCreateInput {\n strategyId: string;\n amount: number;\n currency: string;\n chain: string;\n lockPeriodDays: number;\n}\n\nexport interface AIOrderSummary {\n orderId: string;\n strategyId: string;\n strategyName: string;\n amount: number;\n currentValue: number;\n profit: number;\n profitPercent: number;\n status: OrderStatus;\n daysRemaining: number;\n lockProgress: number;\n}\n\nexport interface AIPortfolioSummary {\n totalInvested: number;\n totalValue: number;\n totalProfit: number;\n totalProfitPercent: number;\n activeOrders: number;\n totalTrades: number;\n profitToday: number;\n profit7d: number;\n profit30d: number;\n}\n\nexport interface AITradeLog {\n id: string;\n timestamp: string;\n action: TradeAction;\n pair: string;\n entryPrice: number;\n exitPrice: number | null;\n amount: number;\n pnl: number;\n pnlPercent: number;\n leverage: number;\n status: TradeStatus;\n aiConfidence: number | null;\n aiReasoning: string | null;\n}\n\nexport interface AIPenaltyCalculation {\n completionRate: number;\n penaltyRate: number;\n estimatedPenalty: number;\n estimatedRedemption: number;\n isEarlyWithdrawal: boolean;\n}\n\nexport interface AIPerformanceChart {\n date: string;\n nav: number;\n dailyPnl: number;\n cumulativePnl: number;\n}\n\nexport const PENALTY_TIERS = [\n { minProgress: 0.75, maxProgress: 1.0, rate: 0.50, label: '50%' },\n { minProgress: 0.50, maxProgress: 0.75, rate: 0.60, label: '60%' },\n { minProgress: 0.25, maxProgress: 0.50, rate: 0.70, label: '70%' },\n { minProgress: 0.00, maxProgress: 0.25, rate: 0.80, label: '80%' },\n] as const;\n\nexport function calculateEarlyWithdrawalPenalty(\n investedAmount: number,\n profit: number,\n lockProgress: number,\n): AIPenaltyCalculation {\n const totalValue = investedAmount + profit;\n const isEarlyWithdrawal = lockProgress < 1.0;\n let penaltyRate = 0;\n if (isEarlyWithdrawal) {\n if (lockProgress >= 0.75) penaltyRate = 0.50;\n else if (lockProgress >= 0.50) penaltyRate = 0.60;\n else if (lockProgress >= 0.25) penaltyRate = 0.70;\n else penaltyRate = 0.80;\n }\n const estimatedPenalty = totalValue * penaltyRate;\n const estimatedRedemption = totalValue - estimatedPenalty;\n return { completionRate: lockProgress, penaltyRate, estimatedPenalty, estimatedRedemption, isEarlyWithdrawal };\n}\n\nexport const STRATEGY_CATEGORIES: Record<StrategyCategory, { labelKey: string; color: string; icon: string }> = {\n conservative: { labelKey: 'ai.category_conservative', color: '#10B981', icon: '\\u{1F6E1}\\u{FE0F}' },\n balanced: { labelKey: 'ai.category_balanced', color: '#3B82F6', icon: '\\u{2696}\\u{FE0F}' },\n aggressive: { labelKey: 'ai.category_aggressive', color: '#EF4444', icon: '\\u{1F680}' },\n hedge: { labelKey: 'ai.category_hedge', color: '#8B5CF6', icon: '\\u{1F512}' },\n arbitrage: { labelKey: 'ai.category_arbitrage', color: '#F59E0B', icon: '\\u{26A1}' },\n trend: { labelKey: 'ai.category_trend', color: '#EC4899', icon: '\\u{1F4C8}' },\n grid: { labelKey: 'ai.category_grid', color: '#6366F1', icon: '\\u{25A6}' },\n dca: { labelKey: 'ai.category_dca', color: '#14B8A6', icon: '\\u{1F4CA}' },\n};\n\nexport const RISK_LEVELS: Record<number, { labelKey: string; color: string; bgColor: string }> = {\n 1: { labelKey: 'ai.risk_very_low', color: '#10B981', bgColor: '#D1FAE5' },\n 2: { labelKey: 'ai.risk_low', color: '#22C55E', bgColor: '#DCFCE7' },\n 3: { labelKey: 'ai.risk_medium', color: '#F59E0B', bgColor: '#FEF3C7' },\n 4: { labelKey: 'ai.risk_high', color: '#F97316', bgColor: '#FFEDD5' },\n 5: { labelKey: 'ai.risk_very_high', color: '#EF4444', bgColor: '#FEE2E2' },\n};\n\nexport const ORDER_STATUS_CONFIG: Record<OrderStatus, { labelKey: string; color: string; bgColor: string }> = {\n pending: { labelKey: 'ai.status_pending', color: '#F59E0B', bgColor: '#FEF3C7' },\n active: { labelKey: 'ai.status_active', color: '#10B981', bgColor: '#D1FAE5' },\n paused: { labelKey: 'ai.status_paused', color: '#6B7280', bgColor: '#F3F4F6' },\n completed: { labelKey: 'ai.status_completed', color: '#3B82F6', bgColor: '#DBEAFE' },\n cancelled: { labelKey: 'ai.status_cancelled', color: '#EF4444', bgColor: '#FEE2E2' },\n pending_redemption: { labelKey: 'ai.status_pending_redemption', color: '#8B5CF6', bgColor: '#EDE9FE' },\n redeemed: { labelKey: 'ai.status_redeemed', color: '#14B8A6', bgColor: '#CCFBF1' },\n};\n","// ══════════════════════════════════════════════════════════════════════════════\n// ONE SDK - Trading Console Types & Constants\n// Shared types for real-time trading console components\n// ══════════════════════════════════════════════════════════════════════════════\n\nimport type { BotLogEntry, BotState, StrategyPersonality } from '../services/forex/BotSimulationEngine';\nimport type { ForexLogEntry, ForexPoolTransaction, ForexLogType } from './forex';\n\n// ── Re-exports for convenience ────────────────────────────────────────────────\n\nexport type { BotLogEntry, BotLogType, BotState, IndicatorSnapshot, StrategyPersonality } from '../services/forex/BotSimulationEngine';\n\n// ── Console Log Types ─────────────────────────────────────────────────────────\n\nexport type AILogType =\n | 'SCAN' | 'THINKING' | 'INDICATOR' | 'ANALYSIS' | 'SIGNAL'\n | 'STRATEGY' | 'DECISION' | 'ORDER' | 'FILLED' | 'PNL'\n | 'RISK' | 'NEWS' | 'SYSTEM';\n\nexport const AI_LOG_COLORS: Record<AILogType, string> = {\n SCAN: '#06B6D4', // Cyan\n THINKING: '#A855F7', // Purple\n INDICATOR: '#3B82F6', // Blue\n ANALYSIS: '#6366F1', // Indigo\n SIGNAL: '#F59E0B', // Amber\n STRATEGY: '#D946EF', // Fuchsia\n DECISION: '#F97316', // Orange\n ORDER: '#EC4899', // Pink\n FILLED: '#10B981', // Green\n PNL: '#22C55E', // Emerald\n RISK: '#EF4444', // Red\n NEWS: '#14B8A6', // Teal\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// Forex log type colors (for ForexSimulationEngine logs)\nexport const FOREX_LOG_COLORS: Record<ForexLogType, string> = {\n RFQ: '#06B6D4', // Cyan\n QUOTE: '#8B5CF6', // Purple\n MATCH: '#10B981', // Green\n SETTLE: '#F59E0B', // Amber\n PVP: '#3B82F6', // Blue\n HEDGE: '#EC4899', // Pink\n CLEAR: '#14B8A6', // Teal\n POSITION: '#6366F1', // Indigo\n PNL: '#22C55E', // Emerald\n SYSTEM: '#9CA3AF', // Gray\n};\n\n// ── AI Position Types ─────────────────────────────────────────────────────────\n\nexport type PositionSide = 'LONG' | 'SHORT';\nexport type PositionStatus = 'open' | 'closed' | 'liquidated' | 'pending';\n\nexport interface AIPosition {\n id: string;\n strategyId: string;\n strategyName: string;\n pair: string;\n side: PositionSide;\n entryPrice: number;\n currentPrice: number;\n size: number;\n leverage: number;\n margin: number;\n pnl: number;\n pnlPercent: number;\n status: PositionStatus;\n stopLoss?: number;\n takeProfit?: number;\n liquidationPrice?: number;\n openTime: number;\n closeTime?: number;\n chain?: string;\n orderId?: string;\n aiConfidence?: number;\n aiReasoning?: string;\n}\n\n// ── AI Decision Types ─────────────────────────────────────────────────────────\n\nexport type DecisionAction = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT' | 'HOLD' | 'SKIP';\n\nexport interface AIDecision {\n id: string;\n timestamp: number;\n strategyId: string;\n strategyName: string;\n pair: string;\n action: DecisionAction;\n confidence: number;\n reasoning: string;\n indicators: {\n rsi?: number;\n macd?: number;\n ema?: string;\n volume?: number;\n bollinger?: string;\n };\n signals: string[];\n executed: boolean;\n positionId?: string;\n price?: number;\n size?: number;\n leverage?: number;\n}\n\n// ── Risk Status Types ─────────────────────────────────────────────────────────\n\nexport type RiskLevel = 'low' | 'medium' | 'high' | 'critical';\nexport type TradingStatus = 'active' | 'paused' | 'stopped' | 'cooldown';\n\nexport interface RiskStatus {\n timestamp: number;\n // Portfolio exposure\n totalExposure: number;\n maxExposure: number;\n exposurePercent: number;\n // Daily limits\n dailyPnl: number;\n dailyPnlLimit: number;\n dailyPnlPercent: number;\n dailyTradeCount: number;\n dailyTradeLimit: number;\n // Drawdown\n currentDrawdown: number;\n maxDrawdown: number;\n drawdownPercent: number;\n // Position limits\n openPositions: number;\n maxPositions: number;\n // Risk assessment\n riskLevel: RiskLevel;\n tradingStatus: TradingStatus;\n warnings: string[];\n // Per-strategy risk\n strategyRisks?: Record<string, {\n exposure: number;\n drawdown: number;\n riskLevel: RiskLevel;\n }>;\n}\n\nexport const RISK_LEVEL_COLORS: Record<RiskLevel, { color: string; bgColor: string }> = {\n low: { color: '#10B981', bgColor: '#D1FAE5' },\n medium: { color: '#F59E0B', bgColor: '#FEF3C7' },\n high: { color: '#F97316', bgColor: '#FFEDD5' },\n critical: { color: '#EF4444', bgColor: '#FEE2E2' },\n};\n\nexport const TRADING_STATUS_COLORS: Record<TradingStatus, { color: string; bgColor: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7' },\n stopped: { color: '#EF4444', bgColor: '#FEE2E2' },\n cooldown: { color: '#6366F1', bgColor: '#E0E7FF' },\n};\n\n// ── Console Metrics Types ─────────────────────────────────────────────────────\n\nexport interface ConsoleMetrics {\n // NAV & Performance\n nav: number;\n navChange24h: number;\n navChangePercent24h: number;\n // P&L\n totalPnl: number;\n realizedPnl: number;\n unrealizedPnl: number;\n pnlToday: number;\n pnl7d: number;\n pnl30d: number;\n // Trading stats\n totalTrades: number;\n tradesToday: number;\n winRate: number;\n winCount: number;\n lossCount: number;\n avgWin: number;\n avgLoss: number;\n profitFactor: number;\n // Position stats\n openPositions: number;\n totalExposure: number;\n avgLeverage: number;\n // By strategy\n strategyMetrics?: Record<string, {\n pnl: number;\n trades: number;\n winRate: number;\n exposure: number;\n }>;\n}\n\n// ── Agent Types ───────────────────────────────────────────────────────────────\n\nexport type AgentStatus = 'active' | 'paused' | 'idle' | 'error' | 'initializing';\n\nexport interface AIAgent {\n id: string;\n strategyId: string;\n name: string;\n shortName: string;\n color: string;\n status: AgentStatus;\n // Performance\n totalPnl: number;\n pnlToday: number;\n winRate: number;\n totalTrades: number;\n tradesToday: number;\n // Current state\n currentPair?: string;\n currentPrice?: number;\n lastSignal?: string;\n lastSignalConfidence?: number;\n lastActivity?: number;\n // Positions\n openPositions: number;\n totalExposure: number;\n // Risk\n riskLevel: RiskLevel;\n drawdown: number;\n // Config\n riskTolerance: 'low' | 'medium' | 'high';\n primaryIndicators: string[];\n preferredPairs: string[];\n leverageRange: [number, number];\n}\n\nexport const AGENT_STATUS_COLORS: Record<AgentStatus, { color: string; bgColor: string; label: string }> = {\n active: { color: '#10B981', bgColor: '#D1FAE5', label: 'Active' },\n paused: { color: '#F59E0B', bgColor: '#FEF3C7', label: 'Paused' },\n idle: { color: '#6B7280', bgColor: '#F3F4F6', label: 'Idle' },\n error: { color: '#EF4444', bgColor: '#FEE2E2', label: 'Error' },\n initializing: { color: '#3B82F6', bgColor: '#DBEAFE', label: 'Starting' },\n};\n\n// ── Combined Console State ────────────────────────────────────────────────────\n\nexport interface CombinedLogEntry {\n id: string;\n timestamp: number;\n source: 'ai' | 'forex';\n strategyId?: string;\n strategyName?: string;\n type: string;\n message: string;\n data?: Record<string, any>;\n importance: 'low' | 'medium' | 'high';\n}\n\nexport interface TradingConsoleState {\n ai: {\n strategies: StrategyPersonality[];\n agents: AIAgent[];\n positions: AIPosition[];\n decisions: AIDecision[];\n riskStatus: RiskStatus | null;\n simulationLogs: BotLogEntry[];\n botStates: Map<string, BotState>;\n };\n forex: {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n stats: {\n totalPnl: number;\n totalTrades: number;\n totalPips: number;\n totalLots: number;\n };\n };\n metrics: ConsoleMetrics;\n combinedLogs: CombinedLogEntry[];\n}\n\n// ── Hook Options ──────────────────────────────────────────────────────────────\n\nexport interface TradingConsoleOptions {\n simulation?: boolean;\n pollInterval?: number;\n maxLogs?: number;\n strategyIds?: string[];\n autoStart?: boolean;\n}\n\nexport interface AIQuantConsoleOptions {\n strategyIds?: string[];\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\nexport interface AgentConsoleOptions {\n strategyId: string;\n pollInterval?: number;\n simulation?: boolean;\n maxLogs?: number;\n}\n\n// ── Default Values ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONSOLE_OPTIONS: TradingConsoleOptions = {\n simulation: true,\n pollInterval: 5000,\n maxLogs: 500,\n autoStart: false,\n};\n\nexport const DEFAULT_RISK_STATUS: RiskStatus = {\n timestamp: Date.now(),\n totalExposure: 0,\n maxExposure: 100000,\n exposurePercent: 0,\n dailyPnl: 0,\n dailyPnlLimit: 5000,\n dailyPnlPercent: 0,\n dailyTradeCount: 0,\n dailyTradeLimit: 50,\n currentDrawdown: 0,\n maxDrawdown: 15,\n drawdownPercent: 0,\n openPositions: 0,\n maxPositions: 10,\n riskLevel: 'low',\n tradingStatus: 'active',\n warnings: [],\n};\n\nexport const DEFAULT_CONSOLE_METRICS: ConsoleMetrics = {\n nav: 0,\n navChange24h: 0,\n navChangePercent24h: 0,\n totalPnl: 0,\n realizedPnl: 0,\n unrealizedPnl: 0,\n pnlToday: 0,\n pnl7d: 0,\n pnl30d: 0,\n totalTrades: 0,\n tradesToday: 0,\n winRate: 0,\n winCount: 0,\n lossCount: 0,\n avgWin: 0,\n avgLoss: 0,\n profitFactor: 0,\n openPositions: 0,\n totalExposure: 0,\n avgLeverage: 0,\n};\n\n// ── Utility Functions ─────────────────────────────────────────────────────────\n\nexport function calculateRiskLevel(\n exposurePercent: number,\n drawdownPercent: number,\n dailyPnlPercent: number\n): RiskLevel {\n const worstMetric = Math.max(exposurePercent, drawdownPercent, Math.abs(dailyPnlPercent));\n if (worstMetric >= 90) return 'critical';\n if (worstMetric >= 70) return 'high';\n if (worstMetric >= 40) return 'medium';\n return 'low';\n}\n\nexport function formatPnl(pnl: number): string {\n const sign = pnl >= 0 ? '+' : '';\n if (Math.abs(pnl) >= 1000000) {\n return `${sign}$${(pnl / 1000000).toFixed(2)}M`;\n }\n if (Math.abs(pnl) >= 1000) {\n return `${sign}$${(pnl / 1000).toFixed(2)}K`;\n }\n return `${sign}$${pnl.toFixed(2)}`;\n}\n\nexport function formatPercent(value: number, showSign = true): string {\n const sign = showSign && value >= 0 ? '+' : '';\n return `${sign}${value.toFixed(2)}%`;\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 { 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","// ===== Address Utilities =====\nexport function shortenAddress(address: string, chars = 4): string {\n if (!address) return '';\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\nexport function isValidAddress(address: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\nexport function checksumAddress(address: string): string {\n // Basic checksum - for proper checksum use ethers/viem\n return address.toLowerCase();\n}\n\n// ===== Number Formatting =====\nexport function formatNumber(\n value: number,\n options: {\n decimals?: number;\n compact?: boolean;\n currency?: string;\n locale?: string;\n } = {}\n): string {\n const { decimals = 2, compact = false, currency, locale = 'en-US' } = options;\n\n if (currency) {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? 'compact' : 'standard',\n }).format(value);\n }\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? 'compact' : 'standard',\n }).format(value);\n}\n\nexport function formatUSD(value: number, compact = false): string {\n return formatNumber(value, { currency: 'USD', compact });\n}\n\nexport function formatPercent(value: number, decimals = 2): string {\n const sign = value >= 0 ? '+' : '';\n return `${sign}${value.toFixed(decimals)}%`;\n}\n\nexport function formatTokenAmount(amount: number, decimals = 6): string {\n if (amount === 0) return '0';\n if (amount < 0.000001) return '<0.000001';\n if (amount < 1) return amount.toFixed(decimals);\n if (amount < 1000) return amount.toFixed(4);\n if (amount < 1000000) return formatNumber(amount, { decimals: 2 });\n return formatNumber(amount, { decimals: 2, compact: true });\n}\n\n// ===== Date & Time Utilities =====\nexport function formatDate(\n date: string | Date,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }\n): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleDateString('en-US', options);\n}\n\nexport function formatDateTime(date: string | Date): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function formatRelativeTime(date: string | Date): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n\n if (diffSec < 60) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n if (diffHour < 24) return `${diffHour}h ago`;\n if (diffDay < 7) return `${diffDay}d ago`;\n\n return formatDate(d);\n}\n\n// ===== Validation Utilities =====\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\nexport function isValidPhone(phone: string): boolean {\n const phoneRegex = /^\\+?[1-9]\\d{1,14}$/;\n return phoneRegex.test(phone.replace(/[\\s-()]/g, ''));\n}\n\n// ===== String Utilities =====\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\nexport function truncate(str: string, length: number): string {\n if (str.length <= length) return str;\n return `${str.slice(0, length)}...`;\n}\n\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\n// ===== Async Utilities =====\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: { maxAttempts?: number; delay?: number; backoff?: number } = {}\n): Promise<T> {\n const { maxAttempts = 3, delay = 1000, backoff = 2 } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < maxAttempts) {\n await sleep(delay * Math.pow(backoff, attempt - 1));\n }\n }\n }\n\n throw lastError;\n}\n\n// ===== Object Utilities =====\nexport function omit<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n}\n\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n// ===== Error Handling =====\nexport class OneSDKError extends Error {\n code: string;\n details?: any;\n\n constructor(message: string, code: string, details?: any) {\n super(message);\n this.name = 'OneSDKError';\n this.code = code;\n this.details = details;\n }\n}\n\nexport function isOneSDKError(error: unknown): error is OneSDKError {\n return error instanceof OneSDKError;\n}\n","/**\n * OneChainSelector - Multi-chain selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\n// Chain configuration with branding\nexport const CHAIN_CONFIG: Record<string, { name: string; icon: string; color: string }> = {\n ethereum: { name: 'Ethereum', icon: 'Ξ', color: '#627EEA' },\n arbitrum: { name: 'Arbitrum', icon: '◆', color: '#28A0F0' },\n bsc: { name: 'BSC', icon: '◆', color: '#F3BA2F' },\n base: { name: 'Base', icon: '●', color: '#0052FF' },\n polygon: { name: 'Polygon', icon: '⬡', color: '#8247E5' },\n optimism: { name: 'Optimism', icon: '◉', color: '#FF0420' },\n avalanche: { name: 'Avalanche', icon: '▲', color: '#E84142' },\n linea: { name: 'Linea', icon: '═', color: '#121212' },\n zksync: { name: 'zkSync', icon: '⬢', color: '#8C8DFC' },\n scroll: { name: 'Scroll', icon: '◎', color: '#FFEEDA' },\n};\n\nexport interface OneChainSelectorProps {\n /** List of supported chain IDs */\n supportedChains: string[];\n /** Currently selected chains */\n selectedChains: string[];\n /** Callback when chain selection changes */\n onSelectChain: (chain: string) => void;\n /** Enable multi-select (default: true) */\n multiSelect?: boolean;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Minimum required selections (for multi-select) */\n minSelections?: number;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OneChainSelector: React.FC<OneChainSelectorProps> = ({\n supportedChains,\n selectedChains,\n onSelectChain,\n multiSelect = true,\n accentColor = '#188775',\n title,\n subtitle,\n minSelections = 1,\n style,\n titleStyle,\n}) => {\n const handleSelect = (chain: string) => {\n if (multiSelect) {\n // In multi-select, prevent deselecting if at minimum\n if (selectedChains.includes(chain) && selectedChains.length <= minSelections) {\n return;\n }\n onSelectChain(chain);\n } else {\n // Single select - always allow selection\n if (!selectedChains.includes(chain)) {\n onSelectChain(chain);\n }\n }\n };\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.chainsContainer}>\n {supportedChains.map((chain) => {\n const chainInfo = CHAIN_CONFIG[chain] || { name: chain, icon: '●', color: '#888' };\n const isSelected = selectedChains.includes(chain);\n\n return (\n <TouchableOpacity\n key={chain}\n style={[\n styles.chainChip,\n isSelected && styles.chainChipSelected,\n isSelected && { borderColor: accentColor, backgroundColor: accentColor + '15' }\n ]}\n onPress={() => handleSelect(chain)}\n activeOpacity={0.7}\n >\n <View style={[styles.chainIconBg, { backgroundColor: chainInfo.color + '20' }]}>\n <Text style={[styles.chainIcon, { color: chainInfo.color }]}>{chainInfo.icon}</Text>\n </View>\n <Text style={[\n styles.chainText,\n isSelected && { color: accentColor, fontWeight: '600' }\n ]}>\n {chainInfo.name}\n </Text>\n {isSelected && (\n <Text style={[styles.checkmark, { color: accentColor }]}>✓</Text>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n\n {multiSelect && selectedChains.length > 0 && (\n <View style={styles.selectedInfo}>\n <Text style={styles.selectedText}>\n {selectedChains.length} chain{selectedChains.length > 1 ? 's' : ''} selected\n </Text>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n chainsContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n chainChip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: '#fff',\n borderRadius: 12,\n borderWidth: 2,\n borderColor: '#e5e5e5',\n gap: 8,\n },\n chainChipSelected: {\n borderWidth: 2,\n },\n chainIconBg: {\n width: 28,\n height: 28,\n borderRadius: 14,\n alignItems: 'center',\n justifyContent: 'center',\n },\n chainIcon: {\n fontSize: 14,\n fontWeight: '700',\n },\n chainText: {\n fontSize: 14,\n color: '#666',\n },\n checkmark: {\n fontSize: 16,\n fontWeight: '700',\n },\n selectedInfo: {\n marginTop: 8,\n paddingVertical: 4,\n },\n selectedText: {\n fontSize: 12,\n color: '#888',\n },\n});\n","/**\n * OneTierSelector - Investment tier selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\nexport interface Tier {\n tier: number;\n amount: number;\n label: string;\n label_zh?: string;\n}\n\nexport interface OneTierSelectorProps {\n /** Available investment tiers */\n tiers: Tier[];\n /** Currently selected tier */\n selectedTier: Tier | null;\n /** Callback when tier selection changes */\n onSelectTier: (tier: Tier) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Show recommended badge on middle tier */\n showRecommended?: boolean;\n /** Recommended label text */\n recommendedLabel?: string;\n /** Use Chinese labels */\n useZhLabels?: boolean;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OneTierSelector: React.FC<OneTierSelectorProps> = ({\n tiers,\n selectedTier,\n onSelectTier,\n accentColor = '#188775',\n title,\n subtitle,\n showRecommended = true,\n recommendedLabel = 'Recommended',\n useZhLabels = false,\n style,\n titleStyle,\n}) => {\n // Middle tier is usually recommended\n const recommendedTierIndex = Math.floor(tiers.length / 2);\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.tiersContainer}>\n {tiers.map((tier, index) => {\n const isSelected = selectedTier?.tier === tier.tier;\n const isRecommended = showRecommended && index === recommendedTierIndex;\n\n return (\n <TouchableOpacity\n key={tier.tier}\n style={[\n styles.tierCard,\n isSelected && styles.tierCardSelected,\n isSelected && { borderColor: accentColor }\n ]}\n onPress={() => onSelectTier(tier)}\n activeOpacity={0.7}\n >\n {isRecommended && (\n <View style={[styles.recommendedBadge, { backgroundColor: accentColor }]}>\n <Text style={styles.recommendedText}>{recommendedLabel}</Text>\n </View>\n )}\n\n <Text style={[\n styles.tierLabel,\n isSelected && { color: accentColor },\n isRecommended && styles.tierLabelWithBadge\n ]}>\n {useZhLabels && tier.label_zh ? tier.label_zh : tier.label}\n </Text>\n\n <Text style={[\n styles.tierAmount,\n isSelected && { color: accentColor }\n ]}>\n ${tier.amount.toLocaleString()}\n </Text>\n\n {isSelected && (\n <View style={[styles.checkCircle, { backgroundColor: accentColor }]}>\n <Text style={styles.checkmark}>✓</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n tiersContainer: {\n flexDirection: 'row',\n gap: 8,\n },\n tierCard: {\n flex: 1,\n padding: 16,\n backgroundColor: '#fff',\n borderRadius: 12,\n borderWidth: 2,\n borderColor: '#e5e5e5',\n alignItems: 'center',\n position: 'relative',\n overflow: 'hidden',\n },\n tierCardSelected: {\n backgroundColor: '#fff',\n },\n tierLabel: {\n fontSize: 12,\n color: '#666',\n marginBottom: 4,\n },\n tierLabelWithBadge: {\n marginTop: 16,\n },\n tierAmount: {\n fontSize: 20,\n fontWeight: '700',\n color: '#1a1a1a',\n },\n checkCircle: {\n position: 'absolute',\n top: -8,\n right: -8,\n width: 28,\n height: 28,\n borderRadius: 14,\n alignItems: 'center',\n justifyContent: 'center',\n },\n checkmark: {\n fontSize: 14,\n fontWeight: '700',\n color: '#fff',\n },\n recommendedBadge: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n paddingVertical: 4,\n alignItems: 'center',\n },\n recommendedText: {\n fontSize: 10,\n fontWeight: '700',\n color: '#fff',\n textTransform: 'uppercase',\n },\n});\n","/**\n * OneCycleSelector - Investment cycle selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\n// Default share rates by cycle (platform takes this percentage)\nexport const DEFAULT_SHARE_RATES: Record<number, number> = {\n 7: 25,\n 14: 22,\n 30: 18,\n 60: 15,\n 90: 12,\n};\n\nexport interface OneCycleSelectorProps {\n /** List of supported cycle days */\n supportedCycles: number[];\n /** Currently selected cycle */\n selectedCycle: number;\n /** Callback when cycle selection changes */\n onSelectCycle: (cycle: number) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Custom share rates by cycle (overrides defaults) */\n shareRates?: Record<number, number>;\n /** Days label */\n daysLabel?: string;\n /** Your share label */\n yourShareLabel?: string;\n /** Platform fee label */\n platformFeeLabel?: string;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OneCycleSelector: React.FC<OneCycleSelectorProps> = ({\n supportedCycles,\n selectedCycle,\n onSelectCycle,\n accentColor = '#188775',\n title,\n subtitle,\n shareRates = DEFAULT_SHARE_RATES,\n daysLabel = 'days',\n yourShareLabel = 'Your share',\n platformFeeLabel = 'Platform fee',\n style,\n titleStyle,\n}) => {\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.cyclesContainer}>\n {supportedCycles.map((cycle) => {\n const isSelected = selectedCycle === cycle;\n const shareRate = shareRates[cycle] || 20;\n const userRate = 100 - shareRate;\n\n return (\n <TouchableOpacity\n key={cycle}\n style={[\n styles.cycleOption,\n isSelected && styles.cycleOptionSelected,\n isSelected && { borderColor: accentColor, backgroundColor: accentColor + '10' }\n ]}\n onPress={() => onSelectCycle(cycle)}\n activeOpacity={0.7}\n >\n <Text style={[\n styles.cycleDays,\n isSelected && { color: accentColor }\n ]}>\n {cycle}\n </Text>\n <Text style={styles.cycleDaysLabel}>{daysLabel}</Text>\n\n <View style={styles.cycleEarnings}>\n <Text style={[\n styles.cycleEarningsValue,\n isSelected && { color: accentColor }\n ]}>\n {userRate}%\n </Text>\n <Text style={styles.cycleEarningsLabel}>{yourShareLabel}</Text>\n </View>\n\n <Text style={styles.cycleFee}>\n {shareRate}% {platformFeeLabel}\n </Text>\n </TouchableOpacity>\n );\n })}\n </View>\n\n <View style={styles.infoBox}>\n <Text style={styles.infoText}>\n Longer cycles = higher user share\n </Text>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n cyclesContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n cycleOption: {\n flex: 1,\n minWidth: '45%',\n padding: 16,\n borderRadius: 12,\n borderWidth: 2,\n borderColor: '#e5e5e5',\n backgroundColor: '#fff',\n alignItems: 'center',\n },\n cycleOptionSelected: {\n borderWidth: 2,\n },\n cycleDays: {\n fontSize: 28,\n fontWeight: '700',\n color: '#1a1a1a',\n },\n cycleDaysLabel: {\n fontSize: 12,\n color: '#666',\n marginBottom: 8,\n },\n cycleEarnings: {\n alignItems: 'center',\n },\n cycleEarningsValue: {\n fontSize: 18,\n fontWeight: '700',\n color: '#10B981',\n },\n cycleEarningsLabel: {\n fontSize: 11,\n color: '#666',\n },\n cycleFee: {\n fontSize: 11,\n color: '#888',\n marginTop: 4,\n },\n infoBox: {\n marginTop: 12,\n padding: 8,\n backgroundColor: '#f5f5f5',\n borderRadius: 8,\n },\n infoText: {\n fontSize: 12,\n color: '#666',\n textAlign: 'center',\n },\n});\n","/**\n * OnePairSelector - Trading pair selection component for AI trading\n * Part of ONE Ecosystem SDK - can be used by any ecosystem partner\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';\n\n// Common trading pairs with icons\nexport const PAIR_ICONS: Record<string, string> = {\n 'BTC/USDT': '₿',\n 'ETH/USDT': 'Ξ',\n 'SOL/USDT': '◎',\n 'BNB/USDT': '◆',\n 'XRP/USDT': '✕',\n 'DOGE/USDT': 'Ð',\n 'ADA/USDT': '◈',\n 'AVAX/USDT': '▲',\n 'DOT/USDT': '●',\n 'MATIC/USDT': '⬡',\n 'LINK/USDT': '◇',\n 'UNI/USDT': '🦄',\n 'ATOM/USDT': '⚛',\n 'LTC/USDT': 'Ł',\n 'ARB/USDT': '◆',\n 'OP/USDT': '◉',\n};\n\nexport interface OnePairSelectorProps {\n /** List of supported trading pairs */\n supportedPairs: string[];\n /** Currently selected pairs */\n selectedPairs: string[];\n /** Callback when pair selection changes */\n onTogglePair: (pair: string) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Minimum required selections */\n minSelections?: number;\n /** Maximum allowed selections (0 = unlimited) */\n maxSelections?: number;\n /** Custom styles */\n style?: ViewStyle;\n /** Custom title style */\n titleStyle?: TextStyle;\n}\n\nexport const OnePairSelector: React.FC<OnePairSelectorProps> = ({\n supportedPairs,\n selectedPairs,\n onTogglePair,\n accentColor = '#188775',\n title,\n subtitle,\n minSelections = 1,\n maxSelections = 0,\n style,\n titleStyle,\n}) => {\n const handleToggle = (pair: string) => {\n const isSelected = selectedPairs.includes(pair);\n\n // Prevent deselecting below minimum\n if (isSelected && selectedPairs.length <= minSelections) {\n return;\n }\n\n // Prevent selecting above maximum\n if (!isSelected && maxSelections > 0 && selectedPairs.length >= maxSelections) {\n return;\n }\n\n onTogglePair(pair);\n };\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.pairsContainer}>\n {supportedPairs.map((pair) => {\n const isSelected = selectedPairs.includes(pair);\n const icon = PAIR_ICONS[pair] || '●';\n const baseSymbol = pair.split('/')[0];\n\n return (\n <TouchableOpacity\n key={pair}\n style={[\n styles.pairChip,\n isSelected && styles.pairChipSelected,\n isSelected && { backgroundColor: accentColor + '15', borderColor: accentColor }\n ]}\n onPress={() => handleToggle(pair)}\n activeOpacity={0.7}\n >\n <Text style={styles.pairIcon}>{icon}</Text>\n <Text style={[\n styles.pairText,\n isSelected && { color: accentColor, fontWeight: '600' }\n ]}>\n {baseSymbol}\n </Text>\n {isSelected && (\n <Text style={[styles.checkmark, { color: accentColor }]}>✓</Text>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n\n <View style={styles.selectedInfo}>\n <Text style={styles.selectedText}>\n {selectedPairs.length} pair{selectedPairs.length !== 1 ? 's' : ''} selected\n {minSelections > 0 && ` (min: ${minSelections})`}\n {maxSelections > 0 && ` (max: ${maxSelections})`}\n </Text>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n marginBottom: 16,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 12,\n color: '#666',\n marginBottom: 12,\n },\n pairsContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n pairChip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: '#fff',\n borderRadius: 8,\n borderWidth: 1,\n borderColor: '#e5e5e5',\n gap: 6,\n },\n pairChipSelected: {\n borderWidth: 2,\n },\n pairIcon: {\n fontSize: 14,\n },\n pairText: {\n fontSize: 14,\n color: '#666',\n },\n checkmark: {\n fontSize: 14,\n fontWeight: '700',\n },\n selectedInfo: {\n marginTop: 8,\n paddingVertical: 4,\n },\n selectedText: {\n fontSize: 12,\n color: '#888',\n },\n});\n","/**\n * OneForexPoolCard - Displays a forex liquidity pool with metrics\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport type { ForexPool } from '../../types/forex';\n\nexport interface OneForexPoolCardProps {\n /** Pool data object */\n pool: ForexPool;\n /** Pool display name (provide translated string) */\n poolName?: string;\n /** Whether to show enhanced metrics (APY, flow, tx count) */\n showMetrics?: boolean;\n /** Custom accent color override */\n accentColor?: string;\n /** Custom container style */\n style?: ViewStyle;\n /** Dark mode */\n dark?: boolean;\n}\n\nexport const OneForexPoolCard: React.FC<OneForexPoolCardProps> = ({\n pool,\n poolName,\n showMetrics = true,\n accentColor,\n style,\n dark = true,\n}) => {\n const color = accentColor || pool.color;\n const bg = dark ? '#111111' : '#ffffff';\n const border = dark ? '#1a1a1a' : '#e5e5e5';\n const textPrimary = dark ? '#ffffff' : '#1a1a1a';\n const textSecondary = dark ? '#9ca3af' : '#666666';\n const textMuted = dark ? '#666666' : '#999999';\n const barBg = dark ? '#1a1a1a' : '#e5e5e5';\n\n return (\n <View style={[styles.container, { backgroundColor: bg, borderColor: border }, style]}>\n <View style={styles.header}>\n <View style={[styles.dot, { backgroundColor: color }]} />\n <Text style={[styles.name, { color: textPrimary }]}>\n {poolName || pool.nameKey}\n </Text>\n <Text style={[styles.alloc, { color: textSecondary }]}>\n {(pool.allocation * 100).toFixed(0)}%\n </Text>\n </View>\n\n <View style={[styles.barOuter, { backgroundColor: barBg }]}>\n <View style={[styles.barFill, { width: `${pool.utilization * 100}%`, backgroundColor: color }]} />\n </View>\n\n <View style={styles.statsRow}>\n <Text style={[styles.statValue, { color: textSecondary }]}>\n ${(pool.totalSize / 1_000_000).toFixed(1)}M\n </Text>\n <Text style={[styles.statLabel, { color: textMuted }]}>\n {(pool.utilization * 100).toFixed(1)}% util\n </Text>\n </View>\n\n {showMetrics && (\n <View style={[styles.metricsRow, { borderTopColor: border }]}>\n <View style={styles.metricItem}>\n <Text style={[styles.metricLabel, { color: textMuted }]}>APY 7d</Text>\n <Text style={[styles.metricValue, { color: '#10B981' }]}>\n {pool.apy7d.toFixed(1)}%\n </Text>\n </View>\n <View style={styles.metricItem}>\n <Text style={[styles.metricLabel, { color: textMuted }]}>24h Flow</Text>\n <Text style={[styles.metricValue, { color: pool.netFlow24h >= 0 ? '#10B981' : '#EF4444' }]}>\n {pool.netFlow24h >= 0 ? '+' : ''}${(pool.netFlow24h / 1000).toFixed(0)}K\n </Text>\n </View>\n <View style={styles.metricItem}>\n <Text style={[styles.metricLabel, { color: textMuted }]}>Txs</Text>\n <Text style={[styles.metricValue, { color: textPrimary }]}>{pool.txCount24h}</Text>\n </View>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { borderRadius: 8, borderWidth: 1, padding: 14 },\n header: { flexDirection: 'row', alignItems: 'center', marginBottom: 8, gap: 8 },\n dot: { width: 8, height: 8, borderRadius: 4 },\n name: { fontSize: 13, fontWeight: '600', flex: 1 },\n alloc: { fontSize: 12 },\n barOuter: { height: 6, borderRadius: 3, overflow: 'hidden', marginBottom: 6 },\n barFill: { height: '100%', borderRadius: 3 },\n statsRow: { flexDirection: 'row', justifyContent: 'space-between' },\n statValue: { fontSize: 12, fontWeight: '600' },\n statLabel: { fontSize: 11 },\n metricsRow: { flexDirection: 'row', justifyContent: 'space-between', paddingTop: 8, marginTop: 8, borderTopWidth: 1 },\n metricItem: { alignItems: 'center', flex: 1 },\n metricLabel: { fontSize: 9, textTransform: 'uppercase', letterSpacing: 0.5, marginBottom: 2 },\n metricValue: { fontSize: 12, fontWeight: '600' },\n});\n","/**\n * OneForexCapitalSplit - Displays 50/50 capital allocation split\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport { FOREX_CAPITAL_SPLIT, FOREX_POOL_DEFAULTS, computePoolAllocations } from '../../types/forex';\n\nexport interface OneForexCapitalSplitProps {\n /** Total investment amount */\n amount: number;\n /** Labels (provide translated strings) */\n labels?: {\n title?: string;\n tradingCapital?: string;\n poolReserves?: string;\n clearing?: string;\n hedging?: string;\n insurance?: string;\n };\n /** Show pool breakdown within reserves */\n showPoolBreakdown?: boolean;\n /** Custom container style */\n style?: ViewStyle;\n /** Dark mode */\n dark?: boolean;\n}\n\nexport const OneForexCapitalSplit: React.FC<OneForexCapitalSplitProps> = ({\n amount,\n labels = {},\n showPoolBreakdown = true,\n style,\n dark = false,\n}) => {\n const allocs = computePoolAllocations(amount);\n const bg = dark ? '#111111' : '#ffffff';\n const border = dark ? '#1a1a1a' : '#e5e5e5';\n const textPrimary = dark ? '#ffffff' : '#1a1a1a';\n const textSecondary = dark ? '#9ca3af' : '#666666';\n const itemBg = dark ? '#0a0a0a' : '#f5f5f5';\n\n return (\n <View style={[styles.container, { backgroundColor: bg, borderColor: border }, style]}>\n {labels.title && <Text style={[styles.title, { color: textPrimary }]}>{labels.title}</Text>}\n\n <View style={styles.splitRow}>\n <View style={[styles.splitItem, { backgroundColor: itemBg }]}>\n <View style={[styles.dot, { backgroundColor: '#0EA5E9' }]} />\n <Text style={[styles.splitLabel, { color: textSecondary }]}>\n {labels.tradingCapital || 'Active Trading (RFQ)'}\n </Text>\n <Text style={[styles.splitPct, { color: textSecondary }]}>50%</Text>\n <Text style={[styles.splitAmt, { color: textPrimary }]}>\n ${allocs.tradingCapital.toLocaleString()}\n </Text>\n </View>\n <View style={[styles.splitItem, { backgroundColor: itemBg }]}>\n <View style={[styles.dot, { backgroundColor: '#8B5CF6' }]} />\n <Text style={[styles.splitLabel, { color: textSecondary }]}>\n {labels.poolReserves || 'Pool Reserves'}\n </Text>\n <Text style={[styles.splitPct, { color: textSecondary }]}>50%</Text>\n <Text style={[styles.splitAmt, { color: textPrimary }]}>\n ${allocs.totalPoolReserves.toLocaleString()}\n </Text>\n </View>\n </View>\n\n {showPoolBreakdown && amount > 0 && (\n <View style={[styles.breakdown, { borderTopColor: border }]}>\n {FOREX_POOL_DEFAULTS.map(pool => {\n const poolAmt = allocs[pool.id as keyof typeof allocs] as number;\n return (\n <View key={pool.id} style={styles.poolRow}>\n <View style={[styles.poolDot, { backgroundColor: pool.color }]} />\n <Text style={[styles.poolName, { color: textSecondary }]}>\n {(labels as any)?.[pool.id] || pool.nameKey}\n </Text>\n <View style={[styles.poolBar, { backgroundColor: dark ? '#1a1a1a' : '#e5e5e5' }]}>\n <View style={[styles.poolBarFill, { width: `${pool.allocation * 100}%`, backgroundColor: pool.color }]} />\n </View>\n <Text style={[styles.poolAmt, { color: textPrimary }]}>\n ${poolAmt.toLocaleString()}\n </Text>\n </View>\n );\n })}\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { borderRadius: 8, borderWidth: 1, padding: 14 },\n title: { fontSize: 14, fontWeight: '600', marginBottom: 12 },\n splitRow: { gap: 8 },\n splitItem: { flexDirection: 'row', alignItems: 'center', paddingVertical: 10, paddingHorizontal: 12, borderRadius: 8 },\n dot: { width: 10, height: 10, borderRadius: 5, marginRight: 8 },\n splitLabel: { flex: 1, fontSize: 13, fontWeight: '500' },\n splitPct: { fontSize: 12, fontWeight: '600', marginRight: 12 },\n splitAmt: { fontSize: 14, fontWeight: '700' },\n breakdown: { marginTop: 12, paddingTop: 12, borderTopWidth: 1 },\n poolRow: { flexDirection: 'row', alignItems: 'center', marginBottom: 8 },\n poolDot: { width: 8, height: 8, borderRadius: 4, marginRight: 8 },\n poolName: { width: 80, fontSize: 12 },\n poolBar: { flex: 1, height: 6, borderRadius: 3, overflow: 'hidden', marginHorizontal: 8 },\n poolBarFill: { height: '100%', borderRadius: 3 },\n poolAmt: { width: 70, fontSize: 12, fontWeight: '600', textAlign: 'right' },\n});\n","/**\n * OneForexConsoleView - Displays live forex trading console log feed\n * Part of ONE Ecosystem SDK\n */\n\nimport React, { useRef, useEffect } from 'react';\nimport { View, Text, StyleSheet, ScrollView, ViewStyle, Platform } from 'react-native';\nimport type { ForexLogEntry } from '../../types/forex';\nimport { FOREX_LOG_COLORS } from '../../types/console';\n\nconst MONO = Platform.OS === 'ios' ? 'Courier New' : 'monospace';\n\nexport interface OneForexConsoleViewProps {\n /** Array of log entries to display */\n logs: ForexLogEntry[];\n /** Maximum visible entries */\n maxItems?: number;\n /** Auto-scroll to bottom */\n autoScroll?: boolean;\n /** Custom container style */\n style?: ViewStyle;\n /** Console height */\n height?: number;\n}\n\nexport const OneForexConsoleView: React.FC<OneForexConsoleViewProps> = ({\n logs,\n maxItems = 100,\n autoScroll = true,\n style,\n height = 400,\n}) => {\n const scrollRef = useRef<ScrollView>(null);\n const visibleLogs = logs.slice(-maxItems);\n\n useEffect(() => {\n if (autoScroll && scrollRef.current) {\n setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 50);\n }\n }, [logs.length, autoScroll]);\n\n const formatTime = (ts: number) => {\n const d = new Date(ts);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}:${d.getSeconds().toString().padStart(2, '0')}`;\n };\n\n return (\n <View style={[styles.container, { height }, style]}>\n <ScrollView ref={scrollRef} style={styles.scroll} contentContainerStyle={styles.scrollContent}>\n {visibleLogs.map((log) => (\n <View key={log.id} style={styles.logRow}>\n <Text style={styles.timestamp}>{formatTime(log.timestamp)}</Text>\n <Text style={[styles.type, { color: FOREX_LOG_COLORS[log.type] || '#9CA3AF' }]}>\n {log.type.padEnd(8)}\n </Text>\n <Text style={[\n styles.message,\n log.importance === 'high' && styles.messageHigh,\n ]} numberOfLines={2}>\n {log.message}\n </Text>\n </View>\n ))}\n {visibleLogs.length === 0 && (\n <Text style={styles.emptyText}>Waiting for trading activity...</Text>\n )}\n </ScrollView>\n </View>\n );\n};\n\n// Terminal palette – always dark regardless of app theme\nconst T = {\n base: '#0A0A0C',\n border: '#2A2A35',\n muted: '#555560',\n secondary: '#9CA3AF',\n};\n\nconst styles = StyleSheet.create({\n container: { backgroundColor: T.base, borderRadius: 8, borderWidth: 1, borderColor: T.border, overflow: 'hidden' },\n scroll: { flex: 1 },\n scrollContent: { padding: 8 },\n logRow: { flexDirection: 'row', paddingVertical: 3 },\n timestamp: { fontFamily: MONO, fontSize: 10, color: T.muted, width: 60, marginRight: 6 },\n type: { fontFamily: MONO, fontSize: 10, fontWeight: '700', width: 65, marginRight: 6 },\n message: { fontFamily: MONO, fontSize: 10, color: T.secondary, flex: 1 },\n messageHigh: { color: '#ffffff', fontWeight: '600' },\n emptyText: { fontFamily: MONO, fontSize: 11, color: T.muted, textAlign: 'center', paddingVertical: 40 },\n});\n","/**\n * OneForexPairSelector - Stablecoin FX pair selection for forex trading\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ViewStyle } from 'react-native';\nimport { FOREX_CURRENCY_PAIRS } from '../../types/forex';\nimport type { ForexCurrencyPair } from '../../types/forex';\n\nexport interface OneForexPairSelectorProps {\n /** Currently selected pair IDs */\n selectedPairs: string[];\n /** Callback when a pair is toggled */\n onTogglePair: (pairId: string) => void;\n /** Accent color for selected state */\n accentColor?: string;\n /** Section title */\n title?: string;\n /** Section subtitle */\n subtitle?: string;\n /** Custom pairs list (defaults to FOREX_CURRENCY_PAIRS) */\n pairs?: ForexCurrencyPair[];\n /** Custom container style */\n style?: ViewStyle;\n}\n\nexport const OneForexPairSelector: React.FC<OneForexPairSelectorProps> = ({\n selectedPairs,\n onTogglePair,\n accentColor = '#0EA5E9',\n title,\n subtitle,\n pairs = FOREX_CURRENCY_PAIRS,\n style,\n}) => {\n const handleToggle = (pairId: string) => {\n if (selectedPairs.includes(pairId) && selectedPairs.length <= 1) return;\n onTogglePair(pairId);\n };\n\n return (\n <View style={[styles.container, style]}>\n {title && <Text style={styles.title}>{title}</Text>}\n {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n <View style={styles.pairGrid}>\n {pairs.map((pair) => {\n const isSelected = selectedPairs.includes(pair.id);\n return (\n <TouchableOpacity\n key={pair.id}\n style={[\n styles.pairBtn,\n isSelected && styles.pairBtnActive,\n isSelected && { borderColor: accentColor, backgroundColor: accentColor + '08' },\n ]}\n onPress={() => handleToggle(pair.id)}\n activeOpacity={0.7}\n >\n <Text style={styles.pairFlag}>{pair.flag}</Text>\n <View style={styles.pairInfo}>\n <Text style={[styles.pairSymbol, isSelected && { color: accentColor, fontWeight: '600' }]}>\n {pair.symbol}\n </Text>\n <Text style={styles.pairName}>{pair.name}</Text>\n </View>\n {isSelected && (\n <Text style={[styles.check, { color: accentColor }]}>{'\\u2713'}</Text>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n\n <Text style={styles.selectedInfo}>\n {selectedPairs.length} pair{selectedPairs.length !== 1 ? 's' : ''} selected (min: 1)\n </Text>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { marginBottom: 16 },\n title: { fontSize: 16, fontWeight: '600', color: '#1a1a1a', marginBottom: 4 },\n subtitle: { fontSize: 12, color: '#666', marginBottom: 12 },\n pairGrid: { gap: 8 },\n pairBtn: {\n flexDirection: 'row', alignItems: 'center',\n paddingHorizontal: 12, paddingVertical: 12,\n borderRadius: 8, borderWidth: 1.5, borderColor: '#e5e5e5',\n backgroundColor: '#fff', gap: 10,\n },\n pairBtnActive: { borderWidth: 2 },\n pairFlag: { fontSize: 20 },\n pairInfo: { flex: 1 },\n pairSymbol: { fontSize: 14, color: '#666' },\n pairName: { fontSize: 11, color: '#999' },\n check: { fontSize: 16, fontWeight: '700' },\n selectedInfo: { fontSize: 12, color: '#888', marginTop: 8 },\n});\n","/**\n * OneForexTradeHistory - Displays trade history with settlement details\n * Part of ONE Ecosystem SDK\n */\n\nimport React from 'react';\nimport { View, Text, StyleSheet, ScrollView, ViewStyle, Platform } from 'react-native';\nimport type { ForexTradeRecord } from '../../types/forex';\n\nconst MONO = Platform.OS === 'ios' ? 'Courier New' : 'monospace';\n\nexport interface OneForexTradeHistoryProps {\n /** Trade records to display */\n trades: ForexTradeRecord[];\n /** Maximum trades to show */\n maxItems?: number;\n /** Show settlement details (clearing/hedging/insurance fees) */\n showSettlementDetails?: boolean;\n /** Show transaction hash */\n showTxHash?: boolean;\n /** Empty state text */\n emptyText?: string;\n /** Custom container style */\n style?: ViewStyle;\n}\n\nexport const OneForexTradeHistory: React.FC<OneForexTradeHistoryProps> = ({\n trades,\n maxItems = 50,\n showSettlementDetails = true,\n showTxHash = true,\n emptyText = 'No trade history yet',\n style,\n}) => {\n const visibleTrades = trades.slice(-maxItems).reverse();\n\n if (visibleTrades.length === 0) {\n return (\n <View style={[styles.empty, style]}>\n <Text style={styles.emptyText}>{emptyText}</Text>\n </View>\n );\n }\n\n return (\n <ScrollView style={[styles.container, style]} contentContainerStyle={styles.scrollContent}>\n {visibleTrades.map((trade) => (\n <View key={trade.id} style={styles.card}>\n <View style={styles.header}>\n <Text style={styles.pair}>{trade.pairSymbol}</Text>\n <View style={[\n styles.sideBadge,\n { backgroundColor: trade.side === 'BUY' ? '#10B98118' : '#EF444418', borderColor: trade.side === 'BUY' ? '#10B98140' : '#EF444440' },\n ]}>\n <Text style={[styles.sideText, { color: trade.side === 'BUY' ? '#10B981' : '#EF4444' }]}>\n {trade.side}\n </Text>\n </View>\n <Text style={[styles.pnl, { color: trade.pnl >= 0 ? '#10B981' : '#EF4444' }]}>\n {trade.pnl >= 0 ? '+' : ''}${trade.pnl.toFixed(2)}\n </Text>\n </View>\n\n <View style={styles.details}>\n <Text style={styles.detail}>\n {trade.lots.toFixed(2)} lots | {trade.pips >= 0 ? '+' : ''}{trade.pips.toFixed(1)} pips\n </Text>\n <Text style={styles.time}>{new Date(trade.timestamp).toLocaleString()}</Text>\n </View>\n\n {showSettlementDetails && trade.clearingFee !== undefined && (\n <View style={styles.settlement}>\n <Text style={styles.settlementText}>\n CLR: ${trade.clearingFee.toFixed(2)} | HDG: ${(trade.hedgingCost || 0).toFixed(2)} | INS: ${(trade.insuranceReserve || 0).toFixed(2)}\n </Text>\n </View>\n )}\n\n {showTxHash && trade.txHash && (\n <Text style={styles.txHash}>\n {trade.txHash.slice(0, 10)}...{trade.txHash.slice(-6)}\n </Text>\n )}\n </View>\n ))}\n </ScrollView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n scrollContent: { paddingBottom: 16 },\n empty: { alignItems: 'center', justifyContent: 'center', padding: 40 },\n emptyText: { fontSize: 14, color: '#666' },\n card: { backgroundColor: '#111111', borderRadius: 6, borderWidth: 1, borderColor: '#1a1a1a', padding: 12, marginBottom: 8 },\n header: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n pair: { fontSize: 13, fontWeight: '600', color: '#ffffff' },\n sideBadge: { paddingHorizontal: 6, paddingVertical: 2, borderRadius: 3, borderWidth: 1 },\n sideText: { fontSize: 9, fontWeight: '700', letterSpacing: 0.5 },\n pnl: { fontFamily: MONO, marginLeft: 'auto', fontSize: 13, fontWeight: '700' },\n details: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 6 },\n detail: { fontFamily: MONO, fontSize: 11, color: '#9ca3af' },\n time: { fontSize: 11, color: '#666' },\n settlement: { marginTop: 6, paddingTop: 6, borderTopWidth: 1, borderTopColor: '#1a1a1a' },\n settlementText: { fontFamily: MONO, fontSize: 10, color: '#666' },\n txHash: { fontFamily: MONO, fontSize: 9, color: '#444', marginTop: 2 },\n});\n","/**\n * ONE SDK - Forex Trading Hooks\n * Provides React hooks for StableFX on-chain forex trading integration\n * Can be used by any ecosystem partner\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type {\n ForexPool,\n ForexPoolType,\n ForexInvestment,\n ForexLogEntry,\n ForexPoolTransaction,\n ForexPoolDailySnapshot,\n ForexTradeRecord,\n} from '../types/forex';\nimport {\n FOREX_POOL_DEFAULTS,\n FOREX_CYCLE_OPTIONS,\n FOREX_AGENT,\n FOREX_CAPITAL_SPLIT,\n computePoolAllocations,\n estimateForexProfit,\n} from '../types/forex';\n\n// ── Configuration ────────────────────────────────────────────────────────────\n\nlet _forexAccessToken: string | null = null;\nlet _forexEngineUrl: string = 'https://api.one23.io';\n\n/** Set the access token for authenticated forex API calls */\nexport function setForexAccessToken(token: string): void {\n _forexAccessToken = token;\n}\n\n/** Clear the forex access token */\nexport function clearForexAccessToken(): void {\n _forexAccessToken = null;\n}\n\n/** Configure the engine URL for forex API calls */\nexport function setForexEngineUrl(url: string): void {\n _forexEngineUrl = url;\n}\n\n// ── Internal API Helper ──────────────────────────────────────────────────────\n\nasync function forexApi<T>(path: string, options?: RequestInit): Promise<T | null> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (_forexAccessToken) {\n headers['Authorization'] = `Bearer ${_forexAccessToken}`;\n }\n const res = await fetch(`${_forexEngineUrl}${path}`, { ...options, headers });\n if (!res.ok) return null;\n const json = await res.json();\n return json?.data ?? json;\n } catch {\n return null;\n }\n}\n\n// ── useForexPools ────────────────────────────────────────────────────────────\n\nexport interface UseForexPoolsResult {\n pools: ForexPool[];\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n}\n\nexport function useForexPools(options?: { refreshInterval?: number }): UseForexPoolsResult {\n const [pools, setPools] = useState<ForexPool[]>(FOREX_POOL_DEFAULTS);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPools = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ pools: any[] }>('/api/forex/pools');\n if (data?.pools) {\n setPools(data.pools.map((p: any) => ({\n id: p.type ?? p.id,\n nameKey: `forex.pool_${p.type ?? p.id}`,\n descriptionKey: `forex.pool_${p.type ?? p.id}_desc`,\n allocation: p.allocation ?? (p.type === 'clearing' ? 0.50 : p.type === 'hedging' ? 0.30 : 0.20),\n totalSize: p.totalSize ?? p.total_size ?? 0,\n utilization: p.utilization ?? 0,\n color: p.type === 'clearing' ? '#3B82F6' : p.type === 'hedging' ? '#F59E0B' : '#10B981',\n apy7d: p.apy7d ?? 0,\n apy30d: p.apy30d ?? 0,\n netFlow24h: p.netFlow24h ?? 0,\n txCount24h: p.txCount24h ?? 0,\n txCountTotal: p.txCountTotal ?? 0,\n totalDeposits: p.totalDeposits ?? 0,\n totalWithdrawals: p.totalWithdrawals ?? 0,\n profitDistributed: p.profitDistributed ?? 0,\n lastUpdated: p.lastUpdated ?? Date.now(),\n })));\n }\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch pools');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchPools();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchPools, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchPools, options?.refreshInterval]);\n\n return { pools, isLoading, error, refresh: fetchPools };\n}\n\n// ── useForexInvestments ──────────────────────────────────────────────────────\n\nexport interface UseForexInvestmentsResult {\n investments: ForexInvestment[];\n isLoading: boolean;\n error: string | null;\n createInvestment: (params: { amount: number; selectedPairs: string[]; cycleDays: number }) => Promise<ForexInvestment | null>;\n redeemInvestment: (investmentId: string) => Promise<boolean>;\n refresh: () => void;\n portfolioSummary: {\n totalInvested: number;\n totalValue: number;\n totalProfit: number;\n activeCount: number;\n };\n}\n\nexport function useForexInvestments(options?: { refreshInterval?: number }): UseForexInvestmentsResult {\n const [investments, setInvestments] = useState<ForexInvestment[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchInvestments = useCallback(async () => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investments: any[] }>('/api/forex/investments');\n if (data?.investments) {\n setInvestments(data.investments.map(mapInvestment));\n }\n setError(null);\n } catch {\n setError('Failed to fetch investments');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const createInvestment = useCallback(async (params: {\n amount: number; selectedPairs: string[]; cycleDays: number;\n }): Promise<ForexInvestment | null> => {\n setIsLoading(true);\n try {\n const data = await forexApi<{ investment: any }>('/api/forex/investments', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n if (data?.investment) {\n const inv = mapInvestment(data.investment);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n }\n // Local fallback\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } catch {\n const inv = createLocalInvestment(params);\n setInvestments(prev => [inv, ...prev]);\n return inv;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const redeemInvestment = useCallback(async (investmentId: string): Promise<boolean> => {\n try {\n await forexApi(`/api/forex/investments/${investmentId}/redeem`, { method: 'POST' });\n setInvestments(prev => prev.map(inv =>\n inv.id === investmentId ? { ...inv, status: 'redeemed' as const } : inv\n ));\n return true;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n fetchInvestments();\n if (options?.refreshInterval) {\n const timer = setInterval(fetchInvestments, options.refreshInterval);\n return () => clearInterval(timer);\n }\n }, [fetchInvestments, options?.refreshInterval]);\n\n const portfolioSummary = useMemo(() => {\n const active = investments.filter(i => i.status === 'active');\n return {\n totalInvested: active.reduce((s, i) => s + i.amount, 0),\n totalValue: active.reduce((s, i) => s + i.currentValue, 0),\n totalProfit: active.reduce((s, i) => s + i.profit, 0),\n activeCount: active.length,\n };\n }, [investments]);\n\n return { investments, isLoading, error, createInvestment, redeemInvestment, refresh: fetchInvestments, portfolioSummary };\n}\n\n// ── useForexSimulation ───────────────────────────────────────────────────────\n\nexport interface UseForexSimulationResult {\n logs: ForexLogEntry[];\n poolTransactions: ForexPoolTransaction[];\n isRunning: boolean;\n stats: { totalPnl: number; totalTrades: number; totalPips: number; totalLots: number };\n start: () => void;\n stop: () => void;\n clearLogs: () => void;\n}\n\nexport function useForexSimulation(options?: { maxLogs?: number }): UseForexSimulationResult {\n const maxLogs = options?.maxLogs ?? 500;\n const [logs, setLogs] = useState<ForexLogEntry[]>([]);\n const [poolTxs, setPoolTxs] = useState<ForexPoolTransaction[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [stats, setStats] = useState({ totalPnl: 0, totalTrades: 0, totalPips: 0, totalLots: 0 });\n const engineRef = useRef<any>(null);\n\n const getEngine = useCallback(() => {\n if (!engineRef.current) {\n try {\n const { forexSimulationEngine } = require('../services/forex/ForexSimulationEngine');\n engineRef.current = forexSimulationEngine;\n } catch { /* not available */ }\n }\n return engineRef.current;\n }, []);\n\n const start = useCallback(() => {\n const engine = getEngine();\n if (!engine) return;\n if (!engine.isRunning()) engine.start();\n setIsRunning(true);\n }, [getEngine]);\n\n const stop = useCallback(() => {\n const engine = getEngine();\n if (engine) engine.stop();\n setIsRunning(false);\n }, [getEngine]);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n setPoolTxs([]);\n }, []);\n\n useEffect(() => {\n const engine = getEngine();\n if (!engine) return;\n\n const unsubLog = engine.onLog((entry: ForexLogEntry) => {\n setLogs(prev => {\n const next = [...prev, entry];\n return next.length > maxLogs ? next.slice(-maxLogs) : next;\n });\n const s = engine.getStats();\n setStats({ totalPnl: s.totalPnl, totalTrades: s.totalTrades, totalPips: s.totalPips, totalLots: s.totalLots });\n });\n\n const unsubTx = engine.onPoolTransaction((tx: ForexPoolTransaction) => {\n setPoolTxs(prev => [...prev.slice(-999), tx]);\n });\n\n return () => {\n unsubLog();\n unsubTx();\n };\n }, [getEngine, maxLogs]);\n\n return { logs, poolTransactions: poolTxs, isRunning, stats, start, stop, clearLogs };\n}\n\n// ── useForexPoolData ─────────────────────────────────────────────────────────\n\nexport interface UseForexPoolDataResult {\n snapshots: Record<ForexPoolType, ForexPoolDailySnapshot[]>;\n transactions: ForexPoolTransaction[];\n isInitialized: boolean;\n initialize: () => void;\n}\n\nexport function useForexPoolData(): UseForexPoolDataResult {\n const [snapshots, setSnapshots] = useState<Record<ForexPoolType, ForexPoolDailySnapshot[]>>({ clearing: [], hedging: [], insurance: [] });\n const [transactions, setTransactions] = useState<ForexPoolTransaction[]>([]);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const initialize = useCallback(() => {\n if (isInitialized) return;\n try {\n const { ForexPoolDataGenerator } = require('../services/forex/ForexPoolDataGenerator');\n const gen = ForexPoolDataGenerator.getInstance();\n setSnapshots(gen.generateAllSnapshots());\n setTransactions(gen.generateAllTransactions());\n setIsInitialized(true);\n } catch { /* not available */ }\n }, [isInitialized]);\n\n return { snapshots, transactions, isInitialized, initialize };\n}\n\n// ── Combined useForexTrading ─────────────────────────────────────────────────\n\nexport interface UseForexTradingResult {\n pools: UseForexPoolsResult;\n investments: UseForexInvestmentsResult;\n simulation: UseForexSimulationResult;\n poolData: UseForexPoolDataResult;\n // Convenience re-exports\n capitalSplit: typeof FOREX_CAPITAL_SPLIT;\n agent: typeof FOREX_AGENT;\n currencyPairs: typeof import('../types/forex').FOREX_CURRENCY_PAIRS;\n cycleOptions: typeof import('../types/forex').FOREX_CYCLE_OPTIONS;\n computePoolAllocations: typeof computePoolAllocations;\n estimateProfit: typeof estimateForexProfit;\n}\n\nexport function useForexTrading(options?: {\n poolRefreshInterval?: number;\n investmentRefreshInterval?: number;\n}): UseForexTradingResult {\n const pools = useForexPools({ refreshInterval: options?.poolRefreshInterval });\n const investments = useForexInvestments({ refreshInterval: options?.investmentRefreshInterval });\n const simulation = useForexSimulation();\n const poolData = useForexPoolData();\n\n return {\n pools,\n investments,\n simulation,\n poolData,\n capitalSplit: FOREX_CAPITAL_SPLIT,\n agent: FOREX_AGENT,\n currencyPairs: require('../types/forex').FOREX_CURRENCY_PAIRS,\n cycleOptions: require('../types/forex').FOREX_CYCLE_OPTIONS,\n computePoolAllocations,\n estimateProfit: estimateForexProfit,\n };\n}\n\n// ── Internal Helpers ─────────────────────────────────────────────────────────\n\nfunction mapInvestment(raw: any): ForexInvestment {\n const cycleDays = raw.cycleDays ?? raw.cycle_days ?? 90;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const amount = typeof raw.amount === 'string' ? parseFloat(raw.amount) : (raw.amount ?? 0);\n const allocs = computePoolAllocations(amount);\n\n return {\n id: raw.id,\n userId: raw.userId ?? raw.user_id,\n amount,\n currentValue: raw.currentValue ?? raw.current_value ?? amount,\n profit: raw.profit ?? 0,\n status: raw.status ?? 'active',\n selectedPairs: raw.selectedPairs ?? raw.selected_pairs ?? [],\n cycleDays,\n cycleOption,\n feeRate: raw.feeRate ?? cycleOption.feeRate,\n commissionRate: raw.commissionRate ?? cycleOption.commissionRate,\n startDate: raw.startDate ?? raw.start_date ?? new Date().toISOString(),\n endDate: raw.endDate ?? raw.end_date ?? '',\n tradingCapital: raw.tradingCapital ?? allocs.tradingCapital,\n totalPoolReserves: raw.totalPoolReserves ?? allocs.totalPoolReserves,\n poolAllocations: raw.poolAllocations ?? {\n clearing: allocs.clearing,\n hedging: allocs.hedging,\n insurance: allocs.insurance,\n },\n tradeWeight: raw.tradeWeight ?? 0,\n totalLots: raw.totalLots ?? 0,\n totalPips: raw.totalPips ?? 0,\n totalTrades: raw.totalTrades ?? 0,\n positions: raw.positions ?? [],\n tradeHistory: raw.tradeHistory ?? [],\n redeemedAt: raw.redeemedAt,\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt,\n };\n}\n\nfunction createLocalInvestment(params: { amount: number; selectedPairs: string[]; cycleDays: number }): ForexInvestment {\n const { amount, selectedPairs, cycleDays } = params;\n const cycleOption = FOREX_CYCLE_OPTIONS.find(c => c.days === cycleDays) || FOREX_CYCLE_OPTIONS[2];\n const allocs = computePoolAllocations(amount);\n const now = new Date();\n const endDate = new Date(now);\n endDate.setDate(endDate.getDate() + cycleDays);\n\n return {\n id: `fx_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n amount,\n currentValue: amount,\n profit: 0,\n status: 'active',\n selectedPairs,\n cycleDays,\n cycleOption,\n startDate: now.toISOString(),\n endDate: endDate.toISOString(),\n tradingCapital: allocs.tradingCapital,\n totalPoolReserves: allocs.totalPoolReserves,\n poolAllocations: { clearing: allocs.clearing, hedging: allocs.hedging, insurance: allocs.insurance },\n tradeWeight: 0,\n totalLots: 0,\n totalPips: 0,\n totalTrades: 0,\n positions: [],\n tradeHistory: [],\n };\n}\n","/**\n * ONE SDK - React Native Entry Point\n *\n * This file exports SDK features optimized for React Native usage.\n * It excludes web-specific features and includes mobile-specific utilities.\n */\n\n// ===== Configuration =====\nexport { initOneSDK, getConfig, CHAIN_CONFIGS, TOKEN_NAMES, COINGECKO_IDS } from './config';\nexport type { OneConfig } from './config';\n\n// ===== Types =====\nexport * from './types';\n\n// ===== ONE Engine Client =====\nimport { OneEngineClient as _OneEngineClient, createOneEngineClient } from './services/engine';\nexport { _OneEngineClient as OneEngineClient, createOneEngineClient };\n\nexport type {\n EngineAuthResponse,\n EngineWalletBalance,\n EngineTransactionRequest,\n EngineTransactionResponse,\n OnrampSessionRequest,\n OnrampSession,\n OnrampQuote,\n OnrampTransaction,\n SwapQuoteRequest,\n SwapQuote,\n SwapExecuteRequest,\n SwapResult,\n} from './services/engine';\n\n// ===== Price Service =====\nexport { PriceService, priceService } from './services/price';\n\n// ===== Utilities =====\nexport {\n // Address\n shortenAddress,\n isValidAddress,\n checksumAddress,\n // Numbers\n formatNumber,\n formatUSD,\n formatPercent,\n formatTokenAmount,\n // Date/Time\n formatDate,\n formatDateTime,\n formatRelativeTime,\n // Validation\n isValidEmail,\n isValidPhone,\n // Strings\n capitalize,\n truncate,\n slugify,\n // Async\n sleep,\n retry,\n // Objects\n omit,\n pick,\n // Errors\n OneSDKError,\n isOneSDKError,\n} from './utils';\n\n// ===== AI Trading Components =====\n// React Native components for AI trading integration\nexport {\n OneChainSelector,\n CHAIN_CONFIG,\n} from './components/ai/OneChainSelector';\nexport type { OneChainSelectorProps } from './components/ai/OneChainSelector';\n\nexport { OneTierSelector } from './components/ai/OneTierSelector';\nexport type { OneTierSelectorProps, Tier } from './components/ai/OneTierSelector';\n\nexport {\n OneCycleSelector,\n DEFAULT_SHARE_RATES,\n} from './components/ai/OneCycleSelector';\nexport type { OneCycleSelectorProps } from './components/ai/OneCycleSelector';\n\nexport {\n OnePairSelector,\n PAIR_ICONS,\n} from './components/ai/OnePairSelector';\nexport type { OnePairSelectorProps } from './components/ai/OnePairSelector';\n\n// ===== StableFX Forex Components =====\nexport { OneForexPoolCard } from './components/ai/OneForexPoolCard';\nexport type { OneForexPoolCardProps } from './components/ai/OneForexPoolCard';\n\nexport { OneForexCapitalSplit } from './components/ai/OneForexCapitalSplit';\nexport type { OneForexCapitalSplitProps } from './components/ai/OneForexCapitalSplit';\n\nexport { OneForexConsoleView } from './components/ai/OneForexConsoleView';\nexport type { OneForexConsoleViewProps } from './components/ai/OneForexConsoleView';\n\nexport { OneForexPairSelector } from './components/ai/OneForexPairSelector';\nexport type { OneForexPairSelectorProps } from './components/ai/OneForexPairSelector';\n\nexport { OneForexTradeHistory } from './components/ai/OneForexTradeHistory';\nexport type { OneForexTradeHistoryProps } from './components/ai/OneForexTradeHistory';\n\n// ===== Forex Hooks =====\nexport {\n useForexPools,\n useForexInvestments,\n useForexSimulation,\n useForexPoolData,\n useForexTrading,\n setForexAccessToken,\n clearForexAccessToken,\n setForexEngineUrl,\n} from './hooks/useForexTrading';\n\nexport type {\n UseForexPoolsResult,\n UseForexInvestmentsResult,\n UseForexSimulationResult,\n UseForexPoolDataResult,\n UseForexTradingResult,\n} from './hooks/useForexTrading';\n\n// ===== Forex Services =====\nexport { forexSimulationEngine } from './services/forex/ForexSimulationEngine';\nexport { ForexPoolDataGenerator } from './services/forex/ForexPoolDataGenerator';\nexport { botSimulationEngine } from './services/forex/BotSimulationEngine';\n\n// ===== React Native Specific Utilities =====\n\n/**\n * Storage adapter interface for React Native\n * Implement this with AsyncStorage or other storage solutions\n */\nexport interface StorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Create a cached engine client with persistent storage\n */\nexport function createCachedEngineClient(\n storage: StorageAdapter,\n options?: {\n baseUrl?: string;\n clientId?: string;\n secretKey?: string;\n }\n) {\n const client = createOneEngineClient(options);\n\n // Wrapper with token persistence\n return {\n ...client,\n\n /**\n * Initialize with stored token\n */\n async initialize(): Promise<boolean> {\n const token = await storage.getItem('one_access_token');\n if (token) {\n client.setAccessToken(token);\n return true;\n }\n return false;\n },\n\n /**\n * Login and persist token\n */\n async login(email: string, otp: string) {\n const result = await client.verifyEmailOtp(email, otp);\n if (result.success && result.data?.accessToken) {\n await storage.setItem('one_access_token', result.data.accessToken);\n if (result.data.refreshToken) {\n await storage.setItem('one_refresh_token', result.data.refreshToken);\n }\n }\n return result;\n },\n\n /**\n * Logout and clear stored tokens\n */\n async logout() {\n await client.signOut();\n await storage.removeItem('one_access_token');\n await storage.removeItem('one_refresh_token');\n client.clearAccessToken();\n },\n\n /**\n * Refresh token from storage\n */\n async refreshFromStorage() {\n const refreshToken = await storage.getItem('one_refresh_token');\n if (refreshToken) {\n const result = await client.refreshToken(refreshToken);\n if (result.success && result.data?.accessToken) {\n await storage.setItem('one_access_token', result.data.accessToken);\n if (result.data.refreshToken) {\n await storage.setItem('one_refresh_token', result.data.refreshToken);\n }\n return true;\n }\n }\n return false;\n },\n\n // Expose underlying client\n getClient: () => client,\n };\n}\n\n/**\n * Deep linking handler for ONE SDK\n */\nexport interface DeepLinkHandler {\n /**\n * Parse deep link URL\n */\n parse(url: string): {\n type: 'onramp_callback' | 'wallet_connect' | 'payment' | 'unknown';\n params: Record<string, string>;\n };\n\n /**\n * Generate deep link URL\n */\n generate(type: string, params: Record<string, string>): string;\n}\n\nexport function createDeepLinkHandler(scheme: string = 'onewallet'): DeepLinkHandler {\n return {\n parse(url: string) {\n try {\n const urlObj = new URL(url);\n const path = urlObj.pathname.replace(/^\\//, '');\n const params: Record<string, string> = {};\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n let type: 'onramp_callback' | 'wallet_connect' | 'payment' | 'unknown' = 'unknown';\n\n if (path.includes('onramp') || path.includes('callback')) {\n type = 'onramp_callback';\n } else if (path.includes('wc') || path.includes('walletconnect')) {\n type = 'wallet_connect';\n } else if (path.includes('pay') || path.includes('payment')) {\n type = 'payment';\n }\n\n return { type, params };\n } catch {\n return { type: 'unknown', params: {} };\n }\n },\n\n generate(type: string, params: Record<string, string>): string {\n const searchParams = new URLSearchParams(params);\n return `${scheme}://${type}?${searchParams.toString()}`;\n },\n };\n}\n\n/**\n * Biometric authentication helper types\n */\nexport interface BiometricConfig {\n promptMessage: string;\n cancelButtonText?: string;\n fallbackLabel?: string;\n}\n\nexport interface BiometricResult {\n success: boolean;\n error?: string;\n}\n\n/**\n * QR Code scanning result types\n */\nexport interface QRScanResult {\n type: 'address' | 'wallet_connect' | 'payment_request' | 'unknown';\n data: string;\n parsed?: {\n address?: string;\n chainId?: number;\n amount?: string;\n token?: string;\n message?: string;\n };\n}\n\n/**\n * Parse QR code data for wallet operations\n */\nexport function parseQRCode(data: string): QRScanResult {\n // Ethereum address\n if (/^0x[a-fA-F0-9]{40}$/.test(data)) {\n return {\n type: 'address',\n data,\n parsed: { address: data },\n };\n }\n\n // EIP-681 payment request (ethereum:0x...?value=...&token=...)\n if (data.startsWith('ethereum:')) {\n const match = data.match(/^ethereum:(0x[a-fA-F0-9]{40})(?:@(\\d+))?(?:\\?(.*))?$/);\n if (match) {\n const [, address, chainId, queryString] = match;\n const params = new URLSearchParams(queryString || '');\n return {\n type: 'payment_request',\n data,\n parsed: {\n address,\n chainId: chainId ? parseInt(chainId) : undefined,\n amount: params.get('value') || undefined,\n token: params.get('token') || undefined,\n message: params.get('message') || undefined,\n },\n };\n }\n }\n\n // WalletConnect URI\n if (data.startsWith('wc:')) {\n return {\n type: 'wallet_connect',\n data,\n };\n }\n\n return { type: 'unknown', data };\n}\n\n/**\n * Format crypto amount for display on mobile\n */\nexport function formatCryptoAmount(\n amount: number | string,\n symbol: string,\n options: {\n maxDecimals?: number;\n showSymbol?: boolean;\n compact?: boolean;\n } = {}\n): string {\n const { maxDecimals = 6, showSymbol = true, compact = false } = options;\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n\n if (isNaN(num)) return showSymbol ? `0 ${symbol}` : '0';\n\n let formatted: string;\n\n if (compact && num >= 1000000) {\n formatted = (num / 1000000).toFixed(2) + 'M';\n } else if (compact && num >= 1000) {\n formatted = (num / 1000).toFixed(2) + 'K';\n } else if (num < 0.000001 && num > 0) {\n formatted = '<0.000001';\n } else {\n const decimals = num < 1 ? maxDecimals : Math.min(maxDecimals, 4);\n formatted = num.toFixed(decimals).replace(/\\.?0+$/, '');\n }\n\n return showSymbol ? `${formatted} ${symbol}` : formatted;\n}\n\n/**\n * Generate share content for transactions\n */\nexport function generateShareContent(params: {\n type: 'receive' | 'payment_request' | 'transaction';\n address?: string;\n amount?: string;\n token?: string;\n txHash?: string;\n chainId?: number;\n}): { title: string; message: string; url?: string } {\n const { type, address, amount, token, txHash, chainId } = params;\n\n switch (type) {\n case 'receive':\n return {\n title: 'My Wallet Address',\n message: `Send ${token || 'crypto'} to my wallet:\\n${address}`,\n url: address ? `ethereum:${address}${chainId ? `@${chainId}` : ''}` : undefined,\n };\n\n case 'payment_request':\n return {\n title: 'Payment Request',\n message: `Please send ${amount} ${token} to:\\n${address}`,\n url: `ethereum:${address}${chainId ? `@${chainId}` : ''}?value=${amount}${token ? `&token=${token}` : ''}`,\n };\n\n case 'transaction':\n return {\n title: 'Transaction Sent',\n message: `Transaction confirmed!\\nHash: ${txHash}`,\n url: txHash ? getExplorerUrl(chainId || 1, txHash, 'tx') : undefined,\n };\n\n default:\n return { title: '', message: '' };\n }\n}\n\n/**\n * Get block explorer URL\n */\nexport function getExplorerUrl(\n chainId: number,\n hash: string,\n type: 'tx' | 'address' | 'token' = 'tx'\n): string {\n const explorers: Record<number, string> = {\n 1: 'https://etherscan.io',\n 137: 'https://polygonscan.com',\n 42161: 'https://arbiscan.io',\n 10: 'https://optimistic.etherscan.io',\n 8453: 'https://basescan.org',\n 56: 'https://bscscan.com',\n 43114: 'https://snowtrace.io',\n };\n\n const baseUrl = explorers[chainId] || explorers[1];\n return `${baseUrl}/${type}/${hash}`;\n}\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"]}