sui_replay/fuzz_mutations/
shuffle_transaction_inputs.rs1use crate::fuzz::TransactionKindMutator;
5use rand::seq::SliceRandom;
6use sui_types::transaction::TransactionKind;
7use tracing::info;
8
9pub struct ShuffleTransactionInputs {
10 pub rng: rand::rngs::StdRng,
11 pub num_mutations_per_base_left: u64,
12}
13
14impl TransactionKindMutator for ShuffleTransactionInputs {
15 fn mutate(&mut self, transaction_kind: &TransactionKind) -> Option<TransactionKind> {
16 if self.num_mutations_per_base_left == 0 {
17 return None;
19 }
20
21 self.num_mutations_per_base_left -= 1;
22 if let TransactionKind::ProgrammableTransaction(mut p) = transaction_kind.clone() {
23 p.inputs.shuffle(&mut self.rng);
24 info!("Mutation: Shuffling transaction inputs");
25 Some(TransactionKind::ProgrammableTransaction(p))
26 } else {
27 None
29 }
30 }
31
32 fn reset(&mut self, mutations_per_base: u64) {
33 self.num_mutations_per_base_left = mutations_per_base;
34 }
35}