diff --git a/WALLET_SETUP.md b/WALLET_SETUP.md new file mode 100644 index 0000000..cd298bb --- /dev/null +++ b/WALLET_SETUP.md @@ -0,0 +1,272 @@ +# MEV Bot V2 - Wallet Setup Guide + +**IMPORTANT: This guide covers wallet configuration for Phase 1 (dry-run) deployment.** + +--- + +## 🔐 **Wallet Options** + +### Option 1: Generate New Wallet (Recommended for Testing) + +**Using Foundry (cast):** +```bash +# Generate a new random wallet +cast wallet new + +# Output: +# Successfully created new keypair. +# Address: 0x1234... +# Private key: 0xabcdef1234567890... +``` + +**Save the output securely:** +- **Address**: Your wallet's public address (can be shared) +- **Private Key**: SECRET - never share this! + +### Option 2: Use Existing Wallet + +If you have an existing wallet, you need the private key in hex format (64 characters, no 0x prefix for some tools). + +**Extract private key from MetaMask:** +1. Open MetaMask +2. Click three dots menu → Account Details +3. Click "Export Private Key" +4. Enter password +5. Copy the 64-character hex string + +**⚠️ WARNING**: Never use wallets with significant funds for testing! + +### Option 3: Generate Deterministic Test Wallet + +**For development only:** +```bash +# Generate from mnemonic +cast wallet new --mnemonic + +# Or use a test mnemonic (DO NOT USE IN PRODUCTION) +cast wallet new --mnemonic "test test test test test test test test test test test junk" +``` + +--- + +## 📝 **Configure .env File** + +### Phase 1 Configuration (Dry-Run - NO Trading) + +Edit `.env` file: + +```bash +# === WALLET CONFIGURATION === +# Private key without 0x prefix (64 hex characters) +PRIVATE_KEY=abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 + +# === RPC ENDPOINTS (Already configured) === +ARBITRUM_RPC_ENDPOINT=wss://arbitrum-mainnet.core.chainstack.com/53c30e7a941160679fdcc396c894fc57 +ARBITRUM_WS_ENDPOINT=wss://arbitrum-mainnet.core.chainstack.com/53c30e7a941160679fdcc396c894fc57 + +# === SAFETY SETTINGS (CRITICAL) === +ENABLE_EXECUTION=false # MUST be false for Phase 1 +DRY_RUN_MODE=true # MUST be true for Phase 1 +``` + +**Validation:** +```bash +# Check private key is set +grep "^PRIVATE_KEY=" .env + +# Verify it's not the placeholder +grep "^PRIVATE_KEY=" .env | grep -v "???" + +# Confirm dry-run is enabled +grep "DRY_RUN_MODE=true" .env +``` + +--- + +## 💰 **Fund Wallet (Phase 1)** + +### For Phase 1 (Dry-Run): +**NO FUNDING REQUIRED** - Bot will not execute trades. + +However, a small amount of ETH helps with testing: +- **Recommended**: 0.001-0.01 ETH (for RPC call costs, if any) +- **Purpose**: Validation, not trading + +### For Phase 3 (Live Trading): +When ready to enable execution (AFTER Phase 1 succeeds): +- **Minimum**: 0.1 ETH +- **Recommended**: 0.1-0.5 ETH +- **Purpose**: Gas costs + small arbitrage positions + +**Bridge ETH to Arbitrum:** +1. Use official Arbitrum bridge: https://bridge.arbitrum.io/ +2. Or use exchanges: Binance, Coinbase, etc. (withdraw directly to Arbitrum) + +**Check Balance:** +```bash +# Using cast +cast balance --rpc-url https://arb1.arbitrum.io/rpc + +# Using the bot's RPC +WALLET_ADDRESS=$(cast wallet address --private-key $PRIVATE_KEY) +cast balance $WALLET_ADDRESS --rpc-url https://arb1.arbitrum.io/rpc +``` + +--- + +## ✅ **Verification Checklist** + +Before deploying: + +- [ ] **Private key configured** in .env +- [ ] **No "???" placeholder** in PRIVATE_KEY +- [ ] **DRY_RUN_MODE=true** (for Phase 1) +- [ ] **ENABLE_EXECUTION=false** (for Phase 1) +- [ ] **Wallet address derived** and noted down +- [ ] **Balance checked** (optional for Phase 1) +- [ ] **RPC connectivity tested** + +**Verification Script:** +```bash +# Extract wallet address from private key +WALLET_ADDRESS=$(cast wallet address --private-key $(grep "^PRIVATE_KEY=" .env | cut -d'=' -f2)) +echo "Wallet Address: $WALLET_ADDRESS" + +# Check balance +cast balance $WALLET_ADDRESS --rpc-url https://arb1.arbitrum.io/rpc + +# Test RPC connectivity +cast block-number --rpc-url $(grep "^ARBITRUM_RPC_ENDPOINT=" .env | cut -d'=' -f2) +``` + +--- + +## 🔒 **Security Best Practices** + +### Critical Security Rules: + +1. **NEVER commit .env to git** + - .env is in .gitignore + - Double-check before git push + +2. **NEVER share private key** + - Not in Discord, Telegram, email, etc. + - Not in screenshots or logs + +3. **Use dedicated wallet** + - Don't use personal wallet with significant funds + - Create separate wallet just for MEV bot + +4. **Limit funds** + - Phase 1: 0-0.01 ETH + - Phase 3: 0.1-0.5 ETH maximum + - Never deposit more than max daily volume + gas buffer + +5. **Monitor continuously** + - Check balance every 4 hours during Phase 1 + - Set up alerts for balance changes + +6. **Backup securely** + - Save private key in password manager + - Write down on paper and store safely + - NEVER save in cloud storage unencrypted + +### Access Control: + +```bash +# Restrict .env file permissions +chmod 600 .env + +# Only owner can read/write +ls -la .env +# -rw------- 1 user user 1234 date .env +``` + +--- + +## 🚨 **Emergency Procedures** + +### If Private Key Compromised: + +1. **Immediately transfer funds** to safe wallet: +```bash +# Transfer all ETH to safe address +cast send \ + --value $(cast balance ) \ + --private-key \ + --rpc-url https://arb1.arbitrum.io/rpc +``` + +2. **Stop bot**: +```bash +podman stop mev-bot-v2-phase1 +``` + +3. **Generate new wallet**: +```bash +cast wallet new +``` + +4. **Update .env** with new private key + +5. **Never use compromised wallet again** + +### If Wallet Drained: + +1. **Stop bot immediately** +2. **Check transaction history** on Arbiscan +3. **Analyze what happened** +4. **Don't add more funds** until root cause found + +--- + +## 📞 **Support** + +### Common Issues: + +**"Invalid private key" error:** +- Ensure 64 hex characters (no 0x prefix in .env) +- Check for spaces or newlines in .env +- Verify key is valid: `cast wallet address --private-key ` + +**"Insufficient funds" error (Phase 1):** +- Should not occur in dry-run mode +- If it does, add 0.001 ETH for RPC call costs + +**"Cannot derive address" error:** +- Private key format incorrect +- Try adding/removing 0x prefix +- Regenerate wallet if unsure + +### Validation Commands: + +```bash +# Verify private key format +PRIVATE_KEY=$(grep "^PRIVATE_KEY=" .env | cut -d'=' -f2) +echo ${#PRIVATE_KEY} # Should be 64 + +# Derive and display address +cast wallet address --private-key $PRIVATE_KEY + +# Test signing (doesn't broadcast) +cast wallet sign "test" --private-key $PRIVATE_KEY +``` + +--- + +## ✅ **You're Ready When:** + +- [x] Private key configured in .env +- [x] Wallet address derived successfully +- [x] RPC connectivity verified +- [x] DRY_RUN_MODE=true confirmed +- [x] ENABLE_EXECUTION=false confirmed +- [x] .env file permissions secured (chmod 600) +- [x] Backup of private key created and stored safely + +**Next Step**: Run `./scripts/deploy_phase1.sh` + +--- + +**Last Updated**: 2025-11-11 +**For**: MEV Bot V2 - Phase 1 Deployment diff --git a/scripts/deploy_phase1.sh b/scripts/deploy_phase1.sh new file mode 100755 index 0000000..d03140e --- /dev/null +++ b/scripts/deploy_phase1.sh @@ -0,0 +1,181 @@ +#!/bin/bash +# MEV Bot V2 - Phase 1 Deployment Script (Mainnet Dry-Run) +# This script deploys the bot in monitoring-only mode to validate arbitrage detection + +set -e + +# Colors for output +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}MEV Bot V2 - Phase 1 Deployment${NC}" +echo -e "${GREEN}Mode: Mainnet Dry-Run (48 hours)${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# Check if .env exists +if [ ! -f .env ]; then + echo -e "${RED}ERROR: .env file not found${NC}" + echo "Please create .env file with required configuration" + exit 1 +fi + +# Check for PRIVATE_KEY +if ! grep -q "^PRIVATE_KEY=" .env || grep -q "^PRIVATE_KEY=$" .env || grep -q "^PRIVATE_KEY=???$" .env; then + echo -e "${YELLOW}WARNING: PRIVATE_KEY not configured in .env${NC}" + echo "" + echo "To generate a new wallet:" + echo " cast wallet new" + echo "" + echo "To use existing wallet, add to .env:" + echo " PRIVATE_KEY=" + echo "" + read -p "Continue without private key? (bot will not be able to execute trades) [y/N]: " confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + exit 1 + fi +fi + +# Verify RPC connectivity +echo -e "${YELLOW}Verifying RPC connectivity...${NC}" +RPC_URL=$(grep "^ARBITRUM_RPC_ENDPOINT=" .env | cut -d'=' -f2) +if [ -z "$RPC_URL" ]; then + RPC_URL="https://arb1.arbitrum.io/rpc" +fi + +if command -v cast &> /dev/null; then + if cast block-number --rpc-url "$RPC_URL" &> /dev/null; then + BLOCK=$(cast block-number --rpc-url "$RPC_URL") + echo -e "${GREEN}✓ RPC connected - Block: $BLOCK${NC}" + else + echo -e "${RED}✗ RPC connection failed${NC}" + echo "Please verify ARBITRUM_RPC_ENDPOINT in .env" + exit 1 + fi +else + echo -e "${YELLOW}⚠ Cannot verify RPC (cast not installed)${NC}" +fi + +# Stop existing container if running +echo "" +echo -e "${YELLOW}Checking for existing deployment...${NC}" +if podman ps -a | grep -q "mev-bot-v2-phase1"; then + echo "Stopping existing container..." + podman stop mev-bot-v2-phase1 2>/dev/null || true + podman rm mev-bot-v2-phase1 2>/dev/null || true +fi + +# Create Phase 1 environment file +echo "" +echo -e "${YELLOW}Creating Phase 1 configuration...${NC}" +cat > .env.phase1 << 'EOF' +# Phase 1: Mainnet Dry-Run Configuration +# Duration: 48 hours minimum +# Risk: NONE (monitoring only, no execution) + +# === SAFETY SETTINGS (ULTRA-CONSERVATIVE) === +ENABLE_EXECUTION=false +DRY_RUN_MODE=true +ENABLE_SIMULATION=true +ENABLE_FRONT_RUNNING=false + +# === DETECTION THRESHOLDS === +MIN_PROFIT_THRESHOLD=0.001 # 0.1% minimum (detect more opportunities) +MAX_SLIPPAGE_TOLERANCE=0.005 # 0.5% max slippage + +# === RISK LIMITS (NOT USED IN DRY-RUN BUT LOGGED) === +MAX_POSITION_SIZE_ETH=0.01 # 0.01 ETH +MAX_DAILY_VOLUME_ETH=0.1 # 0.1 ETH +MAX_CONSECUTIVE_LOSSES=1 # Stop after 1 loss +MAX_HOURLY_LOSS_ETH=0.01 # 0.01 ETH hourly +MAX_DAILY_LOSS_ETH=0.05 # 0.05 ETH daily + +# === MONITORING === +METRICS_ENABLED=true +METRICS_PORT=9090 +LOG_LEVEL=info +EOF + +# Merge with base .env +cp .env .env.phase1.bak +cat .env .env.phase1 > .env.phase1.merged +mv .env.phase1.merged .env.phase1 + +echo -e "${GREEN}✓ Phase 1 configuration created: .env.phase1${NC}" + +# Deploy container +echo "" +echo -e "${YELLOW}Deploying MEV Bot V2 (Phase 1)...${NC}" +podman run -d \ + --name mev-bot-v2-phase1 \ + --network host \ + --restart unless-stopped \ + --env-file .env.phase1 \ + -v $(pwd)/logs:/app/logs:z \ + mev-bot-v2:phase1-ready + +# Wait for startup +echo "" +echo -e "${YELLOW}Waiting for bot to initialize...${NC}" +sleep 5 + +# Check if container is running +if ! podman ps | grep -q "mev-bot-v2-phase1"; then + echo -e "${RED}✗ Container failed to start${NC}" + echo "" + echo "Logs:" + podman logs mev-bot-v2-phase1 + exit 1 +fi + +echo -e "${GREEN}✓ Bot deployed successfully${NC}" + +# Display initial logs +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Initial Bot Logs${NC}" +echo -e "${GREEN}========================================${NC}" +podman logs --tail 50 mev-bot-v2-phase1 + +# Display monitoring instructions +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Phase 1 Deployment Complete${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}Container:${NC} mev-bot-v2-phase1" +echo -e "${YELLOW}Mode:${NC} Dry-Run (monitoring only, NO trades)" +echo -e "${YELLOW}Duration:${NC} 48 hours minimum" +echo "" +echo -e "${GREEN}Monitoring Commands:${NC}" +echo " # View real-time logs" +echo " podman logs -f mev-bot-v2-phase1" +echo "" +echo " # Check for opportunities" +echo " podman logs mev-bot-v2-phase1 | grep -i 'opportunity'" +echo "" +echo " # Check for errors" +echo " podman logs mev-bot-v2-phase1 | grep -i 'error'" +echo "" +echo " # View safety configuration" +echo " podman logs mev-bot-v2-phase1 | grep -A20 'SAFETY CONFIGURATION'" +echo "" +echo -e "${GREEN}Emergency Stop:${NC}" +echo " # Method 1: Graceful shutdown" +echo " podman exec mev-bot-v2-phase1 touch /tmp/mev-bot-emergency-stop" +echo "" +echo " # Method 2: Immediate stop" +echo " podman stop mev-bot-v2-phase1" +echo "" +echo -e "${YELLOW}Next Steps:${NC}" +echo "1. Monitor logs every 4 hours" +echo "2. Look for arbitrage opportunities being detected" +echo "3. Verify no crashes or connection issues" +echo "4. After 48 hours, review logs and assess if opportunities exist" +echo "5. If successful, proceed to Phase 3 (minimal capital test)" +echo "" +echo -e "${RED}IMPORTANT: DO NOT enable ENABLE_EXECUTION until Phase 1 validates opportunities${NC}" +echo ""