1use serde::{Serialize, Deserialize};
5
6#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum AccountAuthOperationType {
8 #[serde(rename = "unknown")]
9 Unknown,
10 #[serde(rename = "enable")]
11 Enable,
12 #[serde(rename = "disable")]
13 Disable,
14 #[serde(rename = "addauthority")]
15 AddAuthority,
16 #[serde(rename = "removeauthority")]
17 RemoveAuthority,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
21pub enum AccountType {
22 #[serde(rename = "unknown")]
23 Unknown,
24 #[serde(rename = "anchorLedger", alias = "anchorledger")]
25 AnchorLedger,
26 #[serde(rename = "identity")]
27 Identity,
28 #[serde(rename = "tokenIssuer")]
29 TokenIssuer,
30 #[serde(rename = "tokenAccount", alias = "tokenaccount")]
31 TokenAccount,
32 #[serde(rename = "liteTokenAccount", alias = "litetokenaccount")]
33 LiteTokenAccount,
34 #[serde(rename = "blockLedger")]
35 BlockLedger,
36 #[serde(rename = "keyPage")]
37 KeyPage,
38 #[serde(rename = "keyBook")]
39 KeyBook,
40 #[serde(rename = "dataAccount", alias = "dataaccount")]
41 DataAccount,
42 #[serde(rename = "liteDataAccount")]
43 LiteDataAccount,
44 #[serde(rename = "unknownSigner")]
45 UnknownSigner,
46 #[serde(rename = "systemLedger")]
47 SystemLedger,
48 #[serde(rename = "liteIdentity")]
49 LiteIdentity,
50 #[serde(rename = "syntheticLedger")]
51 SyntheticLedger,
52}
53
54#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
55pub enum AllowedTransactionBit {
56 #[serde(rename = "updatekeypage")]
57 UpdateKeyPage,
58 #[serde(rename = "updateaccountauth")]
59 UpdateAccountAuth,
60}
61
62#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
63pub enum BookType {
64 #[serde(rename = "normal")]
65 Normal,
66 #[serde(rename = "validator")]
67 Validator,
68 #[serde(rename = "operator")]
69 Operator,
70}
71
72#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
73pub enum DataEntryType {
74 #[serde(rename = "unknown")]
75 Unknown,
76 #[serde(rename = "factom")]
77 Factom,
78 #[serde(rename = "accumulate")]
79 Accumulate,
80 #[serde(rename = "doublehash")]
81 DoubleHash,
82}
83
84#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
85pub enum ExecutorVersion {
86 #[serde(rename = "v1")]
87 V1,
88 #[serde(rename = "v1SignatureAnchoring", alias = "v1-signatureAnchoring")]
89 V1SignatureAnchoring,
90 #[serde(rename = "v1DoubleHashEntries", alias = "v1-doubleHashEntries")]
91 V1DoubleHashEntries,
92 #[serde(rename = "v1Halt", alias = "v1-halt")]
93 V1Halt,
94 #[serde(rename = "v2")]
95 V2,
96 #[serde(rename = "v2Baikonur", alias = "v2-baikonur")]
97 V2Baikonur,
98 #[serde(rename = "v2Vandenberg", alias = "v2-vandenberg")]
99 V2Vandenberg,
100 #[serde(rename = "v2Jiuquan", alias = "v2-jiuquan")]
101 V2Jiuquan,
102 #[serde(rename = "vNext", alias = "vnext")]
103 VNext,
104}
105
106#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
107pub enum KeyPageOperationType {
108 #[serde(rename = "unknown")]
109 Unknown,
110 #[serde(rename = "update")]
111 Update,
112 #[serde(rename = "remove")]
113 Remove,
114 #[serde(rename = "add")]
115 Add,
116 #[serde(rename = "setthreshold")]
117 SetThreshold,
118 #[serde(rename = "updateallowed")]
119 UpdateAllowed,
120 #[serde(rename = "setrejectthreshold")]
121 SetRejectThreshold,
122 #[serde(rename = "setresponsethreshold")]
123 SetResponseThreshold,
124}
125
126#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
127pub enum NetworkMaintenanceOperationType {
128 #[serde(rename = "unknown")]
129 Unknown,
130 #[serde(rename = "pendingtransactiongc")]
131 PendingTransactionGC,
132}
133
134#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
135pub enum ObjectType {
136 #[serde(rename = "unknown")]
137 Unknown,
138 #[serde(rename = "account")]
139 Account,
140 #[serde(rename = "transaction")]
141 Transaction,
142}
143
144#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
145pub enum PartitionType {
146 #[serde(rename = "directory")]
147 Directory,
148 #[serde(rename = "blockValidator", alias = "block-validator")]
149 BlockValidator,
150 #[serde(rename = "blockSummary", alias = "block-summary")]
151 BlockSummary,
152 #[serde(rename = "bootstrap")]
153 Bootstrap,
154}
155
156#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
157pub enum SignatureType {
158 #[serde(rename = "unknown")]
159 Unknown,
160 #[serde(rename = "legacyED25519")]
161 LegacyED25519,
162 #[serde(rename = "ed25519")]
163 ED25519,
164 #[serde(rename = "rcd1")]
165 RCD1,
166 #[serde(rename = "receipt")]
167 Receipt,
168 #[serde(rename = "synthetic")]
169 Partition,
170 #[serde(rename = "set")]
171 Set,
172 #[serde(rename = "remote")]
173 Remote,
174 #[serde(rename = "btc")]
175 BTC,
176 #[serde(rename = "btclegacy")]
177 BTCLegacy,
178 #[serde(rename = "eth")]
179 ETH,
180 #[serde(rename = "delegated")]
181 Delegated,
182 #[serde(rename = "internal")]
183 Internal,
184 #[serde(rename = "authority")]
185 Authority,
186 #[serde(rename = "rsasha256")]
187 RsaSha256,
188 #[serde(rename = "ecdsasha256")]
189 EcdsaSha256,
190 #[serde(rename = "typeddata")]
191 TypedData,
192}
193
194#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
195pub enum TransactionMax {
196 #[serde(rename = "user")]
197 User,
198 #[serde(rename = "synthetic")]
199 Synthetic,
200 #[serde(rename = "system")]
201 System,
202}
203
204#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
205pub enum TransactionType {
206 #[serde(rename = "unknown")]
207 Unknown,
208 #[serde(rename = "createIdentity")]
209 CreateIdentity,
210 #[serde(rename = "createTokenAccount")]
211 CreateTokenAccount,
212 #[serde(rename = "sendTokens")]
213 SendTokens,
214 #[serde(rename = "createDataAccount")]
215 CreateDataAccount,
216 #[serde(rename = "writeData")]
217 WriteData,
218 #[serde(rename = "writeDataTo")]
219 WriteDataTo,
220 #[serde(rename = "acmeFaucet")]
221 AcmeFaucet,
222 #[serde(rename = "createToken")]
223 CreateToken,
224 #[serde(rename = "issueTokens")]
225 IssueTokens,
226 #[serde(rename = "burnTokens")]
227 BurnTokens,
228 #[serde(rename = "createLiteTokenAccount")]
229 CreateLiteTokenAccount,
230 #[serde(rename = "createKeyPage")]
231 CreateKeyPage,
232 #[serde(rename = "createKeyBook")]
233 CreateKeyBook,
234 #[serde(rename = "addCredits")]
235 AddCredits,
236 #[serde(rename = "updateKeyPage")]
237 UpdateKeyPage,
238 #[serde(rename = "lockAccount")]
239 LockAccount,
240 #[serde(rename = "burnCredits")]
241 BurnCredits,
242 #[serde(rename = "transferCredits")]
243 TransferCredits,
244 #[serde(rename = "updateAccountAuth")]
245 UpdateAccountAuth,
246 #[serde(rename = "updateKey")]
247 UpdateKey,
248 #[serde(rename = "networkMaintenance")]
249 NetworkMaintenance,
250 #[serde(rename = "activateProtocolVersion")]
251 ActivateProtocolVersion,
252 #[serde(rename = "signPending")]
253 Remote,
254 #[serde(rename = "syntheticCreateIdentity")]
255 SyntheticCreateIdentity,
256 #[serde(rename = "syntheticWriteData")]
257 SyntheticWriteData,
258 #[serde(rename = "syntheticDepositTokens")]
259 SyntheticDepositTokens,
260 #[serde(rename = "syntheticDepositCredits")]
261 SyntheticDepositCredits,
262 #[serde(rename = "syntheticBurnTokens")]
263 SyntheticBurnTokens,
264 #[serde(rename = "syntheticForwardTransaction")]
265 SyntheticForwardTransaction,
266 #[serde(rename = "systemGenesis")]
267 SystemGenesis,
268 #[serde(rename = "directoryAnchor")]
269 DirectoryAnchor,
270 #[serde(rename = "blockValidatorAnchor")]
271 BlockValidatorAnchor,
272 #[serde(rename = "systemWriteData")]
273 SystemWriteData,
274}
275
276#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
277pub enum VoteType {
278 #[serde(rename = "accept")]
279 Accept,
280 #[serde(rename = "reject")]
281 Reject,
282 #[serde(rename = "abstain")]
283 Abstain,
284 #[serde(rename = "suggest")]
285 Suggest,
286}
287
288impl VoteType {
289 pub fn value(&self) -> u64 {
291 match self {
292 VoteType::Accept => 0,
293 VoteType::Reject => 1,
294 VoteType::Abstain => 2,
295 VoteType::Suggest => 3,
296 }
297 }
298
299 pub fn from_u64(value: u64) -> Option<Self> {
301 match value {
302 0 => Some(VoteType::Accept),
303 1 => Some(VoteType::Reject),
304 2 => Some(VoteType::Abstain),
305 3 => Some(VoteType::Suggest),
306 _ => None,
307 }
308 }
309
310 pub fn all() -> &'static [VoteType] {
312 &[VoteType::Accept, VoteType::Reject, VoteType::Abstain, VoteType::Suggest]
313 }
314
315 pub fn is_approval(&self) -> bool {
317 matches!(self, VoteType::Accept)
318 }
319
320 pub fn is_rejection(&self) -> bool {
322 matches!(self, VoteType::Reject)
323 }
324
325 pub fn is_abstention(&self) -> bool {
327 matches!(self, VoteType::Abstain)
328 }
329
330 pub fn is_suggestion(&self) -> bool {
332 matches!(self, VoteType::Suggest)
333 }
334
335 pub fn as_str(&self) -> &'static str {
337 match self {
338 VoteType::Accept => "accept",
339 VoteType::Reject => "reject",
340 VoteType::Abstain => "abstain",
341 VoteType::Suggest => "suggest",
342 }
343 }
344
345 pub fn from_str_case_insensitive(s: &str) -> Option<Self> {
347 match s.to_lowercase().as_str() {
348 "accept" => Some(VoteType::Accept),
349 "reject" => Some(VoteType::Reject),
350 "abstain" => Some(VoteType::Abstain),
351 "suggest" => Some(VoteType::Suggest),
352 _ => None,
353 }
354 }
355}
356
357impl Default for VoteType {
358 fn default() -> Self {
360 VoteType::Accept
361 }
362}
363
364impl std::fmt::Display for VoteType {
365 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
366 write!(f, "{}", self.as_str())
367 }
368}
369
370#[derive(Debug, Clone, Default, PartialEq, Eq)]
372pub struct VoteTally {
373 pub accept: u64,
375 pub reject: u64,
377 pub abstain: u64,
379 pub suggest: u64,
381}
382
383impl VoteTally {
384 pub fn new() -> Self {
386 Self::default()
387 }
388
389 pub fn add_vote(&mut self, vote: VoteType) {
391 match vote {
392 VoteType::Accept => self.accept += 1,
393 VoteType::Reject => self.reject += 1,
394 VoteType::Abstain => self.abstain += 1,
395 VoteType::Suggest => self.suggest += 1,
396 }
397 }
398
399 pub fn add_votes(&mut self, vote: VoteType, count: u64) {
401 match vote {
402 VoteType::Accept => self.accept += count,
403 VoteType::Reject => self.reject += count,
404 VoteType::Abstain => self.abstain += count,
405 VoteType::Suggest => self.suggest += count,
406 }
407 }
408
409 pub fn total_active(&self) -> u64 {
411 self.accept + self.reject + self.suggest
412 }
413
414 pub fn total(&self) -> u64 {
416 self.accept + self.reject + self.abstain + self.suggest
417 }
418
419 pub fn passes_simple_majority(&self) -> bool {
421 self.accept > self.reject
422 }
423
424 pub fn passes_strict_majority(&self) -> bool {
426 let total_active = self.total_active();
427 if total_active == 0 {
428 return false;
429 }
430 self.accept > total_active / 2
431 }
432
433 pub fn passes_supermajority(&self) -> bool {
435 let total_active = self.total_active();
436 if total_active == 0 {
437 return false;
438 }
439 self.accept * 3 >= total_active * 2
441 }
442
443 pub fn passes_threshold(&self, threshold_percent: u64) -> bool {
445 if threshold_percent > 100 {
446 return false;
447 }
448 let total_active = self.total_active();
449 if total_active == 0 {
450 return threshold_percent == 0;
451 }
452 self.accept * 100 >= total_active * threshold_percent
454 }
455
456 pub fn acceptance_percentage(&self) -> f64 {
458 let total_active = self.total_active();
459 if total_active == 0 {
460 return 0.0;
461 }
462 (self.accept as f64 / total_active as f64) * 100.0
463 }
464
465 pub fn merge(&mut self, other: &VoteTally) {
467 self.accept += other.accept;
468 self.reject += other.reject;
469 self.abstain += other.abstain;
470 self.suggest += other.suggest;
471 }
472}
473
474
475pub fn __roundtrip_one(enum_name: &str, tag: &str) -> Result<(), Box<dyn std::error::Error>> {
476 match enum_name {
477 "AccountAuthOperationType" => {
478 let v = serde_json::Value::String(tag.to_string());
479 let val: AccountAuthOperationType = serde_json::from_value(v.clone())?;
480 let back = serde_json::to_value(&val)?;
481 if back != v {
482 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
483 enum_name, tag, v, back).into());
484 }
485 }
486 "AccountType" => {
487 let v = serde_json::Value::String(tag.to_string());
488 let val: AccountType = serde_json::from_value(v.clone())?;
489 let back = serde_json::to_value(&val)?;
490 if back != v {
491 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
492 enum_name, tag, v, back).into());
493 }
494 }
495 "AllowedTransactionBit" => {
496 let v = serde_json::Value::String(tag.to_string());
497 let val: AllowedTransactionBit = serde_json::from_value(v.clone())?;
498 let back = serde_json::to_value(&val)?;
499 if back != v {
500 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
501 enum_name, tag, v, back).into());
502 }
503 }
504 "BookType" => {
505 let v = serde_json::Value::String(tag.to_string());
506 let val: BookType = serde_json::from_value(v.clone())?;
507 let back = serde_json::to_value(&val)?;
508 if back != v {
509 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
510 enum_name, tag, v, back).into());
511 }
512 }
513 "DataEntryType" => {
514 let v = serde_json::Value::String(tag.to_string());
515 let val: DataEntryType = serde_json::from_value(v.clone())?;
516 let back = serde_json::to_value(&val)?;
517 if back != v {
518 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
519 enum_name, tag, v, back).into());
520 }
521 }
522 "ExecutorVersion" => {
523 let v = serde_json::Value::String(tag.to_string());
524 let val: ExecutorVersion = serde_json::from_value(v.clone())?;
525 let back = serde_json::to_value(&val)?;
526 if back != v {
527 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
528 enum_name, tag, v, back).into());
529 }
530 }
531 "KeyPageOperationType" => {
532 let v = serde_json::Value::String(tag.to_string());
533 let val: KeyPageOperationType = serde_json::from_value(v.clone())?;
534 let back = serde_json::to_value(&val)?;
535 if back != v {
536 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
537 enum_name, tag, v, back).into());
538 }
539 }
540 "NetworkMaintenanceOperationType" => {
541 let v = serde_json::Value::String(tag.to_string());
542 let val: NetworkMaintenanceOperationType = serde_json::from_value(v.clone())?;
543 let back = serde_json::to_value(&val)?;
544 if back != v {
545 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
546 enum_name, tag, v, back).into());
547 }
548 }
549 "ObjectType" => {
550 let v = serde_json::Value::String(tag.to_string());
551 let val: ObjectType = serde_json::from_value(v.clone())?;
552 let back = serde_json::to_value(&val)?;
553 if back != v {
554 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
555 enum_name, tag, v, back).into());
556 }
557 }
558 "PartitionType" => {
559 let v = serde_json::Value::String(tag.to_string());
560 let val: PartitionType = serde_json::from_value(v.clone())?;
561 let back = serde_json::to_value(&val)?;
562 if back != v {
563 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
564 enum_name, tag, v, back).into());
565 }
566 }
567 "SignatureType" => {
568 let v = serde_json::Value::String(tag.to_string());
569 let val: SignatureType = serde_json::from_value(v.clone())?;
570 let back = serde_json::to_value(&val)?;
571 if back != v {
572 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
573 enum_name, tag, v, back).into());
574 }
575 }
576 "TransactionMax" => {
577 let v = serde_json::Value::String(tag.to_string());
578 let val: TransactionMax = serde_json::from_value(v.clone())?;
579 let back = serde_json::to_value(&val)?;
580 if back != v {
581 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
582 enum_name, tag, v, back).into());
583 }
584 }
585 "TransactionType" => {
586 let v = serde_json::Value::String(tag.to_string());
587 let val: TransactionType = serde_json::from_value(v.clone())?;
588 let back = serde_json::to_value(&val)?;
589 if back != v {
590 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
591 enum_name, tag, v, back).into());
592 }
593 }
594 "VoteType" => {
595 let v = serde_json::Value::String(tag.to_string());
596 let val: VoteType = serde_json::from_value(v.clone())?;
597 let back = serde_json::to_value(&val)?;
598 if back != v {
599 return Err(format!("Roundtrip failed for {}::{}: expected {}, got {}",
600 enum_name, tag, v, back).into());
601 }
602 }
603 _ => return Err(format!("Unknown enum: {}", enum_name).into()),
604 }
605 Ok(())
606}
607
608pub fn __get_all_enum_variants() -> std::collections::HashMap<String, Vec<String>> {
609 let mut map = std::collections::HashMap::new();
610 map.insert("AccountAuthOperationType".to_string(), vec!["unknown".to_string(), "enable".to_string(), "disable".to_string(), "addauthority".to_string(), "removeauthority".to_string()]);
611 map.insert("AccountType".to_string(), vec!["unknown".to_string(), "anchorledger".to_string(), "identity".to_string(), "token".to_string(), "tokenaccount".to_string(), "litetokenaccount".to_string(), "blockledger".to_string(), "keypage".to_string(), "keybook".to_string(), "dataaccount".to_string(), "litedataaccount".to_string(), "unknownsigner".to_string(), "systemledger".to_string(), "liteidentity".to_string(), "syntheticledger".to_string()]);
612 map.insert("AllowedTransactionBit".to_string(), vec!["updatekeypage".to_string(), "updateaccountauth".to_string()]);
613 map.insert("BookType".to_string(), vec!["normal".to_string(), "validator".to_string(), "operator".to_string()]);
614 map.insert("DataEntryType".to_string(), vec!["unknown".to_string(), "factom".to_string(), "accumulate".to_string(), "doublehash".to_string()]);
615 map.insert("ExecutorVersion".to_string(), vec!["v1".to_string(), "v1-signatureAnchoring".to_string(), "v1-doubleHashEntries".to_string(), "v1-halt".to_string(), "v2".to_string(), "v2-baikonur".to_string(), "v2-vandenberg".to_string(), "v2-jiuquan".to_string(), "vnext".to_string()]);
616 map.insert("KeyPageOperationType".to_string(), vec!["unknown".to_string(), "update".to_string(), "remove".to_string(), "add".to_string(), "setthreshold".to_string(), "updateallowed".to_string(), "setrejectthreshold".to_string(), "setresponsethreshold".to_string()]);
617 map.insert("NetworkMaintenanceOperationType".to_string(), vec!["unknown".to_string(), "pendingtransactiongc".to_string()]);
618 map.insert("ObjectType".to_string(), vec!["unknown".to_string(), "account".to_string(), "transaction".to_string()]);
619 map.insert("PartitionType".to_string(), vec!["directory".to_string(), "block-validator".to_string(), "block-summary".to_string(), "bootstrap".to_string()]);
620 map.insert("SignatureType".to_string(), vec!["unknown".to_string(), "legacyed25519".to_string(), "ed25519".to_string(), "rcd1".to_string(), "receipt".to_string(), "synthetic".to_string(), "set".to_string(), "remote".to_string(), "btc".to_string(), "btclegacy".to_string(), "eth".to_string(), "delegated".to_string(), "internal".to_string(), "authority".to_string(), "rsasha256".to_string(), "ecdsasha256".to_string(), "typeddata".to_string()]);
621 map.insert("TransactionMax".to_string(), vec!["user".to_string(), "synthetic".to_string(), "system".to_string()]);
622 map.insert("TransactionType".to_string(), vec!["unknown".to_string(), "createIdentity".to_string(), "createTokenAccount".to_string(), "sendTokens".to_string(), "createDataAccount".to_string(), "writeData".to_string(), "writeDataTo".to_string(), "acmeFaucet".to_string(), "createToken".to_string(), "issueTokens".to_string(), "burnTokens".to_string(), "createLiteTokenAccount".to_string(), "createKeyPage".to_string(), "createKeyBook".to_string(), "addCredits".to_string(), "updateKeyPage".to_string(), "lockAccount".to_string(), "burnCredits".to_string(), "transferCredits".to_string(), "updateAccountAuth".to_string(), "updateKey".to_string(), "networkMaintenance".to_string(), "activateProtocolVersion".to_string(), "signPending".to_string(), "syntheticCreateIdentity".to_string(), "syntheticWriteData".to_string(), "syntheticDepositTokens".to_string(), "syntheticDepositCredits".to_string(), "syntheticBurnTokens".to_string(), "syntheticForwardTransaction".to_string(), "systemGenesis".to_string(), "directoryAnchor".to_string(), "blockValidatorAnchor".to_string(), "systemWriteData".to_string()]);
623 map.insert("VoteType".to_string(), vec!["accept".to_string(), "reject".to_string(), "abstain".to_string(), "suggest".to_string()]);
624 map
625}