import { WatchedWallet, RawWalletTransaction, CopySignal, Trade, SimulatedExecution, EventJournalEntry, } from './models.js'; // Clock types and interfaces export interface IClock { now(): Date; } export class SystemClock implements IClock { now(): Date { return new Date(); } } // Wallet Watcher types and interfaces export interface WalletTransactionObservation { signature: string; slot: number; walletAddress: string; tokenMint?: string | null; side?: 'buy' | 'sell' | null; amountSol?: number | null; tokenAmount?: number | null; timestamp: Date; correlationId?: string; } export interface IWalletWatcher { startWatching(): Promise; stopWatching(): Promise; onObservation(callback: (obs: WalletTransactionObservation) => Promise): void; } // Market Data types and interfaces export interface MarketQuote { tokenMint: string; priceSol: number; timestamp: Date; } export interface IMarketDataProvider { getQuote(tokenMint: string, timestamp: Date): Promise; } // Strategy Engine interface export interface StrategyEvaluationResult { shouldCopy: boolean; reason: string; } export interface IStrategyEngine { name: string; version: string; evaluate(signal: CopySignal): Promise; } // Trade Executor types and interfaces export interface ExecutionResult { priceSol: number; tokenAmount: number; amountSol: number; timestamp: Date; } export interface ITradeExecutor { executeEntry( signal: CopySignal, latencyScenario: number, positionSizeSol: number, ): Promise; executeExit(trade: Trade): Promise; } // Repository Interfaces export interface IWalletRepository { getWatchedWallets(): Promise; isWalletWatched(address: string): Promise; addWatchedWallet( wallet: Omit, ): Promise; } export interface ICopySignalRepository { saveSignal(signal: CopySignal): Promise; getSignalByCorrelationId(correlationId: string): Promise; } export interface IRawWalletTransactionRepository { saveTransaction(tx: RawWalletTransaction): Promise; getTransactionBySignature(signature: string): Promise; } export interface ITradeRepository { saveTrade(trade: Trade): Promise; updateTrade(trade: Trade): Promise; getTradeByCorrelationIdAndScenario( correlationId: string, latencyScenario: number, ): Promise; getActiveTradesForScenario(latencyScenario: number): Promise; getTradeById(id: string): Promise; getTradesForScenario(latencyScenario: number): Promise; } export interface ISimulationExecutionRepository { saveExecution(execution: SimulatedExecution): Promise; getExecutionsByTradeId(tradeId: string): Promise; getPendingExecutionsBefore(timestamp: Date): Promise; updateExecution(execution: SimulatedExecution): Promise; } export interface IEventJournalRepository { logEvent(entry: EventJournalEntry): Promise; getEventsByCorrelationId(correlationId: string): Promise; } // Metrics interface export interface IMetricsProvider { recordWalletDetectionLatency(latencyMs: number, wallet: string): void; recordSignalProcessingLatency(latencyMs: number): void; recordQuoteLatency(latencyMs: number, provider: string): void; recordExecutionLatency(latencyMs: number, scenario: number): void; recordPrice(tokenMint: string, priceSol: number): void; recordPortfolioBalance(balanceSol: number, scenario: number): void; recordTradePnl(pnlSol: number, scenario: number, tokenMint: string): void; recordExcursion(mfeSol: number, maeSol: number, scenario: number, tokenMint: string): void; }