Compare commits

..

3 Commits

Author SHA1 Message Date
Administrator
9935246022 fix: correct Protocol and PoolType enum mappings
- Use ProtocolSushiSwapV2/V3 instead of ProtocolSushiSwap
- Use ProtocolCamelotV2/V3 instead of ProtocolCamelot
- Use ProtocolBalancerV2/V3 instead of ProtocolBalancer
- Use PoolTypeConstantProduct instead of PoolTypeV2
- Use PoolTypeConcentrated instead of PoolTypeV3
- Add default fallbacks to prevent undefined enum usage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 10:09:08 +01:00
Administrator
e79e0d960d feat: add pool cache adapter and strict event validation
- Created PoolCacheAdapter to wrap PoolDiscovery for EventParser
- Updated ArbitrumMonitor to pass pool cache to parser via NewEventParserFull
- Added strict validation to reject events with zero addresses
- Added strict validation to reject events with zero amounts
- Parser now uses discovered pools from cache for token enrichment

This ensures zero addresses and zero amounts NEVER reach the scanner.
Events with invalid data are logged and rejected at the monitor level.

Changes:
- pkg/pools/pool_cache_adapter.go: New adapter implementing PoolCache interface
- pkg/monitor/concurrent.go: Pool cache integration and validation logic

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 10:03:28 +01:00
Administrator
e02ded0a6a fix: use pool cache to avoid zero addresses in Uniswap V3 parsing
- Added poolCache field to EventParser struct with PoolCache interface
- Modified getPoolTokens() to check cache before returning zero addresses
- Created PoolCache interface in pkg/interfaces for clean separation
- Added debug logging to identify pools missing from cache
- Documented long-term architecture improvements in PARSER_ARCHITECTURE_IMPROVEMENTS.md

This fixes the critical issue where Uniswap V3 swap events would show zero
addresses for tokens when transaction calldata was unavailable. The parser
now falls back to the pool cache which contains previously discovered pool
information.

Benefits:
- Eliminates zero address errors for known pools
- Reduces unnecessary RPC calls
- Provides visibility into which pools are missing from cache
- Lays foundation for per-exchange parser architecture

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 09:59:37 +01:00
1249 changed files with 12495 additions and 70499 deletions

View File

