Skip to content

Commit cafda11

Browse files
authored
feat: hardcoded identity transfers in strategy tests (#2312)
2 parents feacde2 + dc48827 commit cafda11

File tree

6 files changed

+138
-66
lines changed

6 files changed

+138
-66
lines changed

packages/rs-drive-abci/tests/strategy_tests/main.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2602,7 +2602,10 @@ mod tests {
26022602
&simple_signer,
26032603
&mut rng,
26042604
platform_version,
2605-
);
2605+
)
2606+
.into_iter()
2607+
.map(|(identity, transition)| (identity, Some(transition)))
2608+
.collect();
26062609

26072610
let strategy = NetworkStrategy {
26082611
strategy: Strategy {
@@ -3910,7 +3913,7 @@ mod tests {
39103913
strategy: Strategy {
39113914
start_contracts: vec![],
39123915
operations: vec![Operation {
3913-
op_type: OperationType::IdentityTransfer,
3916+
op_type: OperationType::IdentityTransfer(None),
39143917
frequency: Frequency {
39153918
times_per_block_range: 1..3,
39163919
chance_per_block: None,

packages/rs-drive-abci/tests/strategy_tests/strategy.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use drive_abci::rpc::core::MockCoreRPCLike;
4141
use rand::prelude::{IteratorRandom, SliceRandom, StdRng};
4242
use rand::Rng;
4343
use strategy_tests::Strategy;
44-
use strategy_tests::transitions::{create_state_transitions_for_identities, create_state_transitions_for_identities_and_proofs, instant_asset_lock_proof_fixture, instant_asset_lock_proof_fixture_with_dynamic_range};
44+
use strategy_tests::transitions::{create_state_transitions_for_identities, create_state_transitions_for_identities_and_proofs, instant_asset_lock_proof_fixture_with_dynamic_range};
4545
use std::borrow::Cow;
4646
use std::collections::{BTreeMap, HashMap, HashSet};
4747
use std::ops::RangeInclusive;
@@ -404,8 +404,18 @@ impl NetworkStrategy {
404404
);
405405
state_transitions.append(&mut new_transitions);
406406
}
407+
// Extend the state transitions with the strategy's hard coded start identities
408+
// Filtering out the ones that have no create transition
407409
if !self.strategy.start_identities.hard_coded.is_empty() {
408-
state_transitions.extend(self.strategy.start_identities.hard_coded.clone());
410+
state_transitions.extend(
411+
self.strategy.start_identities.hard_coded.iter().filter_map(
412+
|(identity, transition)| {
413+
transition.as_ref().map(|create_transition| {
414+
(identity.clone(), create_transition.clone())
415+
})
416+
},
417+
),
418+
);
409419
}
410420
}
411421
let frequency = &self.strategy.identity_inserts.frequency;
@@ -1196,7 +1206,7 @@ impl NetworkStrategy {
11961206
operations.push(state_transition);
11971207
}
11981208
}
1199-
OperationType::IdentityTransfer if current_identities.len() > 1 => {
1209+
OperationType::IdentityTransfer(_) if current_identities.len() > 1 => {
12001210
let identities_clone = current_identities.clone();
12011211

12021212
// Sender is the first in the list, which should be loaded_identity

packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,17 @@ mod tests {
7979

8080
simple_signer.add_keys(keys1);
8181

82-
let start_identities = create_state_transitions_for_identities(
83-
vec![identity1],
84-
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
85-
&simple_signer,
86-
&mut rng,
87-
platform_version,
88-
);
82+
let start_identities: Vec<(Identity, Option<StateTransition>)> =
83+
create_state_transitions_for_identities(
84+
vec![identity1],
85+
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
86+
&simple_signer,
87+
&mut rng,
88+
platform_version,
89+
)
90+
.into_iter()
91+
.map(|(identity, transition)| (identity, Some(transition)))
92+
.collect();
8993

9094
let dpns_contract = platform
9195
.drive
@@ -363,13 +367,17 @@ mod tests {
363367

364368
simple_signer.add_keys(keys2);
365369

366-
let start_identities = create_state_transitions_for_identities(
367-
vec![identity1, identity2],
368-
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
369-
&simple_signer,
370-
&mut rng,
371-
platform_version,
372-
);
370+
let start_identities: Vec<(Identity, Option<StateTransition>)> =
371+
create_state_transitions_for_identities(
372+
vec![identity1, identity2],
373+
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
374+
&simple_signer,
375+
&mut rng,
376+
platform_version,
377+
)
378+
.into_iter()
379+
.map(|(identity, transition)| (identity, Some(transition)))
380+
.collect();
373381

374382
let dpns_contract = platform
375383
.drive
@@ -635,13 +643,17 @@ mod tests {
635643

636644
simple_signer.add_keys(keys2);
637645

638-
let start_identities = create_state_transitions_for_identities(
639-
vec![identity1, identity2],
640-
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
641-
&simple_signer,
642-
&mut rng,
643-
platform_version,
644-
);
646+
let start_identities: Vec<(Identity, Option<StateTransition>)> =
647+
create_state_transitions_for_identities(
648+
vec![identity1, identity2],
649+
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
650+
&simple_signer,
651+
&mut rng,
652+
platform_version,
653+
)
654+
.into_iter()
655+
.map(|(identity, transition)| (identity, Some(transition)))
656+
.collect();
645657

646658
let dpns_contract = platform
647659
.drive
@@ -988,13 +1000,17 @@ mod tests {
9881000

9891001
simple_signer.add_keys(keys2);
9901002

991-
let start_identities = create_state_transitions_for_identities(
992-
vec![identity1, identity2],
993-
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
994-
&simple_signer,
995-
&mut rng,
996-
platform_version,
997-
);
1003+
let start_identities: Vec<(Identity, Option<StateTransition>)> =
1004+
create_state_transitions_for_identities(
1005+
vec![identity1, identity2],
1006+
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
1007+
&simple_signer,
1008+
&mut rng,
1009+
platform_version,
1010+
)
1011+
.into_iter()
1012+
.map(|(identity, transition)| (identity, Some(transition)))
1013+
.collect();
9981014

9991015
let dpns_contract = platform
10001016
.drive
@@ -1353,13 +1369,17 @@ mod tests {
13531369

13541370
simple_signer.add_keys(keys2);
13551371

1356-
let start_identities = create_state_transitions_for_identities(
1357-
vec![identity1, identity2],
1358-
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
1359-
&simple_signer,
1360-
&mut rng,
1361-
platform_version,
1362-
);
1372+
let start_identities: Vec<(Identity, Option<StateTransition>)> =
1373+
create_state_transitions_for_identities(
1374+
vec![identity1, identity2],
1375+
&(dash_to_duffs!(1)..=dash_to_duffs!(1)),
1376+
&simple_signer,
1377+
&mut rng,
1378+
platform_version,
1379+
)
1380+
.into_iter()
1381+
.map(|(identity, transition)| (identity, Some(transition)))
1382+
.collect();
13631383

13641384
let dpns_contract = platform
13651385
.drive

packages/strategy-tests/src/lib.rs

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ use platform_version::TryFromPlatformVersioned;
4444
use rand::prelude::StdRng;
4545
use rand::seq::{IteratorRandom, SliceRandom};
4646
use rand::Rng;
47+
use transitions::create_identity_credit_transfer_transition;
4748
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
4849
use std::ops::RangeInclusive;
4950
use bincode::{Decode, Encode};
@@ -146,7 +147,7 @@ pub struct StartIdentities {
146147
pub keys_per_identity: u8,
147148
pub starting_balances: u64, // starting balance in duffs
148149
pub extra_keys: KeyMaps,
149-
pub hard_coded: Vec<(Identity, StateTransition)>,
150+
pub hard_coded: Vec<(Identity, Option<StateTransition>)>,
150151
}
151152

152153
/// Identities to register on the first block of the strategy
@@ -1287,38 +1288,65 @@ impl Strategy {
12871288
}
12881289

12891290
// Generate state transition for identity transfer operation
1290-
OperationType::IdentityTransfer if current_identities.len() > 1 => {
1291+
OperationType::IdentityTransfer(identity_transfer_info) => {
12911292
for _ in 0..count {
1292-
let identities_count = current_identities.len();
1293-
if identities_count == 0 {
1294-
break;
1295-
}
1293+
// Handle the case where specific sender, recipient, and amount are provided
1294+
if let Some(transfer_info) = identity_transfer_info {
1295+
let sender = current_identities
1296+
.iter()
1297+
.find(|identity| identity.id() == transfer_info.from)
1298+
.expect(
1299+
"Expected to find sender identity in hardcoded start identities",
1300+
);
1301+
let recipient = current_identities
1302+
.iter()
1303+
.find(|identity| identity.id() == transfer_info.to)
1304+
.expect(
1305+
"Expected to find recipient identity in hardcoded start identities",
1306+
);
12961307

1297-
// Select a random identity from the current_identities for the sender
1298-
let random_index_sender = rng.gen_range(0..identities_count);
1308+
let state_transition = create_identity_credit_transfer_transition(
1309+
&sender,
1310+
&recipient,
1311+
identity_nonce_counter,
1312+
signer, // This means in the TUI, the loaded identity must always be the sender since we're always signing with it for now
1313+
transfer_info.amount,
1314+
);
1315+
operations.push(state_transition);
1316+
} else if current_identities.len() > 1 {
1317+
// Handle the case where no sender, recipient, and amount are provided
12991318

1300-
// Clone current_identities to a Vec for manipulation
1301-
let mut unused_identities: Vec<_> =
1302-
current_identities.iter().cloned().collect();
1303-
unused_identities.remove(random_index_sender); // Remove the sender
1304-
let unused_identities_count = unused_identities.len();
1319+
let identities_count = current_identities.len();
1320+
if identities_count == 0 {
1321+
break;
1322+
}
13051323

1306-
// Select a random identity from the remaining ones for the recipient
1307-
let random_index_recipient = rng.gen_range(0..unused_identities_count);
1308-
let recipient = &unused_identities[random_index_recipient];
1324+
// Select a random identity from the current_identities for the sender
1325+
let random_index_sender = rng.gen_range(0..identities_count);
13091326

1310-
// Use the sender index on the original slice
1311-
let sender = &mut current_identities[random_index_sender];
1327+
// Clone current_identities to a Vec for manipulation
1328+
let mut unused_identities: Vec<_> =
1329+
current_identities.iter().cloned().collect();
1330+
unused_identities.remove(random_index_sender); // Remove the sender
1331+
let unused_identities_count = unused_identities.len();
13121332

1313-
let state_transition =
1314-
crate::transitions::create_identity_credit_transfer_transition(
1333+
// Select a random identity from the remaining ones for the recipient
1334+
let random_index_recipient =
1335+
rng.gen_range(0..unused_identities_count);
1336+
let recipient = &unused_identities[random_index_recipient];
1337+
1338+
// Use the sender index on the original slice
1339+
let sender = &mut current_identities[random_index_sender];
1340+
1341+
let state_transition = create_identity_credit_transfer_transition(
13151342
sender,
13161343
recipient,
13171344
identity_nonce_counter,
13181345
signer,
13191346
300000,
13201347
);
1321-
operations.push(state_transition);
1348+
operations.push(state_transition);
1349+
}
13221350
}
13231351
}
13241352

packages/strategy-tests/src/operations.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,13 @@ impl VoteAction {
497497

498498
pub type AmountRange = RangeInclusive<Credits>;
499499

500+
#[derive(Clone, Debug, PartialEq, Encode, Decode)]
501+
pub struct IdentityTransferInfo {
502+
pub from: Identifier,
503+
pub to: Identifier,
504+
pub amount: Credits,
505+
}
506+
500507
#[derive(Clone, Debug, PartialEq)]
501508
pub enum OperationType {
502509
Document(DocumentOp),
@@ -505,7 +512,7 @@ pub enum OperationType {
505512
IdentityWithdrawal(AmountRange),
506513
ContractCreate(RandomDocumentTypeParameters, DocumentTypeCount),
507514
ContractUpdate(DataContractUpdateOp),
508-
IdentityTransfer,
515+
IdentityTransfer(Option<IdentityTransferInfo>),
509516
ResourceVote(ResourceVoteOp),
510517
}
511518

@@ -517,7 +524,7 @@ enum OperationTypeInSerializationFormat {
517524
IdentityWithdrawal(AmountRange),
518525
ContractCreate(RandomDocumentTypeParameters, DocumentTypeCount),
519526
ContractUpdate(Vec<u8>),
520-
IdentityTransfer,
527+
IdentityTransfer(Option<IdentityTransferInfo>),
521528
ResourceVote(ResourceVoteOpSerializable),
522529
}
523530

@@ -563,7 +570,9 @@ impl PlatformSerializableWithPlatformVersion for OperationType {
563570
contract_op_in_serialization_format,
564571
)
565572
}
566-
OperationType::IdentityTransfer => OperationTypeInSerializationFormat::IdentityTransfer,
573+
OperationType::IdentityTransfer(identity_transfer_info) => {
574+
OperationTypeInSerializationFormat::IdentityTransfer(identity_transfer_info)
575+
}
567576
OperationType::ResourceVote(resource_vote_op) => {
568577
let vote_op_in_serialization_format =
569578
resource_vote_op.try_into_platform_versioned(platform_version)?;
@@ -626,7 +635,9 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Ope
626635
)?;
627636
OperationType::ContractUpdate(update_op)
628637
}
629-
OperationTypeInSerializationFormat::IdentityTransfer => OperationType::IdentityTransfer,
638+
OperationTypeInSerializationFormat::IdentityTransfer(identity_transfer_info) => {
639+
OperationType::IdentityTransfer(identity_transfer_info)
640+
}
630641
OperationTypeInSerializationFormat::ResourceVote(resource_vote_op) => {
631642
let vote_op = resource_vote_op.try_into_platform_versioned(platform_version)?;
632643
OperationType::ResourceVote(vote_op)

packages/strategy-tests/src/transitions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ pub fn create_identity_withdrawal_transition_with_output_address(
802802
/// - If the sender's identity does not have a suitable authentication key available for signing.
803803
/// - If there's an error during the signing process.
804804
pub fn create_identity_credit_transfer_transition(
805-
identity: &mut Identity,
805+
identity: &Identity,
806806
recipient: &Identity,
807807
identity_nonce_counter: &mut BTreeMap<Identifier, u64>,
808808
signer: &mut SimpleSigner,

0 commit comments

Comments
 (0)