/** * Spot-Perp Executor — handles ALL exchange interactions for spot-perp arbitrage. * * Stateless except for spot adapter cache. Never makes trading decisions. * Strategy calls executor methods; executor handles error recovery / rollback. */ import type { ExchangeAdapter } from "../../exchanges/index.js"; import type { SpotAdapter } from "../../exchanges/spot-interface.js"; export interface ExecutionResult { success: boolean; size?: string; notional?: number; error?: string; } export declare class SpotPerpExecutor { private _spotAdapterCache; /** Get or create cached spot adapter. */ getSpotAdapter(name: string, adapter: ExchangeAdapter): Promise; /** Transfer USDC: perp -> spot account. */ transferToSpot(spotAdapter: SpotAdapter, exchange: string, amount: number): Promise; /** Transfer USDC: spot -> perp account. */ transferToPerp(spotAdapter: SpotAdapter, exchange: string, amount: number): Promise; /** * Full spot-perp entry flow: * 1. Check liquidity * 2. Compute matched size * 3. Set leverage on perp * 4. Transfer USDC to spot (only the shortfall, track actual transferred) * 5. Buy spot * 6. Short perp * 7. Verify positions * On failure: rollback all completed steps. */ openPosition(params: { symbol: string; perpSymbol: string; spotExchange: string; perpExchange: string; spotAdapter: SpotAdapter; perpAdapter: ExchangeAdapter; sizeUsd: number; leverage: number; log: (msg: string) => void; }): Promise; /** * Full spot-perp close flow: * 1. Close perp short FIRST (reduceOnly) — hedge stays intact if this fails * 2. Sell spot * 3. Transfer USDC back to perp (always, not just same-exchange) */ closePosition(params: { symbol: string; spotExchange: string; perpExchange: string; spotAdapter: SpotAdapter; perpAdapter: ExchangeAdapter; size: string; log: (msg: string) => void; }): Promise; /** * Rotate perp short to better exchange: * 1. Set leverage on new exchange * 2. Close current perp short (reduceOnly) * 3. Open new perp short on new exchange * 4. Rollback if new short fails * Spot stays unchanged. */ rotateShort(params: { symbol: string; perpSymbol: string; currentExchange: string; newExchange: string; currentAdapter: ExchangeAdapter; newAdapter: ExchangeAdapter; size: string; leverage: number; log: (msg: string) => void; }): Promise; }