feat: create v2-prep branch with comprehensive planning
Restructured project for V2 refactor: **Structure Changes:** - Moved all V1 code to orig/ folder (preserved with git mv) - Created docs/planning/ directory - Added orig/README_V1.md explaining V1 preservation **Planning Documents:** - 00_V2_MASTER_PLAN.md: Complete architecture overview - Executive summary of critical V1 issues - High-level component architecture diagrams - 5-phase implementation roadmap - Success metrics and risk mitigation - 07_TASK_BREAKDOWN.md: Atomic task breakdown - 99+ hours of detailed tasks - Every task < 2 hours (atomic) - Clear dependencies and success criteria - Organized by implementation phase **V2 Key Improvements:** - Per-exchange parsers (factory pattern) - Multi-layer strict validation - Multi-index pool cache - Background validation pipeline - Comprehensive observability **Critical Issues Addressed:** - Zero address tokens (strict validation + cache enrichment) - Parsing accuracy (protocol-specific parsers) - No audit trail (background validation channel) - Inefficient lookups (multi-index cache) - Stats disconnection (event-driven metrics) Next Steps: 1. Review planning documents 2. Begin Phase 1: Foundation (P1-001 through P1-010) 3. Implement parsers in Phase 2 4. Build cache system in Phase 3 5. Add validation pipeline in Phase 4 6. Migrate and test in Phase 5 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
172
orig/pkg/exchanges/deployment_config.go
Normal file
172
orig/pkg/exchanges/deployment_config.go
Normal file
@@ -0,0 +1,172 @@
|
||||
// Deployment configuration for the MEV Bot
|
||||
package exchanges
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// DeploymentConfig holds configuration for different deployment environments
|
||||
type DeploymentConfig struct {
|
||||
Environment string // "development", "staging", "production"
|
||||
EthereumNode string // URL of the Ethereum node to connect to
|
||||
PolygonNode string // URL of the Polygon node to connect to
|
||||
ArbitrumNode string // URL of the Arbitrum node to connect to
|
||||
GasLimit uint64 // Maximum gas to use for transactions
|
||||
GasPrice uint64 // Gas price to use for transactions (in gwei)
|
||||
PrivateKey string // Private key for transaction signing
|
||||
Monitoring MonitoringConfig // Monitoring and alerting configuration
|
||||
Arbitrage ArbitrageConfig // Arbitrage-specific configuration
|
||||
MaxSlippage float64 // Maximum acceptable slippage percentage
|
||||
MinProfit float64 // Minimum profit threshold (in ETH) before executing arbitrage
|
||||
Redsync RedsyncConfig // Redis synchronization configuration
|
||||
}
|
||||
|
||||
// MonitoringConfig holds monitoring-related configuration
|
||||
type MonitoringConfig struct {
|
||||
Enabled bool // Whether monitoring is enabled
|
||||
PrometheusAddr string // Address to bind Prometheus metrics server
|
||||
GrafanaAddr string // Grafana server address
|
||||
AlertManagerUrl string // AlertManager URL for alerts
|
||||
LogLevel string // Log level for the application (e.g., "debug", "info", "warn", "error")
|
||||
LogFormat string // Log format ("json", "text")
|
||||
HealthCheckPath string // Path for health checks
|
||||
MetricsInterval time.Duration // How often to collect metrics
|
||||
}
|
||||
|
||||
// ArbitrageConfig holds arbitrage-specific configuration settings
|
||||
type ArbitrageConfig struct {
|
||||
MaxOpportunities int // Maximum number of arbitrage opportunities to track
|
||||
OpportunityTimeout time.Duration // How long to consider an opportunity valid
|
||||
MinSpreadPercentage float64 // Minimum spread percentage to consider an opportunity
|
||||
MaxTradeSize float64 // Maximum trade size in ETH
|
||||
ValidationInterval time.Duration // How often to validate opportunities
|
||||
OpportunityCheckInterval time.Duration // How often to check for new opportunities
|
||||
ExecutionDelay time.Duration // Delay before executing opportunities (to account for validation)
|
||||
}
|
||||
|
||||
// RedsyncConfig holds configuration for distributed locking
|
||||
type RedsyncConfig struct {
|
||||
Enabled bool // Whether distributed locking is enabled
|
||||
Addresses []string // Redis addresses for distributed locking
|
||||
Database int // Redis database number
|
||||
Password string // Redis password (if any)
|
||||
}
|
||||
|
||||
// DefaultDevelopmentConfig returns a default configuration for development
|
||||
func DefaultDevelopmentConfig() *DeploymentConfig {
|
||||
return &DeploymentConfig{
|
||||
Environment: "development",
|
||||
EthereumNode: "ws://localhost:8545",
|
||||
PolygonNode: "ws://localhost:8546", // If using local Polygon node
|
||||
ArbitrumNode: "ws://localhost:8547", // If using local Arbitrum node
|
||||
GasLimit: 500000,
|
||||
GasPrice: 20,
|
||||
PrivateKey: "", // This should be loaded from environment or secure storage
|
||||
MaxSlippage: 0.5, // 0.5%
|
||||
MinProfit: 0.001, // 0.001 ETH
|
||||
Monitoring: MonitoringConfig{
|
||||
Enabled: true,
|
||||
PrometheusAddr: ":9090",
|
||||
GrafanaAddr: "http://localhost:3000",
|
||||
AlertManagerUrl: "http://localhost:9093",
|
||||
LogLevel: "debug",
|
||||
LogFormat: "text",
|
||||
HealthCheckPath: "/health",
|
||||
MetricsInterval: 5 * time.Second,
|
||||
},
|
||||
Arbitrage: ArbitrageConfig{
|
||||
MaxOpportunities: 100,
|
||||
OpportunityTimeout: 100 * time.Millisecond,
|
||||
MinSpreadPercentage: 0.3, // 0.3%
|
||||
MaxTradeSize: 10.0, // 10 ETH max
|
||||
ValidationInterval: 50 * time.Millisecond,
|
||||
OpportunityCheckInterval: 100 * time.Millisecond,
|
||||
ExecutionDelay: 10 * time.Millisecond,
|
||||
},
|
||||
Redsync: RedsyncConfig{
|
||||
Enabled: false, // Disable for development
|
||||
Addresses: []string{"localhost:6379"},
|
||||
Database: 0,
|
||||
Password: "",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// DefaultProductionConfig returns a default configuration for production
|
||||
func DefaultProductionConfig() *DeploymentConfig {
|
||||
return &DeploymentConfig{
|
||||
Environment: "production",
|
||||
EthereumNode: "wss://mainnet.infura.io/ws/v3/YOUR_PROJECT_ID", // Use your actual Infura endpoint
|
||||
PolygonNode: "wss://polygon-mainnet.infura.io/ws/v3/YOUR_PROJECT_ID",
|
||||
ArbitrumNode: "wss://arbitrum-mainnet.infura.io/ws/v3/YOUR_PROJECT_ID",
|
||||
GasLimit: 1000000,
|
||||
GasPrice: 50,
|
||||
PrivateKey: "", // Load securely from environment or key management system
|
||||
MaxSlippage: 0.1, // 0.1% - more conservative in production
|
||||
MinProfit: 0.01, // 0.01 ETH - higher threshold in production
|
||||
Monitoring: MonitoringConfig{
|
||||
Enabled: true,
|
||||
PrometheusAddr: ":9090",
|
||||
GrafanaAddr: "", // Your Grafana instance
|
||||
AlertManagerUrl: "", // Your AlertManager instance
|
||||
LogLevel: "info",
|
||||
LogFormat: "json",
|
||||
HealthCheckPath: "/health",
|
||||
MetricsInterval: 1 * time.Second,
|
||||
},
|
||||
Arbitrage: ArbitrageConfig{
|
||||
MaxOpportunities: 50,
|
||||
OpportunityTimeout: 50 * time.Millisecond,
|
||||
MinSpreadPercentage: 0.5, // 0.5% - higher threshold in production
|
||||
MaxTradeSize: 100.0, // 100 ETH max
|
||||
ValidationInterval: 20 * time.Millisecond,
|
||||
OpportunityCheckInterval: 50 * time.Millisecond,
|
||||
ExecutionDelay: 5 * time.Millisecond,
|
||||
},
|
||||
Redsync: RedsyncConfig{
|
||||
Enabled: true, // Enable for production
|
||||
Addresses: []string{"redis-primary:6379", "redis-replica:6379"},
|
||||
Database: 0,
|
||||
Password: "", // Set if using password authentication
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// Validate checks if the deployment configuration is valid
|
||||
func (dc *DeploymentConfig) Validate() error {
|
||||
if dc.PrivateKey == "" {
|
||||
return nil // Validation would check if this is loaded properly
|
||||
}
|
||||
|
||||
if dc.GasLimit == 0 {
|
||||
return nil // Should be greater than 0
|
||||
}
|
||||
|
||||
if dc.GasPrice == 0 {
|
||||
return nil // Should be greater than 0
|
||||
}
|
||||
|
||||
if dc.MaxSlippage <= 0 || dc.MaxSlippage > 5 { // 5% max slippage
|
||||
return nil // Should be within reasonable bounds
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetConfigByEnvironment returns appropriate config based on environment
|
||||
func GetConfigByEnvironment(env string) *DeploymentConfig {
|
||||
switch env {
|
||||
case "production":
|
||||
return DefaultProductionConfig()
|
||||
case "staging":
|
||||
// Staging config would be similar to production but with testnet endpoints
|
||||
config := DefaultProductionConfig()
|
||||
config.Environment = "staging"
|
||||
config.EthereumNode = "wss://sepolia.infura.io/ws/v3/YOUR_PROJECT_ID"
|
||||
config.PolygonNode = "wss://polygon-mumbai.infura.io/ws/v3/YOUR_PROJECT_ID"
|
||||
config.ArbitrumNode = "wss://arbitrum-sepolia.infura.io/ws/v3/YOUR_PROJECT_ID"
|
||||
return config
|
||||
default: // development
|
||||
return DefaultDevelopmentConfig()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user