trident-fuzz-metrics 0.12.0

Trident is Rust based fuzzing framework for Solana programs written in Anchor.
Documentation
use std::collections::BTreeMap;

use crate::types::Seed;

#[derive(Debug, serde::Serialize, serde::Deserialize, Clone, Default)]
pub(crate) struct TransactionPanicMetrics {
    panics: BTreeMap<String, TransactionPanicMetricsMetadata>,
}

#[derive(Debug, serde::Serialize, serde::Deserialize, Clone, Default)]
pub(crate) struct TransactionPanicMetricsMetadata {
    occurrences: u64,
    seed: String,
    logs: Option<Vec<String>>,
    instruction_inputs: String,
}

impl TransactionPanicMetrics {
    pub(crate) fn add_transaction_panic(
        &mut self,
        panic: &str,
        seed: &Seed,
        logs: Option<Vec<String>>,
        instruction_inputs: String,
    ) {
        self.panics
            .entry(panic.to_string())
            .and_modify(|metadata| metadata.occurrences += 1)
            .or_insert(TransactionPanicMetricsMetadata {
                occurrences: 1,
                seed: hex::encode(seed),
                logs,
                instruction_inputs,
            });
    }

    pub(crate) fn concat(&mut self, other: &TransactionPanicMetrics) {
        for (other_panic, other_metadata) in other.panics.iter() {
            self.panics
                .entry(other_panic.to_string())
                .and_modify(|metadata| metadata.occurrences += other_metadata.occurrences)
                .or_insert(other_metadata.clone());
        }
    }

    pub(crate) fn to_dashboard_format(&self) -> serde_json::Value {
        serde_json::to_value(&self.panics).unwrap_or_default()
    }
}