1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
pub mod feature;
pub mod unlock_condition;
use primitive_types::U256;
use crate::{
output::{
unlock_condition::ImmutableAliasAddressUnlockCondition, AliasId, AliasOutput, BasicOutput, FoundryOutput,
InputsCommitment, NftId, NftOutput, Output, OutputId, SimpleTokenScheme, TokenScheme, TreasuryOutput,
OUTPUT_INDEX_RANGE,
},
rand::{
address::rand_alias_address,
bytes::rand_bytes_array,
number::{rand_number, rand_number_range},
output::{
feature::rand_allowed_features,
unlock_condition::{
rand_address_unlock_condition, rand_address_unlock_condition_different_from,
rand_governor_address_unlock_condition_different_from,
rand_state_controller_address_unlock_condition_different_from,
},
},
transaction::rand_transaction_id,
},
};
pub fn rand_output_id() -> OutputId {
OutputId::new(rand_transaction_id(), rand_number_range(OUTPUT_INDEX_RANGE)).unwrap()
}
pub fn rand_treasury_output(token_supply: u64) -> TreasuryOutput {
TreasuryOutput::new(rand_number_range(0..token_supply), token_supply).unwrap()
}
pub fn rand_basic_output(token_supply: u64) -> BasicOutput {
let features = rand_allowed_features(BasicOutput::ALLOWED_FEATURES);
BasicOutput::build_with_amount(rand_number_range(Output::AMOUNT_MIN..token_supply))
.unwrap()
.with_features(features)
.add_unlock_condition(rand_address_unlock_condition().into())
.finish(token_supply)
.unwrap()
}
pub fn rand_alias_id() -> AliasId {
AliasId::from(rand_bytes_array())
}
pub fn rand_alias_output(token_supply: u64) -> AliasOutput {
let features = rand_allowed_features(AliasOutput::ALLOWED_FEATURES);
let alias_id = rand_alias_id();
AliasOutput::build_with_amount(rand_number_range(Output::AMOUNT_MIN..token_supply), alias_id)
.unwrap()
.with_features(features)
.add_unlock_condition(rand_state_controller_address_unlock_condition_different_from(&alias_id).into())
.add_unlock_condition(rand_governor_address_unlock_condition_different_from(&alias_id).into())
.finish(token_supply)
.unwrap()
}
pub fn rand_token_scheme() -> TokenScheme {
let max = U256::from(rand_bytes_array()).saturating_add(U256::one());
let minted = U256::from(rand_bytes_array()) % max.saturating_add(U256::one());
let melted = U256::from(rand_bytes_array()) % minted.saturating_add(U256::one());
TokenScheme::Simple(SimpleTokenScheme::new(minted, melted, max).unwrap())
}
pub fn rand_foundry_output(token_supply: u64) -> FoundryOutput {
let features = rand_allowed_features(FoundryOutput::ALLOWED_FEATURES);
FoundryOutput::build_with_amount(
rand_number_range(Output::AMOUNT_MIN..token_supply),
rand_number(),
rand_token_scheme(),
)
.unwrap()
.with_features(features)
.add_unlock_condition(ImmutableAliasAddressUnlockCondition::new(rand_alias_address()).into())
.finish(token_supply)
.unwrap()
}
pub fn rand_nft_output(token_supply: u64) -> NftOutput {
let features = rand_allowed_features(NftOutput::ALLOWED_FEATURES);
let nft_id = NftId::from(rand_bytes_array());
NftOutput::build_with_amount(rand_number_range(Output::AMOUNT_MIN..token_supply), nft_id)
.unwrap()
.with_features(features)
.add_unlock_condition(rand_address_unlock_condition_different_from(&nft_id).into())
.finish(token_supply)
.unwrap()
}
pub fn rand_inputs_commitment() -> InputsCommitment {
InputsCommitment::from(rand_bytes_array())
}
pub fn rand_output(token_supply: u64) -> Output {
match rand_number::<u64>() % 5 {
0 => rand_treasury_output(token_supply).into(),
1 => rand_basic_output(token_supply).into(),
2 => rand_alias_output(token_supply).into(),
3 => rand_foundry_output(token_supply).into(),
4 => rand_nft_output(token_supply).into(),
_ => unreachable!(),
}
}