trident_fuzz/trident/
mod.rs

1use trident_config::TridentConfig;
2use trident_fuzz_metrics::TridentFuzzingData;
3use trident_svm::trident_svm::TridentSVM;
4use trident_svm::types::trident_account::TridentAccountSharedData;
5use trident_svm::types::trident_program::TridentProgram;
6
7use crate::trident_rng::TridentRng;
8
9mod client;
10pub mod flow_executor;
11mod system;
12mod transaction_result;
13
14mod metrics;
15mod random;
16mod seed;
17#[cfg(feature = "stake")]
18mod stake;
19#[cfg(feature = "token")]
20mod token;
21#[cfg(feature = "token")]
22mod token2022;
23#[cfg(feature = "vote")]
24mod vote;
25
26// Re-export token2022 types
27#[cfg(feature = "token")]
28pub use token2022::AccountExtension;
29#[cfg(feature = "token")]
30pub use token2022::MintExtension;
31#[cfg(feature = "token")]
32pub use token2022::MintExtensionData;
33#[cfg(feature = "token")]
34pub use token2022::MintWithExtensions;
35#[cfg(feature = "token")]
36pub use token2022::TokenAccountExtensionData;
37#[cfg(feature = "token")]
38pub use token2022::TokenAccountWithExtensions;
39
40pub struct Trident {
41    pub(crate) client: TridentSVM,
42    pub(crate) fuzzing_data: TridentFuzzingData,
43    pub(crate) rng: TridentRng,
44}
45
46impl Default for Trident {
47    fn default() -> Self {
48        Self {
49            client: Self::new_client(),
50            fuzzing_data: TridentFuzzingData::default(),
51            rng: TridentRng::default(),
52        }
53    }
54}
55
56impl Trident {
57    fn new_client() -> TridentSVM {
58        let config = TridentConfig::new();
59        let program_binaries =
60            config
61                .programs()
62                .iter()
63                .fold(Vec::new(), |mut sbf_programs, config_program| {
64                    let target = TridentProgram::new(
65                        config_program.address,
66                        config_program.upgrade_authority,
67                        config_program.data.clone(),
68                    );
69
70                    sbf_programs.push(target);
71                    sbf_programs
72                });
73
74        let permanent_accounts =
75            config
76                .accounts()
77                .iter()
78                .fold(Vec::new(), |mut permanent_accounts, config_account| {
79                    let account = TridentAccountSharedData::new(
80                        config_account.pubkey,
81                        config_account.account.clone(),
82                    );
83                    permanent_accounts.push(account);
84                    permanent_accounts
85                });
86
87        let mut svm_builder = TridentSVM::builder();
88        svm_builder.with_syscalls_v1();
89        svm_builder.with_syscalls_v2();
90        svm_builder.with_sbf_programs(program_binaries);
91        svm_builder.with_permanent_accounts(permanent_accounts);
92
93        if std::env::var("TRIDENT_FUZZ_DEBUG_PATH").is_ok()
94            && std::env::var("TRIDENT_FUZZ_DEBUG").is_ok()
95        {
96            let debug_path =
97                std::env::var("TRIDENT_FUZZ_DEBUG_PATH").unwrap_or("trident_debug.log".to_string());
98            svm_builder.with_debug_file_logs(&debug_path);
99        } else if std::env::var("TRIDENT_LOG").is_ok() {
100            svm_builder.with_cli_logs();
101        }
102
103        svm_builder.build()
104    }
105}