@@ -1,54 +1,42 @@
# Exclude V1 codebase (not needed in V2 container)
orig/
# Exclude build artifacts
**/*_test.go
test/
# Binaries
bin/
build/
dist/
*.exe
# Exclude logs
logs/
*.log
# Configuration files that might contain sensitive information
config/local.yaml
config/secrets.yaml
# Exclude temporary files
tmp/
temp/
*.tmp
# Go workspace
go.work
# Exclude test coverage
*.out
# Test coverage files
coverage.txt
coverage.html
# Exclude IDE files
# IDE files
.vscode/
.idea/
*.swp
*.swo
# Exclude git
.git/
.gitignore
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Exclude documentation (not needed at runtime)
docs/
*.md
# Log files
*.log
# Exclude environment files (passed at runtime)
.env
.env.*
# Database files
*.db
# Exclude Docker/k8s files
docker-compose.yml
Dockerfile
.dockerignore
# Exclude test files
*_test.go
example_usage.go
examples_test.go
# Exclude scripts (not needed in container)
scripts/
# Exclude config (provisioned externally)
config/
# Data directory
data/
vendor/
backup/
backups/

62
.env
View File

@@ -1,62 +0,0 @@
# 🚀 MEV BOT PRODUCTION CONFIGURATION - IMMEDIATE PROFIT MODE
# This is your LIVE TRADING configuration for immediate deployment
# =============================================================================
# 🔥 CRITICAL PRODUCTION SETTINGS - PROFIT OPTIMIZATION
# =============================================================================
# High-performance RPC endpoint
ARBITRUM_RPC_ENDPOINT=wss://arbitrum-mainnet.core.chainstack.com/53c30e7a941160679fdcc396c894fc57
ARBITRUM_WS_ENDPOINT=wss://arbitrum-mainnet.core.chainstack.com/53c30e7a941160679fdcc396c894fc57
ARBITRUM_RPC_ENDPOINT=wss://arbitrum-mainnet.core.chainstack.com/53c30e7a941160679fdcc396c894fc57
ARBITRUM_RPC_ENDPOINT=wss://arbitrum-mainnet.core.chainstack.com/53c30e7a941160679fdcc396c894fc57
# Aggressive rate limits for maximum throughput
RPC_REQUESTS_PER_SECOND=250
RPC_MAX_CONCURRENT=20
BOT_MAX_WORKERS=8
BOT_CHANNEL_BUFFER_SIZE=5000
# 🔐 PRODUCTION SECURITY
MEV_BOT_ENCRYPTION_KEY="i4qwh5vqUxehOdFsdZx0vFvDwKUHcVpGWC0K2BVQn6A="
# 💰 PROFIT MAXIMIZATION SETTINGS
ARBITRAGE_MIN_PROFIT_THRESHOLD=0.001 # 0.1% minimum profit (aggressive)
GAS_PRICE_MULTIPLIER=1.8 # Competitive gas pricing
MAX_SLIPPAGE_TOLERANCE=0.005 # 0.5% max slippage
POSITION_SIZE_ETH=0.1 # Start with 0.1 ETH positions
# 📊 MONITORING & ALERTS
METRICS_ENABLED=true
METRICS_PORT=9090
HEALTH_PORT=8080
LOG_LEVEL=info
LOG_FORMAT=json
# 🏭 PRODUCTION ENVIRONMENT
GO_ENV=production
DEBUG=false
# 💾 STORAGE PATHS
MEV_BOT_KEYSTORE_PATH=keystore/production
MEV_BOT_AUDIT_LOG=logs/production_audit.log
MEV_BOT_BACKUP_PATH=backups/production
# ⚡ PERFORMANCE TUNING
GOMAXPROCS=4
GOGC=100
# 🎯 TARGET EXCHANGES FOR ARBITRAGE
ENABLE_UNISWAP_V2=true
ENABLE_UNISWAP_V3=true
ENABLE_SUSHISWAP=true
ENABLE_BALANCER=true
ENABLE_CURVE=true
# 🔥 DEPLOYED CONTRACTS (PRODUCTION READY)
CONTRACT_ARBITRAGE_EXECUTOR=0xec2a16d5f8ac850d08c4c7f67efd50051e7cfc0b
CONTRACT_FLASH_SWAPPER=0x5801ee5c2f6069e0f11cce7c0f27c2ef88e79a95
CONTRACT_UNISWAP_V2_FLASH_SWAPPER=0xc0b8c3e9a976ec67d182d7cb0283fb4496692593
ARBISCAN_API_KEY=H8PEIY79385F4UKYU7MRV5IAT1BI1WYIVY

View File

@@ -1,147 +1,115 @@
# MEV Bot V2 Configuration
# Copy this file to .env and fill in your values
# MEV Bot Environment Configuration Template
# Copy this file to .env and fill in your actual values
# SECURITY WARNING: Never commit .env files with actual credentials to version control
# ============================================================================
# NETWORK CONFIGURATION
# ============================================================================
# ============================================================
# ARBITRUM NETWORK CONFIGURATION
# ============================================================
# HTTP endpoint for transaction execution (reliable)
# Get your own endpoint from: https://chainstack.com or https://alchemy.com
ARBITRUM_RPC_ENDPOINT=https://arbitrum-mainnet.infura.io/v3/YOUR_PROJECT_ID
# Arbitrum RPC URL (for forking with Anvil)
ARBITRUM_RPC_URL=https://arb1.arbitrum.io/rpc
# WebSocket endpoint for real-time event monitoring
ARBITRUM_WS_ENDPOINT=wss://arbitrum-mainnet.infura.io/ws/v3/YOUR_PROJECT_ID
# Block number to fork from (optional, defaults to latest)
# FORK_BLOCK_NUMBER=latest
# ============================================================
# RPC RATE LIMITING
# ============================================================
# Requests per second to avoid provider rate limits
# Adjust based on your provider's tier (free tier: 1-2, paid: 10-50)
RPC_REQUESTS_PER_SECOND=2
# Local Anvil URLs (used by bot when running in docker-compose)
# RPC_URL=http://anvil:8545
# WS_URL=ws://anvil:8546
# SEQUENCER_WS_URL=ws://anvil:8546
# Maximum concurrent RPC connections
# Lower values reduce rate limit errors but slow down processing
RPC_MAX_CONCURRENT=1
# Production Arbitrum URLs (when not using Anvil)
# RPC_URL=https://arb1.arbitrum.io/rpc
# WS_URL=wss://arb1.arbitrum.io/ws
# SEQUENCER_WS_URL=wss://arb1.arbitrum.io/ws
# ============================================================
# BOT PERFORMANCE CONFIGURATION
# ============================================================
# Number of worker goroutines for opportunity processing
BOT_MAX_WORKERS=3
# Private RPC endpoint (optional, for faster execution)
# PRIVATE_RPC_URL=
# USE_PRIVATE_RPC=false
# Buffer size for opportunity channel
BOT_CHANNEL_BUFFER_SIZE=100
# ============================================================================
# WALLET CONFIGURATION
# ============================================================================
# ============================================================
# ETHEREUM ACCOUNT CONFIGURATION
# ============================================================
# CRITICAL: Replace with your actual private key (without 0x prefix)
# Generate with: cast wallet new (foundry) or eth-keygen
ETHEREUM_PRIVATE_KEY=0000000000000000000000000000000000000000000000000000000000000000
# Private key for the wallet that will execute trades
# IMPORTANT: Never commit this file with real keys!
# Use a dedicated wallet for testing with test funds only
PRIVATE_KEY=0000000000000000000000000000000000000000000000000000000000000000
# Your Ethereum account address (checksum format)
ETHEREUM_ACCOUNT_ADDRESS=0x0000000000000000000000000000000000000000
# ============================================================================
# SMART CONTRACT ADDRESSES
# ============================================================================
# Gas price multiplier for competitive transaction submission (1.0 = no increase)
ETHEREUM_GAS_PRICE_MULTIPLIER=1.2
# Flashloan executor contract (deployed on Arbitrum)
# Leave as zero address if not deployed yet
EXECUTOR_CONTRACT=0x0000000000000000000000000000000000000000
# ============================================================
# CONTRACT ADDRESSES
# ============================================================
# Deploy these contracts first, then update addresses here
# See: docs/deployment/contract-deployment.md
CONTRACT_ARBITRAGE_EXECUTOR=0x0000000000000000000000000000000000000000
CONTRACT_FLASH_SWAPPER=0x0000000000000000000000000000000000000000
# ============================================================================
# TRADING PARAMETERS
# ============================================================================
# ============================================================
# SECURITY CONFIGURATION
# ============================================================
# Encryption key for keystore (MUST be 32+ characters)
# Generate with: openssl rand -base64 32
# CRITICAL: Keep this secret! Losing it means losing access to keys
MEV_BOT_ENCRYPTION_KEY=REPLACE_WITH_32_CHARACTER_MINIMUM_RANDOM_STRING_FROM_OPENSSL
# Minimum profit threshold (in wei, 0.01 ETH = 10000000000000000)
MIN_PROFIT=10000000000000000
# Keystore directory for encrypted private keys
MEV_BOT_KEYSTORE_PATH=keystore
# Minimum ROI percentage (1% = 0.01)
MIN_ROI=0.01
# Audit log path for security events
MEV_BOT_AUDIT_LOG=logs/audit.log
# Maximum slippage in basis points (200 = 2%)
MAX_SLIPPAGE_BPS=200
# Backup directory for key backups
MEV_BOT_BACKUP_PATH=backups
# Minimum swap amount (in wei, 0.001 ETH = 1000000000000000)
MIN_SWAP_AMOUNT=1000000000000000
# ============================================================
# LOGGING AND MONITORING
# ============================================================
# Log level: debug, info, warn, error
LOG_LEVEL=info
# Minimum pool liquidity (in wei, 1 ETH = 1000000000000000000)
MIN_POOL_LIQUIDITY=1000000000000000000
# Log format: text, json
LOG_FORMAT=text
# ============================================================================
# RISK MANAGEMENT
# ============================================================================
# Maximum position size per trade (in wei, 10 ETH = 10000000000000000000)
MAX_POSITION_SIZE=10000000000000000000
# Maximum daily volume (in wei, 100 ETH = 100000000000000000000)
MAX_DAILY_VOLUME=100000000000000000000
# Maximum gas limit per transaction
MAX_GAS_LIMIT=3000000
# Gas price strategy (fast, normal, slow)
GAS_PRICE_STRATEGY=fast
# ============================================================================
# ARBITRAGE DETECTION
# ============================================================================
# Maximum hops in arbitrage path
MAX_HOPS=3
# Maximum paths to explore per token
MAX_PATHS=100
# Maximum concurrent detection operations
MAX_CONCURRENT_DETECTION=10
# ============================================================================
# EXECUTION SETTINGS
# ============================================================================
# Enable transaction simulation before execution
ENABLE_SIMULATION=true
# Enable front-running of detected opportunities
ENABLE_FRONT_RUNNING=true
# Number of confirmations to wait
CONFIRMATION_BLOCKS=1
# Transaction timeout (in seconds)
TX_TIMEOUT=300
# Maximum retries for failed transactions
MAX_RETRIES=3
# ============================================================================
# POOL DISCOVERY
# ============================================================================
# Maximum number of pools to discover
MAX_POOLS_TO_DISCOVER=1000
# ============================================================================
# PERFORMANCE TUNING
# ============================================================================
# Number of worker threads for transaction processing
WORKER_COUNT=10
# Transaction buffer size
BUFFER_SIZE=1000
# ============================================================================
# MONITORING
# ============================================================================
# Enable Prometheus metrics endpoint
METRICS_ENABLED=true
# Metrics server port
METRICS_PORT=9090
# Log level (debug, info, warn, error)
LOG_LEVEL=info
# ============================================================
# ENVIRONMENT MODE
# ============================================================
# Environment: development, staging, production
# Controls which config file is loaded (config/local.yaml, config/staging.yaml, config/arbitrum_production.yaml)
GO_ENV=development
# ============================================================================
# TESTING CONFIGURATION
# ============================================================================
# Debug mode (verbose logging)
DEBUG=false
# Enable dry-run mode (log opportunities but don't execute)
# DRY_RUN=false
# ============================================================
# BLOCKCHAIN EXPLORER API KEYS (OPTIONAL)
# ============================================================
# Arbiscan API key for contract verification and transaction tracking
# Get free key from: https://arbiscan.io/apis
ARBISCAN_API_KEY=YOUR_ARBISCAN_API_KEY_HERE
# Enable test mode with reduced thresholds
# TEST_MODE=false
# ============================================================
# ADVANCED CONFIGURATION (OPTIONAL)
# ============================================================
# Allow localhost RPC endpoints (security: only enable for development)
MEV_BOT_ALLOW_LOCALHOST=false
# Dashboard server port
DASHBOARD_PORT=8080
# Security webhook URL for alerts (Slack, Discord, etc.)
SECURITY_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL

View File

@@ -1,205 +0,0 @@
# MEV Bot V2 - Production Safety Configuration
# ================================================
# DO NOT deploy without reviewing ALL settings below
# This configuration prioritizes safety over profitability
# ================================
# BLOCKCHAIN CONNECTION
# ================================
# CRITICAL: Use archive RPC provider for production
RPC_URL=https://arb-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_KEY
WS_URL=wss://arb-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_KEY
SEQUENCER_WS_URL=wss://arb1.arbitrum.io/ws
CHAIN_ID=42161
# ================================
# WALLET CONFIGURATION
# ================================
# WARNING: Protect this key - use hardware wallet for large funds
PRIVATE_KEY=your_private_key_here
# EXECUTOR CONTRACT: Set to your deployed flashloan contract address
# Leave as 0x0 if not using flashloans
EXECUTOR_CONTRACT=0x0000000000000000000000000000000000000000
# ================================
# SAFETY MODE
# ================================
# DRY RUN: Set to "true" for simulation-only (NO REAL TRANSACTIONS)
# ONLY set to "false" after thorough testing
DRY_RUN_MODE=true
# EXECUTION: Disable actual execution until validated
ENABLE_EXECUTION=false
# SIMULATION: Always keep enabled for safety checks
ENABLE_SIMULATION=true
# FRONT-RUNNING: Disable until profit calculations validated
ENABLE_FRONT_RUNNING=false
# ================================
# PROFIT THRESHOLDS (Conservative)
# ================================
# Minimum profit required (in wei): 0.05 ETH = very conservative
MIN_PROFIT_WEI=50000000000000000
# Minimum ROI: 5% = conservative (rejects marginal opportunities)
MIN_ROI=0.05
# Minimum swap amount to consider (in wei): 0.1 ETH
MIN_SWAP_AMOUNT=100000000000000000
# Minimum pool liquidity (in wei): $50,000 equivalent
MIN_POOL_LIQUIDITY=50000000000000000000000
# ================================
# RISK LIMITS (Strict)
# ================================
# Maximum position size per trade: 1 ETH = very conservative
MAX_POSITION_SIZE=1000000000000000000
# Maximum daily trading volume: 10 ETH = strict daily limit
MAX_DAILY_VOLUME=10000000000000000000
# Maximum slippage tolerance: 1% = strict (prevents sandwich attacks)
MAX_SLIPPAGE_BPS=100
# Maximum gas limit per transaction: 1.5M gas
MAX_GAS_LIMIT=1500000
# Maximum gas price: 50 gwei (prevents overpaying during spikes)
MAX_GAS_PRICE_GWEI=50
# ================================
# CIRCUIT BREAKER THRESHOLDS
# ================================
# Stop trading after this many consecutive losses
MAX_CONSECUTIVE_LOSSES=3
# Stop trading if hourly loss exceeds this (in wei): 0.1 ETH
MAX_HOURLY_LOSS=100000000000000000
# Stop trading if daily loss exceeds this (in wei): 0.5 ETH
MAX_DAILY_LOSS=500000000000000000
# Cooldown period after circuit breaker trips (seconds): 1 hour
CIRCUIT_BREAKER_COOLDOWN=3600
# ================================
# GAS STRATEGY (Conservative)
# ================================
# Gas price strategy: "safe" = lower gas, slower inclusion
# Options: safe, standard, fast, ultra
GAS_PRICE_STRATEGY=safe
# Gas price multiplier: 1.0 = no markup (safer)
GAS_PRICE_MULTIPLIER=1.0
# ================================
# EXECUTION SETTINGS
# ================================
# Use private RPC for transaction submission (reduces MEV risk)
USE_PRIVATE_RPC=false
PRIVATE_RPC_URL=
# Transaction confirmation blocks: 1 for Arbitrum
CONFIRMATION_BLOCKS=1
# Transaction timeout: 2 minutes
TX_TIMEOUT_SECONDS=120
# Maximum retries for failed transactions
MAX_TX_RETRIES=2
# ================================
# ARBITRAGE DETECTION
# ================================
# Maximum hops in arbitrage path: 2 = simple, safer
MAX_HOPS=2
# Maximum paths to evaluate per opportunity: 50 = focused
MAX_PATHS=50
# Maximum concurrent opportunity evaluations: 5 = conservative
MAX_CONCURRENT_DETECTION=5
# ================================
# POOL DISCOVERY
# ================================
# Maximum pools to discover and monitor: 100 = focused set
MAX_POOLS_TO_DISCOVER=100
# Pool discovery interval (seconds): 5 minutes
POOL_DISCOVERY_INTERVAL=300
# ================================
# PERFORMANCE
# ================================
# Worker count for parallel processing: 4 = moderate
WORKER_COUNT=4
# Buffer size for event processing: 100
BUFFER_SIZE=100
# ================================
# MONITORING & ALERTS
# ================================
# Metrics server port
METRICS_PORT=9090
# Enable detailed logging
LOG_LEVEL=info
# Alert webhook URL (for Slack/Discord/Telegram)
ALERT_WEBHOOK_URL=
# Alert on circuit breaker trip
ALERT_ON_CIRCUIT_BREAKER=true
# Alert on large loss (threshold in wei): 0.05 ETH
ALERT_LOSS_THRESHOLD=50000000000000000
# ================================
# EMERGENCY CONTROLS
# ================================
# Emergency stop file path - create this file to stop bot immediately
EMERGENCY_STOP_FILE=/tmp/mev-bot-emergency-stop
# Auto-restart after emergency stop (dangerous - keep false)
AUTO_RESTART_AFTER_EMERGENCY_STOP=false
# ================================
# ADDITIONAL SAFETY FEATURES
# ================================
# Require manual confirmation for each trade (testing only)
REQUIRE_MANUAL_CONFIRMATION=true
# Maximum trades per hour: 10 = rate limiting
MAX_TRADES_PER_HOUR=10
# Blacklist pools (comma-separated addresses of problematic pools)
BLACKLISTED_POOLS=
# Whitelist tokens only (comma-separated addresses - empty = allow all)
WHITELISTED_TOKENS=
# ================================
# NOTES FOR PRODUCTION
# ================================
# Before deploying to production:
#
# 1. Set DRY_RUN_MODE=true initially and monitor for 24+ hours
# 2. Verify profit calculations match expected values
# 3. Ensure circuit breaker triggers correctly
# 4. Test emergency stop mechanism
# 5. Set up monitoring/alerting
# 6. Start with minimal position sizes
# 7. Gradually increase limits after validating profitability
# 8. NEVER set ENABLE_EXECUTION=true without thorough testing
#
# Recommended deployment sequence:
# Day 1: DRY_RUN_MODE=true (monitor only)
# Day 2-3: If stable, test with ENABLE_EXECUTION=true but MAX_POSITION_SIZE=0.1 ETH
# Day 4-7: If profitable, increase to MAX_POSITION_SIZE=0.5 ETH
# Week 2+: If consistently profitable, gradually increase limits

View File

View File

@@ -1,153 +0,0 @@
# Git Hooks for MEV Bot V2
This directory contains Git hooks to ensure code quality and consistency.
## Installation
Run these commands from the repository root:
```bash
# Make hooks executable
chmod +x .git-hooks/*
# Install pre-commit hook
ln -sf ../../.git-hooks/pre-commit .git/hooks/pre-commit
# Install commit-msg hook
ln -sf ../../.git-hooks/commit-msg .git/hooks/commit-msg
```
Or use the provided installation script:
```bash
./scripts/install-git-hooks.sh
```
## Available Hooks
### pre-commit
Runs before each commit and performs:
1. **Branch Name Validation** - Ensures correct naming convention
2. **Merge Conflict Detection** - Prevents committing conflict markers
3. **Secret Detection** - Scans for passwords, API keys, tokens
4. **Dependency Management** - Auto-tidies go.mod and go.sum
5. **Code Formatting** - Auto-formats Go code with gofmt
6. **Quick Tests** - Runs tests on changed packages
7. **Go Vet** - Runs static analysis
8. **File Size Check** - Warns about large files
### commit-msg
Validates commit message format:
**Required Format:**
```
type(scope): description
Optional body explaining the change
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
```
**Valid Types:**
- `feat` - New feature
- `fix` - Bug fix
- `perf` - Performance improvement
- `refactor` - Code refactoring
- `test` - Tests
- `docs` - Documentation
- `build` - Build system
- `ci` - CI/CD
**Example:**
```
feat(parsers): add UniswapV2 parser with event validation
- Implements ParseLog() for Swap events
- Adds token extraction from pool cache
- Includes comprehensive validation rules
- Achieves 100% test coverage
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
```
## Bypassing Hooks (Emergency Only)
If you absolutely must bypass hooks:
```bash
git commit --no-verify -m "emergency fix"
```
**⚠️ Warning:** Only use in emergencies. CI/CD will still enforce all checks.
## Troubleshooting
### Hook not executing
1. Check if hook is executable:
```bash
ls -l .git/hooks/pre-commit
```
2. If not, make it executable:
```bash
chmod +x .git/hooks/pre-commit
```
### Hook failing unexpectedly
1. Run the hook manually to see errors:
```bash
.git/hooks/pre-commit
```
2. Check that all required tools are installed:
```bash
which gofmt
which go
```
### Disabling hooks temporarily
```bash
# Disable all hooks
git config core.hooksPath /dev/null
# Re-enable hooks
git config --unset core.hooksPath
```
## Best Practices
1. **Never bypass hooks** unless absolutely necessary
2. **Fix issues** instead of bypassing
3. **Keep hooks fast** - they run on every commit
4. **Test hooks locally** before committing to shared repository
5. **Document any new hooks** added to this directory
## Performance
Hooks are designed to be fast:
- **Pre-commit**: Typically < 5 seconds
- **Commit-msg**: < 1 second
If hooks are slow, consider:
1. Only testing changed packages (already implemented)
2. Using `--short` flag for tests (already implemented)
3. Running full tests in CI/CD instead
## Maintenance
Review and update hooks periodically:
1. Add new checks as project evolves
2. Remove obsolete checks
3. Optimize performance
4. Keep documentation up to date

View File

@@ -1,90 +0,0 @@
#!/bin/bash
#
# Commit message hook for MEV Bot V2
# Validates commit message format
#
# Install: ln -sf ../../.git-hooks/commit-msg .git/hooks/commit-msg
#
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
# Skip if this is a merge commit
if git rev-parse -q --verify MERGE_HEAD > /dev/null; then
echo -e "${GREEN} Merge commit detected, skipping validation${NC}"
exit 0
fi
# Skip if this is an amend
if [ -n "$GIT_EDITOR" ]; then
echo -e "${GREEN} Amend detected, skipping validation${NC}"
exit 0
fi
echo -e "${GREEN}📝 Validating commit message...${NC}"
# Required format: type(scope): description
# type: feat, fix, perf, refactor, test, docs, build, ci
# scope: component name (parsers, cache, validation, etc.)
PATTERN="^(feat|fix|perf|refactor|test|docs|build|ci)\([a-z0-9-]+\): .{10,}"
if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
echo -e "${RED}❌ Invalid commit message format${NC}"
echo ""
echo -e "${YELLOW}Required format:${NC}"
echo -e " type(scope): brief description"
echo ""
echo -e "${YELLOW}Valid types:${NC}"
echo -e " feat - New feature"
echo -e " fix - Bug fix"
echo -e " perf - Performance improvement"
echo -e " refactor - Code refactoring"
echo -e " test - Adding or updating tests"
echo -e " docs - Documentation updates"
echo -e " build - Build system changes"
echo -e " ci - CI/CD changes"
echo ""
echo -e "${YELLOW}Example:${NC}"
echo -e " feat(parsers): add UniswapV2 parser with event validation"
echo ""
echo -e "${YELLOW}Your message:${NC}"
echo -e " $COMMIT_MSG"
echo ""
exit 1
fi
# Check for minimum description length
DESCRIPTION=$(echo "$COMMIT_MSG" | head -n1 | sed 's/^[^:]*: //')
if [ ${#DESCRIPTION} -lt 10 ]; then
echo -e "${RED}❌ Commit description too short (minimum 10 characters)${NC}"
echo -e "${YELLOW}Your description: $DESCRIPTION (${#DESCRIPTION} chars)${NC}"
exit 1
fi
# Check for maximum line length (72 chars for first line)
FIRST_LINE=$(echo "$COMMIT_MSG" | head -n1)
if [ ${#FIRST_LINE} -gt 72 ]; then
echo -e "${YELLOW}⚠️ Warning: First line exceeds 72 characters (${#FIRST_LINE} chars)${NC}"
echo -e "${YELLOW} Consider shortening the description${NC}"
echo ""
fi
# Encourage including coverage info for test changes
if echo "$COMMIT_MSG" | grep -q "^test"; then
if ! echo "$COMMIT_MSG" | grep -qi "coverage"; then
echo -e "${YELLOW}💡 Tip: Consider including coverage info in test commits${NC}"
echo ""
fi
fi
echo -e "${GREEN}✅ Commit message format valid${NC}"
echo ""
exit 0

View File

@@ -1,202 +0,0 @@
#!/bin/bash
#
# Pre-commit hook for MEV Bot V2
# Ensures code quality and consistency before commits
#
# Install: ln -sf ../../.git-hooks/pre-commit .git/hooks/pre-commit
#
set -e
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${GREEN}🔍 Running pre-commit checks...${NC}"
echo ""
# ==============================================================================
# 1. CHECK BRANCH NAME
# ==============================================================================
BRANCH_NAME=$(git branch --show-current)
if [[ "$BRANCH_NAME" == "feature/v2-prep" ]] || [[ "$BRANCH_NAME" == "master" ]]; then
echo -e "${YELLOW}⚠️ Warning: Committing to protected branch: $BRANCH_NAME${NC}"
echo -e "${YELLOW} Consider creating a feature branch instead${NC}"
echo ""
fi
if [[ "$BRANCH_NAME" =~ ^feature/v2/ ]]; then
# Validate branch naming convention
if [[ ! "$BRANCH_NAME" =~ ^feature/v2/[a-z0-9-]+/[A-Z0-9]+-[0-9]+-[a-z0-9-]+$ ]]; then
echo -e "${YELLOW}⚠️ Branch name doesn't follow convention:${NC}"
echo -e "${YELLOW} feature/v2/<component>/<TASK-ID>-<description>${NC}"
echo ""
fi
fi
# ==============================================================================
# 2. CHECK FOR MERGE CONFLICTS
# ==============================================================================
echo -e "${GREEN}📋 Checking for merge conflicts...${NC}"
if git diff --cached --name-only | xargs grep -l "^<<<<<<< HEAD" 2>/dev/null; then
echo -e "${RED}❌ Merge conflict markers found${NC}"
echo -e "${RED} Resolve conflicts before committing${NC}"
exit 1
fi
echo -e "${GREEN}✅ No merge conflicts${NC}"
echo ""
# ==============================================================================
# 3. CHECK FOR FORBIDDEN PATTERNS
# ==============================================================================
echo -e "${GREEN}🔒 Checking for secrets and forbidden patterns...${NC}"
# Check for common secret patterns
if git diff --cached --name-only -z | xargs -0 grep -E "password|secret|api[_-]?key|private[_-]?key|token" --include="*.go" 2>/dev/null | grep -v "test" | grep -v "example"; then
echo -e "${RED}❌ Potential secrets found${NC}"
echo -e "${RED} Remove secrets before committing${NC}"
exit 1
fi
# Check for debugging statements
if git diff --cached --name-only -z | xargs -0 grep -E "fmt\.Println|log\.Println|panic\(|TODO.*URGENT|FIXME.*CRITICAL" --include="*.go" 2>/dev/null; then
echo -e "${YELLOW}⚠️ Warning: Found debugging statements or urgent TODOs${NC}"
echo -e "${YELLOW} Consider removing or creating issues for them${NC}"
echo ""
fi
echo -e "${GREEN}✅ No forbidden patterns found${NC}"
echo ""
# ==============================================================================
# 4. GO MOD TIDY CHECK
# ==============================================================================
if [ -f "go.mod" ]; then
echo -e "${GREEN}📦 Checking if go.mod is tidy...${NC}"
# Save current go.mod and go.sum
cp go.mod go.mod.backup
cp go.sum go.sum.backup
# Run go mod tidy
go mod tidy
# Check if anything changed
if ! diff -q go.mod go.mod.backup > /dev/null 2>&1 || ! diff -q go.sum go.sum.backup > /dev/null 2>&1; then
echo -e "${YELLOW}⚠️ go.mod or go.sum was not tidy${NC}"
echo -e "${YELLOW} Auto-fixed and staged${NC}"
git add go.mod go.sum
fi
# Clean up backups
rm -f go.mod.backup go.sum.backup
echo -e "${GREEN}✅ Dependencies are tidy${NC}"
echo ""
fi
# ==============================================================================
# 5. CODE FORMATTING
# ==============================================================================
echo -e "${GREEN}🎨 Checking code formatting...${NC}"
# Get list of staged Go files
STAGED_GO_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep "\.go$" || true)
if [ -n "$STAGED_GO_FILES" ]; then
# Check formatting
UNFORMATTED=$(gofmt -l $STAGED_GO_FILES 2>/dev/null || true)
if [ -n "$UNFORMATTED" ]; then
echo -e "${YELLOW}⚠️ Auto-formatting files:${NC}"
echo "$UNFORMATTED"
# Auto-format files
echo "$UNFORMATTED" | xargs gofmt -w -s
# Re-stage formatted files
echo "$UNFORMATTED" | xargs git add
echo -e "${GREEN}✅ Code formatted and re-staged${NC}"
else
echo -e "${GREEN}✅ All files properly formatted${NC}"
fi
else
echo -e "${GREEN} No Go files to format${NC}"
fi
echo ""
# ==============================================================================
# 6. RUN TESTS ON CHANGED FILES
# ==============================================================================
if [ -n "$STAGED_GO_FILES" ]; then
echo -e "${GREEN}🧪 Running tests on changed packages...${NC}"
# Get unique package directories
PACKAGES=$(echo "$STAGED_GO_FILES" | xargs -n1 dirname | sort -u | sed 's/$/\/.../')
# Run tests with timeout
if ! go test -short -timeout=2m $PACKAGES 2>&1; then
echo -e "${RED}❌ Tests failed${NC}"
echo -e "${RED} Fix tests before committing${NC}"
exit 1
fi
echo -e "${GREEN}✅ Tests passed${NC}"
else
echo -e "${GREEN} No Go files changed, skipping tests${NC}"
fi
echo ""
# ==============================================================================
# 7. RUN GO VET
# ==============================================================================
if [ -n "$STAGED_GO_FILES" ]; then
echo -e "${GREEN}🔍 Running go vet...${NC}"
if ! go vet ./... 2>&1; then
echo -e "${RED}❌ go vet found issues${NC}"
echo -e "${RED} Fix issues before committing${NC}"
exit 1
fi
echo -e "${GREEN}✅ go vet passed${NC}"
fi
echo ""
# ==============================================================================
# 8. CHECK FILE SIZES
# ==============================================================================
echo -e "${GREEN}📏 Checking file sizes...${NC}"
LARGE_FILES=$(git diff --cached --name-only | xargs -I {} sh -c 'if [ -f "{}" ]; then stat -f%z "{}" 2>/dev/null || stat -c%s "{}" 2>/dev/null; fi' | awk '$1 > 1048576 {print}' || true)
if [ -n "$LARGE_FILES" ]; then
echo -e "${YELLOW}⚠️ Warning: Large files detected (>1MB)${NC}"
echo -e "${YELLOW} Consider if these should be committed${NC}"
git diff --cached --name-only | while read file; do
size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null)
if [ "$size" -gt 1048576 ]; then
size_mb=$(echo "scale=2; $size / 1048576" | bc)
echo -e "${YELLOW} $file: ${size_mb}MB${NC}"
fi
done
echo ""
fi
echo -e "${GREEN}✅ File size check complete${NC}"
echo ""
# ==============================================================================
# 9. FINAL SUMMARY
# ==============================================================================
echo -e "${GREEN}╔══════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ ✅ PRE-COMMIT CHECKS PASSED ✅ ║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════╝${NC}"
echo ""
echo -e "${GREEN}Proceeding with commit...${NC}"
exit 0

79
.gitattributes vendored
View File

@@ -1,79 +0,0 @@
# Git attributes for MEV Bot V2
# Optimizes git operations and ensures consistent handling across platforms
# Auto detect text files and perform LF normalization
* text=auto
# Source code
*.go text eol=lf
*.mod text eol=lf
*.sum text eol=lf
*.sh text eol=lf
*.bash text eol=lf
# Documentation
*.md text eol=lf
*.txt text eol=lf
*.json text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.toml text eol=lf
# Configuration
.gitignore text eol=lf
.gitattributes text eol=lf
.golangci.yml text eol=lf
Makefile text eol=lf
Dockerfile text eol=lf
# Scripts
scripts/* text eol=lf
# Binary files
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.mov binary
*.mp4 binary
*.mp3 binary
*.gz binary
*.zip binary
*.tar binary
*.pdf binary
# Go binaries
*.exe binary
*.so binary
*.dylib binary
# Archives
*.7z binary
*.jar binary
*.rar binary
*.tar.gz binary
*.tgz binary
# Exclude files from export-ignore (speeds up git archive)
.gitattributes export-ignore
.gitignore export-ignore
.github export-ignore
.golangci.yml export-ignore
*.md export-ignore
docs export-ignore
scripts export-ignore
# Git LFS tracking for large files (if needed in future)
# *.bin filter=lfs diff=lfs merge=lfs -text
# *.dat filter=lfs diff=lfs merge=lfs -text
# Diff settings
*.go diff=golang
*.mod diff=golang
*.sum diff=golang
# Merge strategies
*.json merge=ours
*.lock merge=ours
go.sum merge=ours

View File

@@ -1,483 +0,0 @@
name: V2 CI/CD Pipeline
on:
push:
branches:
- 'feature/v2-**'
- 'feature/v2/**'
pull_request:
branches:
- 'feature/v2-prep'
- 'master'
paths:
- 'pkg/**'
- 'cmd/**'
- 'internal/**'
- 'go.mod'
- 'go.sum'
- '.github/workflows/**'
workflow_dispatch:
inputs:
run_benchmarks:
description: 'Run performance benchmarks'
required: false
default: 'true'
type: boolean
env:
GO_VERSION: '1.25'
MIN_COVERAGE: 100
GOLANGCI_LINT_VERSION: 'v1.61.0'
jobs:
# ==============================================================================
# PRE-FLIGHT CHECKS
# ==============================================================================
pre_flight:
name: Pre-Flight Checks
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Validate branch naming
run: |
BRANCH_NAME="${{ github.head_ref || github.ref_name }}"
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
if [[ ! "$BRANCH_NAME" =~ ^feature/v2/[a-z0-9-]+/[A-Z0-9]+-[0-9]+-[a-z0-9-]+$ ]]; then
echo "❌ Invalid branch name: $BRANCH_NAME"
echo ""
echo "Branch must follow: feature/v2/<component>/<TASK-ID>-<description>"
echo ""
echo "Examples:"
echo " feature/v2/parsers/P2-002-uniswap-v2-base"
echo " feature/v2/cache/P3-001-address-index"
echo " feature/v2/validation/P4-001-validation-rules"
exit 1
fi
fi
echo "✅ Branch naming validation passed"
- name: Check commit message format
if: github.event_name == 'push'
run: |
# Get the last commit message
COMMIT_MSG=$(git log -1 --pretty=%B)
# Check format: type(scope): description
if [[ ! "$COMMIT_MSG" =~ ^(feat|fix|perf|refactor|test|docs|build|ci)\([a-z0-9-]+\):\ .+ ]]; then
echo "❌ Invalid commit message format"
echo ""
echo "Format: type(scope): brief description"
echo ""
echo "Types: feat, fix, perf, refactor, test, docs, build, ci"
echo ""
echo "Example:"
echo " feat(parsers): add UniswapV2 parser with event validation"
exit 1
fi
echo "✅ Commit message format valid"
# ==============================================================================
# BUILD & DEPENDENCIES
# ==============================================================================
build:
name: Build & Dependencies
runs-on: ubuntu-latest
needs: pre_flight
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go ${{ env.GO_VERSION }}
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
cache: true
- name: Cache Go modules
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-${{ env.GO_VERSION }}-
- name: Download dependencies
run: go mod download
- name: Verify dependencies
run: go mod verify
- name: Check for tidy modules
run: |
go mod tidy
if [ -n "$(git status --porcelain go.mod go.sum)" ]; then
echo "❌ go.mod or go.sum is not tidy"
echo "Run: go mod tidy"
git diff go.mod go.sum
exit 1
fi
echo "✅ Dependencies are tidy"
- name: Build all packages
run: go build -v ./...
- name: Build main binary (if exists)
run: |
if [ -d "cmd/mev-bot" ]; then
go build -v -o bin/mev-bot ./cmd/mev-bot
echo "✅ Binary built successfully"
else
echo " No main application yet (planning phase)"
fi
# ==============================================================================
# CODE QUALITY
# ==============================================================================
code_quality:
name: Code Quality & Linting
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Run gofmt
run: |
if [ -n "$(gofmt -l .)" ]; then
echo "❌ Code is not formatted"
echo "Files needing formatting:"
gofmt -l .
echo ""
echo "Run: gofmt -w ."
exit 1
fi
echo "✅ Code formatting passed"
- name: Run go vet
run: go vet ./...
- name: Run golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: ${{ env.GOLANGCI_LINT_VERSION }}
args: --timeout=10m --config=.golangci.yml
- name: Run gosec security scanner
run: |
go install github.com/securecodewarrior/gosec/v2/cmd/gosec@latest
gosec -fmt sarif -out gosec.sarif ./... || true
- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: gosec.sarif
- name: Check for TODO/FIXME comments
run: |
if grep -r "TODO\|FIXME" --include="*.go" pkg/ cmd/ internal/ | grep -v "_test.go"; then
echo "⚠️ TODO/FIXME comments found - ensure they're tracked in issues"
fi
# ==============================================================================
# UNIT TESTS WITH 100% COVERAGE ENFORCEMENT
# ==============================================================================
unit_tests:
name: Unit Tests (100% Coverage Required)
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Cache Go modules
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ hashFiles('**/go.sum') }}
- name: Run tests with race detector
run: |
go test -v -race -timeout=30m ./...
- name: Generate coverage report
run: |
go test -v -race -coverprofile=coverage.out -covermode=atomic ./...
- name: Calculate coverage percentage
id: coverage
run: |
COVERAGE=$(go tool cover -func=coverage.out | grep total | awk '{print $3}' | sed 's/%//')
echo "coverage=$COVERAGE" >> $GITHUB_OUTPUT
echo "Coverage: $COVERAGE%"
- name: Enforce 100% coverage requirement
run: |
COVERAGE=${{ steps.coverage.outputs.coverage }}
MIN_COVERAGE=${{ env.MIN_COVERAGE }}
echo "Coverage: $COVERAGE%"
echo "Minimum Required: $MIN_COVERAGE%"
# Use bc for floating point comparison
if (( $(echo "$COVERAGE < $MIN_COVERAGE" | bc -l) )); then
echo ""
echo "❌ COVERAGE FAILURE"
echo "Coverage $COVERAGE% is below required $MIN_COVERAGE%"
echo ""
echo "Uncovered lines:"
go tool cover -func=coverage.out | grep -v "100.0%"
echo ""
echo "See docs/planning/03_TESTING_REQUIREMENTS.md for details"
exit 1
fi
echo "✅ Coverage requirement met: $COVERAGE%"
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
file: ./coverage.out
flags: unittests
name: v2-coverage
- name: Generate HTML coverage report
run: |
go tool cover -html=coverage.out -o coverage.html
- name: Upload coverage artifacts
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: |
coverage.out
coverage.html
retention-days: 30
# ==============================================================================
# INTEGRATION TESTS
# ==============================================================================
integration_tests:
name: Integration Tests
runs-on: ubuntu-latest
needs: unit_tests
if: contains(github.event.head_commit.message, '[integration]') || github.event_name == 'pull_request'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Cache Go modules
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ hashFiles('**/go.sum') }}
- name: Run integration tests
run: |
go test -v -timeout=30m -tags=integration ./...
- name: Run end-to-end tests
run: |
if [ -d "tests/e2e" ]; then
go test -v -timeout=30m ./tests/e2e/...
fi
# ==============================================================================
# PERFORMANCE BENCHMARKS
# ==============================================================================
benchmarks:
name: Performance Benchmarks
runs-on: ubuntu-latest
needs: unit_tests
if: github.event.inputs.run_benchmarks == 'true' || contains(github.event.head_commit.message, '[bench]')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Run benchmarks
run: |
go test -bench=. -benchmem -benchtime=10s ./... > benchmark.txt
cat benchmark.txt
- name: Check performance thresholds
run: |
echo "Checking parser performance targets..."
# Parser should be < 5ms per transaction
# Arbitrage detection should be < 10ms
# End-to-end should be < 50ms
echo "✅ Performance benchmarks completed"
echo "Review benchmark.txt for detailed results"
- name: Upload benchmark results
uses: actions/upload-artifact@v4
with:
name: benchmarks
path: benchmark.txt
retention-days: 90
# ==============================================================================
# DECIMAL PRECISION TESTS
# ==============================================================================
decimal_tests:
name: Decimal Precision Validation
runs-on: ubuntu-latest
needs: unit_tests
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Run decimal precision tests
run: |
# Run tests that specifically test decimal handling
go test -v -run TestDecimal ./...
echo "✅ Decimal precision tests passed"
# ==============================================================================
# MODULARITY VALIDATION
# ==============================================================================
modularity_check:
name: Modularity Validation
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Check component independence
run: |
echo "Validating component modularity..."
# Each pkg/* should compile independently
for dir in pkg/*/; do
if [ -d "$dir" ]; then
echo "Testing $dir..."
(cd "$dir" && go build .) || exit 1
fi
done
echo "✅ All components compile independently"
- name: Check for circular dependencies
run: |
go install golang.org/x/tools/cmd/godepgraph@latest
godepgraph ./... | grep -i cycle && exit 1 || echo "✅ No circular dependencies"
# ==============================================================================
# FINAL VALIDATION
# ==============================================================================
final_check:
name: Final Validation Summary
runs-on: ubuntu-latest
needs:
- pre_flight
- build
- code_quality
- unit_tests
- modularity_check
- decimal_tests
if: always()
steps:
- name: Check all jobs status
run: |
echo "# 🤖 MEV Bot V2 CI/CD Summary" > summary.md
echo "" >> summary.md
echo "**Commit**: ${{ github.sha }}" >> summary.md
echo "**Branch**: ${{ github.ref_name }}" >> summary.md
echo "**Timestamp**: $(date -u)" >> summary.md
echo "" >> summary.md
echo "## Test Results" >> summary.md
echo "| Check | Status |" >> summary.md
echo "|-------|--------|" >> summary.md
echo "| Pre-Flight | ${{ needs.pre_flight.result == 'success' && '✅' || '❌' }} |" >> summary.md
echo "| Build | ${{ needs.build.result == 'success' && '✅' || '❌' }} |" >> summary.md
echo "| Code Quality | ${{ needs.code_quality.result == 'success' && '✅' || '❌' }} |" >> summary.md
echo "| Unit Tests (100% Coverage) | ${{ needs.unit_tests.result == 'success' && '✅' || '❌' }} |" >> summary.md
echo "| Modularity | ${{ needs.modularity_check.result == 'success' && '✅' || '❌' }} |" >> summary.md
echo "| Decimal Precision | ${{ needs.decimal_tests.result == 'success' && '✅' || '❌' }} |" >> summary.md
cat summary.md
# Check if all required jobs passed
if [[ "${{ needs.pre_flight.result }}" == "success" &&
"${{ needs.build.result }}" == "success" &&
"${{ needs.code_quality.result }}" == "success" &&
"${{ needs.unit_tests.result }}" == "success" &&
"${{ needs.modularity_check.result }}" == "success" &&
"${{ needs.decimal_tests.result }}" == "success" ]]; then
echo "" >> summary.md
echo "## ✅ ALL CHECKS PASSED" >> summary.md
echo "Ready for merge to v2-prep branch" >> summary.md
exit 0
else
echo "" >> summary.md
echo "## ❌ CHECKS FAILED" >> summary.md
echo "Fix failing checks before merging" >> summary.md
exit 1
fi
- name: Upload summary
uses: actions/upload-artifact@v4
if: always()
with:
name: ci-summary
path: summary.md
- name: Comment on PR
uses: actions/github-script@v7
if: github.event_name == 'pull_request' && always()
with:
script: |
const fs = require('fs');
const summary = fs.readFileSync('summary.md', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: summary
});

108
.gitignore vendored
View File

@@ -1,27 +1,33 @@
# Environment files with secrets
# Binaries
bin/
mev-bot
mev-bot-test
ci-agent-bridge
# Configuration files that might contain sensitive information
config/local.yaml
config/secrets.yaml
config/providers.yaml
config/*_production.yaml
config/*_staging.yaml
.env
.env.local
.env.*.local
.env.production
.env.staging
.env.development
.env.test
# Private keys and wallets
*.key
*.keystore
keystore/
wallets/
# Salt file for key derivation (CRITICAL: Must not be committed)
keystore/.salt
# Build artifacts
bin/
build/
dist/
*.exe
*.dll
*.so
*.dylib
# Go workspace and modules
go.work
go.work.sum
# Test coverage
*.out
coverage.html
# Test coverage files
coverage.txt
coverage.html
coverage.out
# IDE files
.vscode/
@@ -30,57 +36,51 @@ coverage.txt
*.swo
*~
# OS files
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Logs
logs/
# Log files and backups
*.log
logs/*.log
logs/*.bak
logs/*.jsonl
# Data directories
data/
# Database files
*.db
*.sqlite
*.sqlite3
# Docker volumes
volumes/
# Security and keystore files
keystore/
*.key
*.pem
*.p12
# Temporary files
# Data and temporary directories
data/
tmp/
temp/
*.tmp
# Dependency directories
vendor/
node_modules/
# Compiled binaries
mev-bot-v2
mev-bot-v1
# Monitoring data
prometheus-data/
grafana-data/
# Backup files
*.bak
*.backup
*~
backup/
backups/
artifacts/
# Archive files
*.tar
*.tar.gz
*.zip
*.tar
# Swap detection test data
detected_swaps.jsonl
swap_replay.log
replayed_swaps.log
anvil_fresh.log
# Performance profiles
*.prof
*.out
# Arbitrage detection test data
arbitrage_detection_test.log
ARBITRAGE_DETECTION_TEST_RESULTS.md
/tmp/mev-bot-test.log
.wallet_info.txt
# Documentation builds
docs/_build/
.gocache/
.gomodcache/

12
.gitmodules vendored
View File

@@ -1,3 +1,9 @@
[submodule "contracts"]
path = contracts
url = ssh://git@194.163.145.241:2222/copper-tone-tech/mev-beta-contracts.git
[submodule "lib/forge-std"]
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/openzeppelin-contracts"]
path = lib/openzeppelin-contracts
url = https://github.com/OpenZeppelin/openzeppelin-contracts
[submodule "contracts/foundry/lib/forge-std"]
path = contracts/foundry/lib/forge-std
url = https://github.com/foundry-rs/forge-std

Some files were not shown because too many files have changed in this diff Show More