forge-guard 0.1.0

Pre-deployment smart contract auditing framework for Foundry
Documentation
//! `forge upgrade-check` — analyze upgrade paths and proxy safety.

use crate::core::{Finding, Severity};

use super::UpgradeCheckArgs;
use anyhow::Result;
use colored::*;

/// Analyze upgrade paths and proxy safety.
pub fn run(args: &UpgradeCheckArgs) -> Result<()> {
    eprintln!("{}", "⬆️  Forge Guard — Upgrade Check".bold());

    let mut findings: Vec<Finding> = Vec::new();

    if args.storage_collision {
        eprintln!("\n🔍 Checking for storage collisions...");
        findings.extend(check_storage_collisions(args)?);
    }

    if args.uups {
        eprintln!("\n🔍 Checking UUPS upgrade path...");
        findings.extend(check_uups(args)?);
    }

    // Generic proxy checks
    eprintln!("\n🔍 Analyzing proxy configuration...");
    findings.extend(check_proxy_config(args)?);

    // Report findings
    if findings.is_empty() {
        println!("\n{} No upgrade issues found!", "".green().bold());
    } else {
        println!(
            "\n{} {} upgrade-related issues found:",
            "⚠️".yellow().bold(),
            findings.len()
        );
        for f in &findings {
            let color = if f.severity >= Severity::High {
                "red"
            } else {
                "yellow"
            };
            println!(
                "\n  [{}] {}",
                f.severity.to_string().color(color).bold(),
                f.title.bold()
            );
            println!("       {}", f.description);
            println!("       💡 {}", f.recommendation);
        }
    }

    if args.shared.json {
        println!("{}", serde_json::to_string_pretty(&findings)?);
    }

    Ok(())
}

fn check_storage_collisions(_args: &UpgradeCheckArgs) -> Result<Vec<Finding>> {
    // Future: deep storage layout comparison
    Ok(Vec::new())
}

fn check_uups(_args: &UpgradeCheckArgs) -> Result<Vec<Finding>> {
    // Future: UUPS upgrade path validation
    Ok(Vec::new())
}

fn check_proxy_config(_args: &UpgradeCheckArgs) -> Result<Vec<Finding>> {
    // Future: full proxy analysis
    Ok(Vec::new())
}