trident_fuzz/trident/
mod.rs1use 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#[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}