catbuffer_rust/
account_state_builder.rs1use super::account_key_type_flags_dto::*;
23use super::account_state_format_dto::*;
24use super::account_type_dto::*;
25use super::address_dto::*;
26use super::generator_utils::*;
27use super::height_activity_buckets_builder::*;
28use super::height_dto::*;
29use super::importance_snapshot_builder::*;
30use super::key_dto::*;
31use super::mosaic_builder::*;
32use super::pinned_voting_key_builder::*;
33use super::state_header_builder::*;
34
35#[derive(Debug, Clone)]
37pub struct AccountStateBuilder {
38 super_object: StateHeaderBuilder,
40 address: AddressDto,
42 address_height: HeightDto,
44 public_key: KeyDto,
46 public_key_height: HeightDto,
48 account_type: AccountTypeDto,
50 format: AccountStateFormatDto,
52 supplemental_public_keys_mask: Vec<AccountKeyTypeFlagsDto>,
54 linked_public_key: Option<KeyDto>,
56 node_public_key: Option<KeyDto>,
58 vrf_public_key: Option<KeyDto>,
60 voting_public_keys: Vec<PinnedVotingKeyBuilder>,
62 importance_snapshots: Option<ImportanceSnapshotBuilder>,
64 activity_buckets: Option<HeightActivityBucketsBuilder>,
66 balances: Vec<MosaicBuilder>,
68}
69
70
71impl AccountStateBuilder {
72 pub fn from_binary(_bytes: &[u8]) -> Self {
77 let super_object = StateHeaderBuilder::from_binary(_bytes);
78 let mut _bytes = _bytes[super_object.get_size()..].to_vec();
79 let address = AddressDto::from_binary(&_bytes); let mut _bytes = _bytes[address.get_size()..].to_vec();
81 let address_height = HeightDto::from_binary(&_bytes); let mut _bytes = _bytes[address_height.get_size()..].to_vec();
83 let public_key = KeyDto::from_binary(&_bytes); let mut _bytes = _bytes[public_key.get_size()..].to_vec();
85 let public_key_height = HeightDto::from_binary(&_bytes); let mut _bytes = _bytes[public_key_height.get_size()..].to_vec();
87 let account_type = AccountTypeDto::from_binary(&_bytes); let mut _bytes = _bytes[account_type.get_size()..].to_vec();
89 let format = AccountStateFormatDto::from_binary(&_bytes); let mut _bytes = _bytes[format.get_size()..].to_vec();
91 let supplemental_public_keys_mask = AccountKeyTypeFlagsDto::bytes_to_flags(&_bytes[..1]); let mut _bytes = (&_bytes[1..]).to_vec();
93 let buf = fixed_bytes::<1>(&_bytes);
94 let votingPublicKeysCount = u8::from_le_bytes(buf); let mut _bytes = (&_bytes[1..]).to_vec();
96 let mut linked_public_key = None;
97 if supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::LINKED) {
98 let raw_linked_public_key = KeyDto::from_binary(&_bytes);
99 _bytes = (&_bytes[raw_linked_public_key.get_size()..]).to_vec();
100 linked_public_key = Some(raw_linked_public_key); }
102 let mut node_public_key = None;
103 if supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::NODE) {
104 let raw_node_public_key = KeyDto::from_binary(&_bytes);
105 _bytes = (&_bytes[raw_node_public_key.get_size()..]).to_vec();
106 node_public_key = Some(raw_node_public_key); }
108 let mut vrf_public_key = None;
109 if supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::VRF) {
110 let raw_vrf_public_key = KeyDto::from_binary(&_bytes);
111 _bytes = (&_bytes[raw_vrf_public_key.get_size()..]).to_vec();
112 vrf_public_key = Some(raw_vrf_public_key); }
114 let mut voting_public_keys: Vec<PinnedVotingKeyBuilder> = vec![]; let mut _bytes = _bytes.to_vec();
116 for _ in 0..votingPublicKeysCount {
117 let item = PinnedVotingKeyBuilder::from_binary(&_bytes);
118 voting_public_keys.push(item.clone());
119 _bytes = (&_bytes[item.get_size()..]).to_vec();
120 }
121 let mut importance_snapshots = None;
122 if format == AccountStateFormatDto::HIGH_VALUE {
123 let raw_importance_snapshots = ImportanceSnapshotBuilder::from_binary(&_bytes);
124 _bytes = (&_bytes[raw_importance_snapshots.get_size()..]).to_vec();
125 importance_snapshots = Some(raw_importance_snapshots); }
127 let mut activity_buckets = None;
128 if format == AccountStateFormatDto::HIGH_VALUE {
129 let raw_activity_buckets = HeightActivityBucketsBuilder::from_binary(&_bytes);
130 _bytes = (&_bytes[raw_activity_buckets.get_size()..]).to_vec();
131 activity_buckets = Some(raw_activity_buckets); }
133 let buf = fixed_bytes::<2>(&_bytes);
134 let balancesCount = u16::from_le_bytes(buf); let mut _bytes = (&_bytes[2..]).to_vec();
136 let mut balances: Vec<MosaicBuilder> = vec![]; let mut _bytes = _bytes.to_vec();
138 for _ in 0..balancesCount {
139 let item = MosaicBuilder::from_binary(&_bytes);
140 balances.push(item.clone());
141 _bytes = (&_bytes[item.get_size()..]).to_vec();
142 }
143 AccountStateBuilder { super_object, address, address_height, public_key, public_key_height, account_type, format, supplemental_public_keys_mask, linked_public_key, node_public_key, vrf_public_key, voting_public_keys, importance_snapshots, activity_buckets, balances }
144 }
145
146 pub fn get_address(&self) -> AddressDto {
151 self.address.clone()
152 }
153
154 pub fn get_address_height(&self) -> HeightDto {
159 self.address_height.clone()
160 }
161
162 pub fn get_public_key(&self) -> KeyDto {
167 self.public_key.clone()
168 }
169
170 pub fn get_public_key_height(&self) -> HeightDto {
175 self.public_key_height.clone()
176 }
177
178 pub fn get_account_type(&self) -> AccountTypeDto {
183 self.account_type.clone()
184 }
185
186 pub fn get_format(&self) -> AccountStateFormatDto {
191 self.format.clone()
192 }
193
194 pub fn get_supplemental_public_keys_mask(&self) -> Vec<AccountKeyTypeFlagsDto> {
199 self.supplemental_public_keys_mask.clone()
200 }
201
202 pub fn get_linked_public_key(&self) -> Option<KeyDto> {
207 if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::LINKED) {
208 panic!("supplementalPublicKeysMask is not set to LINKED.")
209 };
210 self.linked_public_key.clone()
211 }
212
213 pub fn get_node_public_key(&self) -> Option<KeyDto> {
218 if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::NODE) {
219 panic!("supplementalPublicKeysMask is not set to NODE.")
220 };
221 self.node_public_key.clone()
222 }
223
224 pub fn get_vrf_public_key(&self) -> Option<KeyDto> {
229 if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::VRF) {
230 panic!("supplementalPublicKeysMask is not set to VRF.")
231 };
232 self.vrf_public_key.clone()
233 }
234
235 pub fn get_voting_public_keys(&self) -> Vec<PinnedVotingKeyBuilder> {
240 self.voting_public_keys.clone() }
242
243 pub fn get_importance_snapshots(&self) -> Option<ImportanceSnapshotBuilder> {
248 if self.format != AccountStateFormatDto::HIGH_VALUE {
249 panic!("format is not set to HIGH_VALUE.")
250 };
251 self.importance_snapshots.clone()
252 }
253
254 pub fn get_activity_buckets(&self) -> Option<HeightActivityBucketsBuilder> {
259 if self.format != AccountStateFormatDto::HIGH_VALUE {
260 panic!("format is not set to HIGH_VALUE.")
261 };
262 self.activity_buckets.clone()
263 }
264
265 pub fn get_balances(&self) -> Vec<MosaicBuilder> {
270 self.balances.clone() }
272
273 pub fn get_size(&self) -> usize {
278 let mut size = self.super_object.get_size();
279 size += self.address.get_size(); size += self.address_height.get_size(); size += self.public_key.get_size(); size += self.public_key_height.get_size(); size += self.account_type.get_size(); size += self.format.get_size(); size += 1; size += 1; if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::LINKED) {
288 size += self.linked_public_key.as_ref().unwrap().get_size(); }
290 if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::NODE) {
291 size += self.node_public_key.as_ref().unwrap().get_size(); }
293 if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::VRF) {
294 size += self.vrf_public_key.as_ref().unwrap().get_size(); }
296 size += self.voting_public_keys.iter().map(|item| item.get_size()).sum::<usize>(); if self.format == AccountStateFormatDto::HIGH_VALUE {
298 size += self.importance_snapshots.as_ref().unwrap().get_size(); }
300 if self.format == AccountStateFormatDto::HIGH_VALUE {
301 size += self.activity_buckets.as_ref().unwrap().get_size(); }
303 size += 2; size += self.balances.iter().map(|item| item.get_size()).sum::<usize>(); size
306 }
307
308 pub fn serializer(&self) -> Vec<u8> {
313 let mut buf: Vec<u8> = vec![];
314 buf.append(&mut self.super_object.serializer());
315 buf.append(&mut self.address.serializer()); buf.append(&mut self.address_height.serializer()); buf.append(&mut self.public_key.serializer()); buf.append(&mut self.public_key_height.serializer()); buf.append(&mut self.account_type.serializer()); buf.append(&mut self.format.serializer()); buf.append(&mut AccountKeyTypeFlagsDto::flags_to_int(self.get_supplemental_public_keys_mask()).to_le_bytes().to_vec()); buf.append(&mut (self.get_voting_public_keys().len() as u8).to_le_bytes().to_vec()); if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::LINKED) {
324 buf.append(&mut self.linked_public_key.as_ref().unwrap().serializer()); };
326 if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::NODE) {
327 buf.append(&mut self.node_public_key.as_ref().unwrap().serializer()); };
329 if self.supplemental_public_keys_mask.iter().any(|&i| i == AccountKeyTypeFlagsDto::VRF) {
330 buf.append(&mut self.vrf_public_key.as_ref().unwrap().serializer()); };
332 for i in &self.voting_public_keys {
333 buf.append(&mut i.serializer()); }
335 if self.format == AccountStateFormatDto::HIGH_VALUE {
336 buf.append(&mut self.importance_snapshots.as_ref().unwrap().serializer()); };
338 if self.format == AccountStateFormatDto::HIGH_VALUE {
339 buf.append(&mut self.activity_buckets.as_ref().unwrap().serializer()); };
341 buf.append(&mut (self.get_balances().len() as u16).to_le_bytes().to_vec()); for i in &self.balances {
343 buf.append(&mut i.serializer()); }
345 buf
346 }
347}
348