@t402/smart-router 1.0.0-beta.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/execution/types.ts","../src/execution/builder.ts","../src/execution/mev.ts"],"sourcesContent":["import { z } from 'zod';\nimport { Route } from '../routing/types.js';\n\n/**\n * Transaction status\n */\nexport const TransactionStatus = z.enum([\n 'pending',\n 'submitted',\n 'confirmed',\n 'failed',\n 'replaced',\n]);\nexport type TransactionStatus = z.infer<typeof TransactionStatus>;\n\n/**\n * MEV protection strategy\n */\nexport const MevProtectionStrategy = z.enum([\n 'none', // No protection\n 'flashbots', // Use Flashbots (Ethereum)\n 'private_mempool', // Use private mempool\n 'timing', // Submit at optimal time\n 'splitting', // Split into smaller transactions\n]);\nexport type MevProtectionStrategy = z.infer<typeof MevProtectionStrategy>;\n\n/**\n * Transaction request\n */\nexport const TransactionRequest = z.object({\n to: z.string(),\n data: z.string(),\n value: z.string().default('0'),\n gasLimit: z.string(),\n maxFeePerGas: z.string().optional(),\n maxPriorityFeePerGas: z.string().optional(),\n gasPrice: z.string().optional(),\n nonce: z.number().optional(),\n chainId: z.number(),\n});\nexport type TransactionRequest = z.infer<typeof TransactionRequest>;\n\n/**\n * Signed transaction\n */\nexport const SignedTransaction = z.object({\n raw: z.string(),\n hash: z.string(),\n from: z.string(),\n to: z.string(),\n nonce: z.number(),\n gasLimit: z.string(),\n value: z.string(),\n});\nexport type SignedTransaction = z.infer<typeof SignedTransaction>;\n\n/**\n * Transaction receipt\n */\nexport const TransactionReceipt = z.object({\n hash: z.string(),\n status: TransactionStatus,\n blockNumber: z.number().optional(),\n blockHash: z.string().optional(),\n gasUsed: z.string().optional(),\n effectiveGasPrice: z.string().optional(),\n logs: z.array(z.object({\n address: z.string(),\n topics: z.array(z.string()),\n data: z.string(),\n })).optional(),\n timestamp: z.number(),\n});\nexport type TransactionReceipt = z.infer<typeof TransactionReceipt>;\n\n/**\n * Execution step result\n */\nexport const ExecutionStepResult = z.object({\n stepId: z.string(),\n status: TransactionStatus,\n transaction: TransactionReceipt.optional(),\n actualOutput: z.string().optional(),\n error: z.string().optional(),\n startedAt: z.number(),\n completedAt: z.number().optional(),\n});\nexport type ExecutionStepResult = z.infer<typeof ExecutionStepResult>;\n\n/**\n * Route execution result\n */\nexport const ExecutionResult = z.object({\n routeId: z.string(),\n status: z.enum(['pending', 'partial', 'completed', 'failed', 'reverted']),\n steps: z.array(ExecutionStepResult),\n actualOutput: z.string().optional(),\n totalGasUsed: z.string().optional(),\n totalGasCost: z.string().optional(),\n error: z.string().optional(),\n startedAt: z.number(),\n completedAt: z.number().optional(),\n});\nexport type ExecutionResult = z.infer<typeof ExecutionResult>;\n\n/**\n * Execution options\n */\nexport const ExecutionOptions = z.object({\n // Gas settings\n gasSpeed: z.enum(['slow', 'standard', 'fast', 'instant']).default('standard'),\n maxGasPrice: z.string().optional(),\n\n // MEV protection\n mevProtection: MevProtectionStrategy.default('none'),\n flashbotsRelay: z.string().optional(),\n\n // Retry settings\n maxRetries: z.number().default(3),\n retryDelay: z.number().default(5000), // ms\n\n // Timeout\n timeout: z.number().default(300000), // 5 minutes\n\n // Simulation\n simulate: z.boolean().default(true),\n\n // Approval handling\n autoApprove: z.boolean().default(true),\n approvalBuffer: z.string().default('0'), // Extra approval amount\n});\nexport type ExecutionOptions = z.infer<typeof ExecutionOptions>;\n\n/**\n * Simulation result\n */\nexport const SimulationResult = z.object({\n success: z.boolean(),\n gasUsed: z.string(),\n output: z.string().optional(),\n error: z.string().optional(),\n logs: z.array(z.object({\n address: z.string(),\n topics: z.array(z.string()),\n data: z.string(),\n })),\n stateChanges: z.array(z.object({\n address: z.string(),\n key: z.string(),\n before: z.string(),\n after: z.string(),\n })).optional(),\n});\nexport type SimulationResult = z.infer<typeof SimulationResult>;\n\n/**\n * Fallback route\n */\nexport interface FallbackRoute {\n route: Route;\n reason: string;\n priority: number;\n}\n\n/**\n * Execution context for tracking state\n */\nexport interface ExecutionContext {\n routeId: string;\n sender: string;\n currentStep: number;\n completedSteps: ExecutionStepResult[];\n options: ExecutionOptions;\n startedAt: number;\n fallbackRoutes: FallbackRoute[];\n}\n","import { Route, RouteStep } from '../routing/types.js';\nimport { TransactionRequest, ExecutionOptions } from './types.js';\nimport { GasOracle } from '../pricing/gas.js';\n\n/**\n * Chain ID mapping (CAIP-2 to numeric)\n */\nconst CHAIN_IDS: Record<string, number> = {\n 'eip155:1': 1, // Ethereum\n 'eip155:8453': 8453, // Base\n 'eip155:42161': 42161, // Arbitrum\n 'eip155:10': 10, // Optimism\n 'eip155:137': 137, // Polygon\n 'eip155:56': 56, // BSC\n 'eip155:43114': 43114, // Avalanche\n};\n\n/**\n * Common contract ABIs (simplified function selectors)\n */\nconst FUNCTION_SELECTORS = {\n // ERC20\n transfer: '0xa9059cbb',\n approve: '0x095ea7b3',\n transferFrom: '0x23b872dd',\n\n // Uniswap V2 Router\n swapExactTokensForTokens: '0x38ed1739',\n swapTokensForExactTokens: '0x8803dbee',\n\n // Uniswap V3 Router\n exactInputSingle: '0x414bf389',\n exactInput: '0xc04b8d59',\n\n // WETH\n deposit: '0xd0e30db0',\n withdraw: '0x2e1a7d4d',\n};\n\n/**\n * Transaction builder configuration\n */\nexport interface BuilderConfig {\n defaultGasBuffer?: number; // Percentage buffer for gas estimates\n}\n\n/**\n * Transaction builder - converts route steps to executable transactions\n */\nexport class TransactionBuilder {\n private gasOracle: GasOracle;\n private config: Required<BuilderConfig>;\n\n constructor(gasOracle: GasOracle, config: BuilderConfig = {}) {\n this.gasOracle = gasOracle;\n this.config = {\n defaultGasBuffer: config.defaultGasBuffer ?? 20, // 20% buffer\n };\n }\n\n /**\n * Build all transactions for a route\n */\n async buildRoute(\n route: Route,\n sender: string,\n options: ExecutionOptions,\n ): Promise<TransactionRequest[]> {\n const transactions: TransactionRequest[] = [];\n\n for (const step of route.steps) {\n const tx = await this.buildStep(step, sender, options);\n transactions.push(tx);\n }\n\n return transactions;\n }\n\n /**\n * Build a single step transaction\n */\n async buildStep(\n step: RouteStep,\n sender: string,\n options: ExecutionOptions,\n ): Promise<TransactionRequest> {\n const chainId = CHAIN_IDS[step.chain];\n if (!chainId) {\n throw new BuilderError(`Unsupported chain: ${step.chain}`, 'UNSUPPORTED_CHAIN');\n }\n\n // Get gas price\n const gasPrice = await this.gasOracle.getGasPrice(step.chain);\n const gasPriceWei = gasPrice[options.gasSpeed];\n\n // Apply max gas price limit\n let finalGasPrice = gasPriceWei;\n if (options.maxGasPrice && BigInt(gasPriceWei) > BigInt(options.maxGasPrice)) {\n finalGasPrice = options.maxGasPrice;\n }\n\n // Build calldata based on step type\n const { data, value } = this.buildCalldata(step, sender);\n\n // Apply gas buffer\n const gasWithBuffer = this.applyGasBuffer(step.estimatedGas);\n\n // Determine gas price format (EIP-1559 or legacy)\n const isEip1559 = gasPrice.baseFee !== undefined;\n\n const tx: TransactionRequest = {\n to: step.contract,\n data,\n value: value ?? '0',\n gasLimit: gasWithBuffer,\n chainId,\n };\n\n if (isEip1559 && gasPrice.priorityFee) {\n tx.maxFeePerGas = finalGasPrice;\n tx.maxPriorityFeePerGas = gasPrice.priorityFee[options.gasSpeed];\n } else {\n tx.gasPrice = finalGasPrice;\n }\n\n return tx;\n }\n\n /**\n * Build approval transaction if needed\n */\n buildApproval(\n tokenAddress: string,\n spender: string,\n amount: string,\n _chainId: string,\n infinite: boolean = false,\n ): { data: string; to: string } {\n const approvalAmount = infinite\n ? 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n : BigInt(amount).toString(16).padStart(64, '0');\n\n const data =\n FUNCTION_SELECTORS.approve +\n spender.slice(2).padStart(64, '0').toLowerCase() +\n approvalAmount;\n\n return {\n to: tokenAddress,\n data,\n };\n }\n\n /**\n * Build transfer transaction\n */\n buildTransfer(\n tokenAddress: string,\n recipient: string,\n amount: string,\n ): { data: string; to: string } {\n const data =\n FUNCTION_SELECTORS.transfer +\n recipient.slice(2).padStart(64, '0').toLowerCase() +\n BigInt(amount).toString(16).padStart(64, '0');\n\n return {\n to: tokenAddress,\n data,\n };\n }\n\n /**\n * Estimate required approvals for a route\n */\n getRequiredApprovals(\n route: Route,\n _sender: string,\n ): Array<{ token: string; spender: string; amount: string }> {\n const approvals: Array<{ token: string; spender: string; amount: string }> = [];\n const approvedPairs = new Set<string>();\n\n for (const step of route.steps) {\n if (step.type === 'approve') continue;\n\n const key = `${step.inputAsset}:${step.contract}`;\n if (approvedPairs.has(key)) continue;\n\n approvals.push({\n token: step.inputAsset,\n spender: step.contract,\n amount: step.inputAmount,\n });\n approvedPairs.add(key);\n }\n\n return approvals;\n }\n\n private buildCalldata(\n step: RouteStep,\n sender: string,\n ): { data: string; value?: string } {\n switch (step.type) {\n case 'transfer':\n return this.buildTransferCalldata(step);\n\n case 'approve':\n return this.buildApproveCalldata(step);\n\n case 'swap':\n return this.buildSwapCalldata(step, sender);\n\n case 'bridge':\n return this.buildBridgeCalldata(step, sender);\n\n case 'wrap':\n return this.buildWrapCalldata(step);\n\n case 'unwrap':\n return this.buildUnwrapCalldata(step);\n\n case 'deposit':\n case 'withdraw':\n return { data: step.calldata ?? '0x', value: step.value };\n\n default:\n throw new BuilderError(`Unknown step type: ${step.type}`, 'UNKNOWN_STEP_TYPE');\n }\n }\n\n private buildTransferCalldata(step: RouteStep): { data: string } {\n const data =\n FUNCTION_SELECTORS.transfer +\n step.contract.slice(2).padStart(64, '0').toLowerCase() +\n BigInt(step.inputAmount).toString(16).padStart(64, '0');\n\n return { data };\n }\n\n private buildApproveCalldata(step: RouteStep): { data: string } {\n const data =\n FUNCTION_SELECTORS.approve +\n step.contract.slice(2).padStart(64, '0').toLowerCase() +\n BigInt(step.inputAmount).toString(16).padStart(64, '0');\n\n return { data };\n }\n\n private buildSwapCalldata(step: RouteStep, sender: string): { data: string; value?: string } {\n // Simplified Uniswap V2 style swap\n // In production, would need to handle different DEX interfaces\n\n const deadline = Math.floor(Date.now() / 1000) + 1800; // 30 minutes\n\n // swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] path, address to, uint deadline)\n const amountIn = BigInt(step.inputAmount).toString(16).padStart(64, '0');\n const amountOutMin = BigInt(step.minOutputAmount).toString(16).padStart(64, '0');\n const pathOffset = '00000000000000000000000000000000000000000000000000000000000000a0'; // offset to path array\n const to = sender.slice(2).padStart(64, '0').toLowerCase();\n const deadlineHex = deadline.toString(16).padStart(64, '0');\n\n // Path array\n const pathLength = '0000000000000000000000000000000000000000000000000000000000000002';\n const token0 = step.inputAsset.slice(2).padStart(64, '0').toLowerCase();\n const token1 = step.outputAsset.slice(2).padStart(64, '0').toLowerCase();\n\n const data =\n FUNCTION_SELECTORS.swapExactTokensForTokens +\n amountIn +\n amountOutMin +\n pathOffset +\n to +\n deadlineHex +\n pathLength +\n token0 +\n token1;\n\n return { data };\n }\n\n private buildBridgeCalldata(step: RouteStep, _sender: string): { data: string; value?: string } {\n // Bridge calldata would be protocol-specific\n // Using placeholder that would be replaced with actual bridge interface\n return {\n data: step.calldata ?? '0x',\n value: step.value,\n };\n }\n\n private buildWrapCalldata(step: RouteStep): { data: string; value: string } {\n // WETH deposit\n return {\n data: FUNCTION_SELECTORS.deposit,\n value: step.inputAmount,\n };\n }\n\n private buildUnwrapCalldata(step: RouteStep): { data: string } {\n // WETH withdraw\n const data =\n FUNCTION_SELECTORS.withdraw +\n BigInt(step.inputAmount).toString(16).padStart(64, '0');\n\n return { data };\n }\n\n private applyGasBuffer(gasEstimate: string): string {\n const gas = BigInt(gasEstimate);\n const buffer = BigInt(this.config.defaultGasBuffer);\n return (gas + (gas * buffer / 100n)).toString();\n }\n}\n\n/**\n * Builder error codes\n */\nexport type BuilderErrorCode =\n | 'UNSUPPORTED_CHAIN'\n | 'UNKNOWN_STEP_TYPE'\n | 'INVALID_CALLDATA';\n\n/**\n * Custom error for builder operations\n */\nexport class BuilderError extends Error {\n code: BuilderErrorCode;\n\n constructor(message: string, code: BuilderErrorCode) {\n super(message);\n this.name = 'BuilderError';\n this.code = code;\n }\n}\n","import {\n TransactionRequest,\n SignedTransaction,\n MevProtectionStrategy,\n SimulationResult,\n} from './types.js';\nimport { ChainId } from '../routing/types.js';\n\n/**\n * MEV protection configuration\n */\nexport interface MevProtectionConfig {\n flashbotsRelay?: string;\n privateRpcUrls?: Record<ChainId, string>;\n simulationRpc?: string;\n maxBundleSize?: number;\n}\n\n/**\n * Bundle submission result\n */\nexport interface BundleResult {\n bundleHash: string;\n submitted: boolean;\n simulationResult?: SimulationResult;\n error?: string;\n}\n\n/**\n * MEV protection service\n */\nexport class MevProtection {\n private config: Required<MevProtectionConfig>;\n\n constructor(config: MevProtectionConfig = {}) {\n this.config = {\n flashbotsRelay: config.flashbotsRelay ?? 'https://relay.flashbots.net',\n privateRpcUrls: config.privateRpcUrls ?? {},\n simulationRpc: config.simulationRpc ?? '',\n maxBundleSize: config.maxBundleSize ?? 5,\n };\n }\n\n /**\n * Apply MEV protection to a transaction\n */\n async protect(\n _tx: TransactionRequest,\n signedTx: SignedTransaction,\n strategy: MevProtectionStrategy,\n chain: ChainId,\n ): Promise<{ method: string; endpoint?: string; bundleHash?: string }> {\n switch (strategy) {\n case 'none':\n return { method: 'public_mempool' };\n\n case 'flashbots':\n return this.useFlashbots(signedTx, chain);\n\n case 'private_mempool':\n return this.usePrivateMempool(signedTx, chain);\n\n case 'timing':\n return this.useTimingProtection(signedTx, chain);\n\n case 'splitting':\n return { method: 'splitting', bundleHash: 'split-not-implemented' };\n\n default:\n return { method: 'public_mempool' };\n }\n }\n\n /**\n * Submit transaction bundle to Flashbots\n */\n async submitBundle(\n signedTxs: SignedTransaction[],\n targetBlock: number,\n _chain: ChainId,\n ): Promise<BundleResult> {\n if (signedTxs.length > this.config.maxBundleSize) {\n return {\n bundleHash: '',\n submitted: false,\n error: `Bundle size ${signedTxs.length} exceeds max ${this.config.maxBundleSize}`,\n };\n }\n\n // In production, would actually submit to Flashbots\n const bundleHash = this.generateBundleHash(signedTxs, targetBlock);\n\n // Mock simulation\n const simulationResult: SimulationResult = {\n success: true,\n gasUsed: signedTxs.reduce((sum, tx) => sum + BigInt(tx.gasLimit), 0n).toString(),\n logs: [],\n };\n\n return {\n bundleHash,\n submitted: true,\n simulationResult,\n };\n }\n\n /**\n * Simulate transaction without executing\n */\n async simulate(\n tx: TransactionRequest,\n _chain: ChainId,\n ): Promise<SimulationResult> {\n // In production, would use eth_call or tenderly/alchemy simulation API\n return {\n success: true,\n gasUsed: tx.gasLimit,\n logs: [],\n };\n }\n\n /**\n * Estimate MEV risk for a transaction\n */\n estimateMevRisk(\n tx: TransactionRequest,\n _chain: ChainId,\n ): {\n riskLevel: 'low' | 'medium' | 'high';\n estimatedMevCost: string;\n recommendations: string[];\n } {\n const value = BigInt(tx.value);\n const recommendations: string[] = [];\n let riskLevel: 'low' | 'medium' | 'high' = 'low';\n let estimatedMevCost = '0';\n\n // Check for swap-like transactions (high MEV risk)\n const isSwap = tx.data.startsWith('0x38ed') || // swapExactTokensForTokens\n tx.data.startsWith('0x8803') || // swapTokensForExactTokens\n tx.data.startsWith('0x414b') || // V3 exactInputSingle\n tx.data.startsWith('0xc04b'); // V3 exactInput\n\n if (isSwap) {\n riskLevel = 'high';\n // Estimate ~0.3% MEV extraction on swaps\n estimatedMevCost = (value * 3n / 1000n).toString();\n recommendations.push('Use Flashbots or private mempool');\n recommendations.push('Consider splitting into smaller transactions');\n recommendations.push('Set tight slippage tolerance');\n }\n\n // Check for large value transfers\n if (value > BigInt('1000000000000000000000')) { // > 1000 ETH equivalent\n riskLevel = 'medium';\n recommendations.push('Consider using private mempool');\n }\n\n // Check for approval followed by swap (sandwich risk)\n if (tx.data.startsWith('0x095e')) { // approve\n riskLevel = 'medium';\n recommendations.push('Bundle approval with swap in same block');\n }\n\n return { riskLevel, estimatedMevCost, recommendations };\n }\n\n /**\n * Get optimal block for transaction submission\n */\n getOptimalSubmissionTime(\n _chain: ChainId,\n ): {\n targetBlock: number;\n delay: number; // ms\n reason: string;\n } {\n // In production, would analyze mempool and block times\n return {\n targetBlock: 0, // Next block\n delay: 0,\n reason: 'Immediate submission recommended',\n };\n }\n\n /**\n * Check if Flashbots is available for a chain\n */\n isFlashbotsAvailable(chain: ChainId): boolean {\n // Flashbots primarily supports Ethereum mainnet\n return chain === 'eip155:1';\n }\n\n /**\n * Get private RPC URL for a chain\n */\n getPrivateRpcUrl(chain: ChainId): string | undefined {\n return this.config.privateRpcUrls[chain];\n }\n\n private async useFlashbots(\n signedTx: SignedTransaction,\n chain: ChainId,\n ): Promise<{ method: string; endpoint?: string; bundleHash?: string }> {\n if (!this.isFlashbotsAvailable(chain)) {\n return { method: 'public_mempool' };\n }\n\n const bundleResult = await this.submitBundle([signedTx], 0, chain);\n\n return {\n method: 'flashbots',\n endpoint: this.config.flashbotsRelay,\n bundleHash: bundleResult.bundleHash,\n };\n }\n\n private async usePrivateMempool(\n _signedTx: SignedTransaction,\n chain: ChainId,\n ): Promise<{ method: string; endpoint?: string }> {\n const privateRpc = this.getPrivateRpcUrl(chain);\n\n if (!privateRpc) {\n return { method: 'public_mempool' };\n }\n\n return {\n method: 'private_mempool',\n endpoint: privateRpc,\n };\n }\n\n private async useTimingProtection(\n _signedTx: SignedTransaction,\n chain: ChainId,\n ): Promise<{ method: string }> {\n const timing = this.getOptimalSubmissionTime(chain);\n\n if (timing.delay > 0) {\n await new Promise(resolve => setTimeout(resolve, timing.delay));\n }\n\n return { method: 'timing_protected' };\n }\n\n private generateBundleHash(txs: SignedTransaction[], targetBlock: number): string {\n // Simplified bundle hash generation\n const txHashes = txs.map(tx => tx.hash).join('');\n return `0x${this.simpleHash(txHashes + targetBlock.toString())}`;\n }\n\n private simpleHash(input: string): string {\n // Simple hash for demo purposes\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16).padStart(64, '0');\n }\n}\n\n/**\n * Create MEV-protected transaction options\n */\nexport function createMevProtectedOptions(\n chain: ChainId,\n value: string,\n): {\n strategy: MevProtectionStrategy;\n reason: string;\n} {\n // Ethereum mainnet with significant value\n if (chain === 'eip155:1' && BigInt(value) > BigInt('100000000000000000000')) {\n return {\n strategy: 'flashbots',\n reason: 'High value transaction on Ethereum mainnet',\n };\n }\n\n // L2 chains generally have less MEV\n if (chain.startsWith('eip155:') && ['8453', '42161', '10'].some(id => chain.includes(id))) {\n return {\n strategy: 'none',\n reason: 'L2 chain with limited MEV activity',\n };\n }\n\n return {\n strategy: 'private_mempool',\n reason: 'Default protection for moderate value transactions',\n };\n}\n"],"mappings":"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","names":[]}