sui_replay/fuzz_mutations/
shuffle_commands.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::fuzz::TransactionKindMutator;
5use rand::seq::SliceRandom;
6use sui_types::transaction::TransactionKind;
7use tracing::info;
8
9pub struct ShuffleCommands {
10    pub rng: rand::rngs::StdRng,
11    pub num_mutations_per_base_left: u64,
12}
13
14impl TransactionKindMutator for ShuffleCommands {
15    fn mutate(&mut self, transaction_kind: &TransactionKind) -> Option<TransactionKind> {
16        if self.num_mutations_per_base_left == 0 {
17            // Nothing else to do
18            return None;
19        }
20
21        self.num_mutations_per_base_left -= 1;
22        if let TransactionKind::ProgrammableTransaction(mut p) = transaction_kind.clone() {
23            p.commands.shuffle(&mut self.rng);
24            info!("Mutation: Shuffling commands");
25            Some(TransactionKind::ProgrammableTransaction(p))
26        } else {
27            // Other types not supported yet
28            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}