1use ave_common::{
5 Namespace, SchemaType, ValueWrapper, identity::PublicKey,
6 schematype::ReservedWords,
7};
8use borsh::{BorshDeserialize, BorshSerialize};
9use serde::{Deserialize, Serialize};
10
11use std::{
12 collections::{BTreeSet, HashSet},
13 vec,
14};
15
16pub type MemberName = String;
17
18pub use ave_common::governance::{
19 CreatorQuantity, CreatorWitness, Member, ProtocolTypes, Quorum, Role,
20 RoleCreator,
21};
22
23#[derive(
25 Serialize,
26 Deserialize,
27 Clone,
28 Debug,
29 Hash,
30 PartialEq,
31 Eq,
32 BorshDeserialize,
33 BorshSerialize,
34)]
35pub struct Schema {
36 pub initial_value: ValueWrapper,
37 pub contract: String,
38 pub viewpoints: BTreeSet<String>,
39}
40
41pub struct NameCreators {
42 pub validation: Option<HashSet<String>>,
43 pub evaluation: Option<HashSet<String>>,
44}
45
46impl NameCreators {
47 pub const fn is_empty(&self) -> bool {
48 self.validation.is_none() && self.evaluation.is_none()
49 }
50}
51
52pub struct SchemaKeyCreators {
53 pub schema_id: SchemaType,
54 pub validation: Option<HashSet<PublicKey>>,
55 pub evaluation: Option<HashSet<PublicKey>>,
56}
57
58#[derive(
59 Serialize,
60 Deserialize,
61 Clone,
62 Debug,
63 PartialEq,
64 Eq,
65 Default,
66 BorshDeserialize,
67 BorshSerialize,
68)]
69pub struct RolesGov {
70 pub approver: BTreeSet<MemberName>,
71 pub evaluator: BTreeSet<MemberName>,
72 pub validator: BTreeSet<MemberName>,
73 pub witness: BTreeSet<MemberName>,
74 pub issuer: RoleGovIssuer,
75}
76
77impl RolesGov {
78 pub fn check_basic_gov(&self) -> bool {
79 self.approver.contains(&ReservedWords::Owner.to_string())
80 && self.evaluator.contains(&ReservedWords::Owner.to_string())
81 && self.validator.contains(&ReservedWords::Owner.to_string())
82 && self.witness.contains(&ReservedWords::Owner.to_string())
83 && self
84 .issuer
85 .signers
86 .contains(&ReservedWords::Owner.to_string())
87 }
88
89 pub fn remove_member_role(&mut self, remove_members: &Vec<String>) {
90 for remove in remove_members {
91 self.approver.remove(remove);
92 self.evaluator.remove(remove);
93 self.validator.remove(remove);
94 self.witness.remove(remove);
95 self.issuer.signers.remove(remove);
96 }
97 }
98
99 pub fn change_name_role(
100 &mut self,
101 chang_name_members: &Vec<(String, String)>,
102 ) {
103 for (old_name, new_name) in chang_name_members {
104 if self.approver.remove(old_name) {
105 self.approver.insert(new_name.clone());
106 };
107 if self.evaluator.remove(old_name) {
108 self.evaluator.insert(new_name.clone());
109 };
110 if self.validator.remove(old_name) {
111 self.validator.insert(new_name.clone());
112 };
113 if self.witness.remove(old_name) {
114 self.witness.insert(new_name.clone());
115 };
116 if self.issuer.signers.remove(old_name) {
117 self.issuer.signers.insert(new_name.clone());
118 };
119 }
120 }
121
122 pub fn hash_this_rol(&self, role: RoleTypes, name: &str) -> bool {
123 match role {
124 RoleTypes::Approver => self.approver.contains(name),
125 RoleTypes::Evaluator => self.evaluator.contains(name),
126 RoleTypes::Validator => self.validator.contains(name),
127 RoleTypes::Issuer => {
128 self.issuer.signers.contains(name) || self.issuer.any
129 }
130 RoleTypes::Creator => false,
131 RoleTypes::Witness => self.witness.contains(name),
132 }
133 }
134
135 pub fn get_signers(&self, role: RoleTypes) -> (Vec<String>, bool) {
136 match role {
137 RoleTypes::Evaluator => (
138 self.evaluator.iter().cloned().collect::<Vec<String>>(),
139 false,
140 ),
141 RoleTypes::Validator => (
142 self.validator.iter().cloned().collect::<Vec<String>>(),
143 false,
144 ),
145 RoleTypes::Approver => (
146 self.approver.iter().cloned().collect::<Vec<String>>(),
147 false,
148 ),
149 RoleTypes::Issuer => (
150 self.issuer.signers.iter().cloned().collect::<Vec<String>>(),
151 self.issuer.any,
152 ),
153 RoleTypes::Witness => {
154 (self.witness.iter().cloned().collect::<Vec<String>>(), false)
155 }
156 RoleTypes::Creator => (vec![], false),
157 }
158 }
159}
160
161#[derive(
162 Serialize,
163 Deserialize,
164 Clone,
165 Debug,
166 PartialEq,
167 Eq,
168 Default,
169 BorshDeserialize,
170 BorshSerialize,
171)]
172pub struct RolesTrackerSchemas {
173 pub evaluator: BTreeSet<Role>,
174 pub validator: BTreeSet<Role>,
175 pub witness: BTreeSet<Role>,
176 pub issuer: RoleSchemaIssuer,
177}
178
179impl From<RolesTrackerSchemas> for RolesSchema {
180 fn from(value: RolesTrackerSchemas) -> Self {
181 Self {
182 evaluator: value.evaluator,
183 validator: value.validator,
184 witness: value.witness,
185 creator: BTreeSet::new(),
186 issuer: value.issuer,
187 }
188 }
189}
190
191impl From<RolesSchema> for RolesTrackerSchemas {
192 fn from(value: RolesSchema) -> Self {
193 Self {
194 evaluator: value.evaluator,
195 validator: value.validator,
196 witness: value.witness,
197 issuer: value.issuer,
198 }
199 }
200}
201
202impl RolesTrackerSchemas {
203 pub fn role_namespace(
204 &self,
205 role: ProtocolTypes,
206 name: &str,
207 ) -> Vec<Namespace> {
208 let role = RoleTypes::from(role);
209 match role {
210 RoleTypes::Evaluator => self
211 .evaluator
212 .iter()
213 .filter(|x| x.name == name)
214 .map(|x| x.namespace.clone())
215 .collect(),
216 RoleTypes::Validator => self
217 .validator
218 .iter()
219 .filter(|x| x.name == name)
220 .map(|x| x.namespace.clone())
221 .collect(),
222 RoleTypes::Approver => {
223 vec![]
224 }
225 _ => unreachable!("The role is obtained from ProtocolTypes"),
226 }
227 }
228
229 pub fn hash_this_rol_not_namespace(
230 &self,
231 role: ProtocolTypes,
232 name: &str,
233 ) -> bool {
234 let role = RoleTypes::from(role);
235 match role {
236 RoleTypes::Evaluator => {
237 self.evaluator.iter().any(|x| x.name == name)
238 }
239 RoleTypes::Validator => {
240 self.validator.iter().any(|x| x.name == name)
241 }
242 RoleTypes::Approver => false,
243 _ => unreachable!("The role is obtained from ProtocolTypes"),
244 }
245 }
246
247 pub fn roles_namespace(
248 &self,
249 name: &str,
250 ) -> (Option<Vec<Namespace>>, Option<Vec<Namespace>>) {
251 let val_namespace = self
252 .validator
253 .iter()
254 .filter(|x| x.name == name)
255 .map(|x| x.namespace.clone())
256 .collect::<Vec<Namespace>>();
257 let eval_namespace = self
258 .evaluator
259 .iter()
260 .filter(|x| x.name == name)
261 .map(|x| x.namespace.clone())
262 .collect::<Vec<Namespace>>();
263
264 let val_namespace = if val_namespace.is_empty() {
265 None
266 } else {
267 Some(val_namespace)
268 };
269
270 let eval_namespace = if eval_namespace.is_empty() {
271 None
272 } else {
273 Some(eval_namespace)
274 };
275
276 (val_namespace, eval_namespace)
277 }
278
279 pub fn remove_member_role(&mut self, remove_members: &Vec<String>) {
280 for remove in remove_members {
281 self.evaluator.retain(|x| x.name != *remove);
282 self.validator.retain(|x| x.name != *remove);
283 self.witness.retain(|x| x.name != *remove);
284 self.issuer.signers.retain(|x| x.name != *remove);
285 }
286 }
287
288 pub fn change_name_role(
289 &mut self,
290 chang_name_members: &Vec<(String, String)>,
291 ) {
292 for (old_name, new_name) in chang_name_members {
293 self.evaluator = self
294 .evaluator
295 .iter()
296 .map(|x| {
297 if x.name == *old_name {
298 Role {
299 name: new_name.clone(),
300 namespace: x.namespace.clone(),
301 }
302 } else {
303 x.clone()
304 }
305 })
306 .collect();
307
308 self.validator = self
309 .validator
310 .iter()
311 .map(|x| {
312 if x.name == *old_name {
313 Role {
314 name: new_name.clone(),
315 namespace: x.namespace.clone(),
316 }
317 } else {
318 x.clone()
319 }
320 })
321 .collect();
322
323 self.witness = self
324 .witness
325 .iter()
326 .map(|x| {
327 if x.name == *old_name {
328 Role {
329 name: new_name.clone(),
330 namespace: x.namespace.clone(),
331 }
332 } else {
333 x.clone()
334 }
335 })
336 .collect();
337
338 self.issuer.signers = self
339 .issuer
340 .signers
341 .iter()
342 .map(|x| {
343 if x.name == *old_name {
344 Role {
345 name: new_name.clone(),
346 namespace: x.namespace.clone(),
347 }
348 } else {
349 x.clone()
350 }
351 })
352 .collect();
353 }
354 }
355
356 pub const fn issuer_any(&self) -> bool {
357 self.issuer.any
358 }
359
360 pub fn hash_this_rol(
361 &self,
362 role: RoleTypes,
363 namespace: Namespace,
364 name: &str,
365 ) -> bool {
366 match role {
367 RoleTypes::Evaluator => self.evaluator.iter().any(|x| {
368 let namespace_role = x.namespace.clone();
369 namespace_role.is_ancestor_or_equal_of(&namespace)
370 && x.name == name
371 }),
372 RoleTypes::Validator => self.validator.iter().any(|x| {
373 let namespace_role = x.namespace.clone();
374 namespace_role.is_ancestor_or_equal_of(&namespace)
375 && x.name == name
376 }),
377 RoleTypes::Witness => self.witness.iter().any(|x| {
378 let namespace_role = x.namespace.clone();
379 namespace_role.is_ancestor_or_equal_of(&namespace)
380 && x.name == name
381 }),
382 RoleTypes::Issuer => {
383 self.issuer.signers.iter().any(|x| {
384 let namespace_role = x.namespace.clone();
385 namespace_role.is_ancestor_or_equal_of(&namespace)
386 && x.name == name
387 }) || self.issuer.any
388 }
389 RoleTypes::Approver | RoleTypes::Creator => false,
390 }
391 }
392
393 pub fn get_signers(
394 &self,
395 role: RoleTypes,
396 namespace: Namespace,
397 ) -> (Vec<String>, bool) {
398 match role {
399 RoleTypes::Evaluator => (
400 self.evaluator
401 .iter()
402 .filter(|x| {
403 let namespace_role = x.namespace.clone();
404 namespace_role.is_ancestor_or_equal_of(&namespace)
405 })
406 .map(|x| x.name.clone())
407 .collect::<Vec<String>>(),
408 false,
409 ),
410 RoleTypes::Validator => (
411 self.validator
412 .iter()
413 .filter(|x| {
414 let namespace_role = x.namespace.clone();
415 namespace_role.is_ancestor_or_equal_of(&namespace)
416 })
417 .map(|x| x.name.clone())
418 .collect::<Vec<String>>(),
419 false,
420 ),
421 RoleTypes::Witness => (
422 self.witness
423 .iter()
424 .filter(|x| {
425 let namespace_role = x.namespace.clone();
426 namespace_role.is_ancestor_or_equal_of(&namespace)
427 })
428 .map(|x| x.name.clone())
429 .collect::<Vec<String>>(),
430 false,
431 ),
432 RoleTypes::Issuer => (
433 self.issuer
434 .signers
435 .iter()
436 .filter(|x| {
437 let namespace_role = x.namespace.clone();
438 namespace_role.is_ancestor_or_equal_of(&namespace)
439 })
440 .map(|x| x.name.clone())
441 .collect::<Vec<String>>(),
442 self.issuer.any,
443 ),
444 RoleTypes::Approver | RoleTypes::Creator => (vec![], false),
445 }
446 }
447}
448
449#[derive(
450 Serialize,
451 Deserialize,
452 Clone,
453 Debug,
454 PartialEq,
455 Eq,
456 Default,
457 BorshDeserialize,
458 BorshSerialize,
459)]
460pub struct RolesSchema {
461 pub evaluator: BTreeSet<Role>,
462 pub validator: BTreeSet<Role>,
463 pub witness: BTreeSet<Role>,
464 pub creator: BTreeSet<RoleCreator>,
465 pub issuer: RoleSchemaIssuer,
466}
467
468impl RolesSchema {
469 pub fn creator_witnesses(
470 &self,
471 name: &str,
472 namespace: Namespace,
473 ) -> BTreeSet<String> {
474 self.creator
475 .get(&RoleCreator::create(name, namespace))
476 .map(|x| {
477 x.witnesses
478 .iter()
479 .map(|witness| witness.name.clone())
480 .collect()
481 })
482 .unwrap_or_default()
483 }
484
485 pub fn remove_member_role(&mut self, remove_members: &Vec<String>) {
486 for remove in remove_members {
487 self.evaluator.retain(|x| x.name != *remove);
488 self.validator.retain(|x| x.name != *remove);
489 self.witness.retain(|x| x.name != *remove);
490 self.issuer.signers.retain(|x| x.name != *remove);
491 self.creator = std::mem::take(&mut self.creator)
492 .into_iter()
493 .filter(|x| x.name != *remove)
494 .map(|mut c| {
495 c.witnesses.retain(|x| x.name != *remove);
496 c
497 })
498 .collect();
499 }
500 }
501
502 pub fn change_name_role(
503 &mut self,
504 chang_name_members: &Vec<(String, String)>,
505 ) {
506 for (old_name, new_name) in chang_name_members {
507 self.evaluator = self
508 .evaluator
509 .iter()
510 .map(|x| {
511 if x.name == *old_name {
512 Role {
513 name: new_name.clone(),
514 namespace: x.namespace.clone(),
515 }
516 } else {
517 x.clone()
518 }
519 })
520 .collect();
521
522 self.validator = self
523 .validator
524 .iter()
525 .map(|x| {
526 if x.name == *old_name {
527 Role {
528 name: new_name.clone(),
529 namespace: x.namespace.clone(),
530 }
531 } else {
532 x.clone()
533 }
534 })
535 .collect();
536
537 self.witness = self
538 .witness
539 .iter()
540 .map(|x| {
541 if x.name == *old_name {
542 Role {
543 name: new_name.clone(),
544 namespace: x.namespace.clone(),
545 }
546 } else {
547 x.clone()
548 }
549 })
550 .collect();
551
552 self.creator = self
553 .creator
554 .iter()
555 .map(|x| {
556 if x.name == *old_name {
557 RoleCreator {
558 quantity: x.quantity.clone(),
559 name: new_name.clone(),
560 witnesses: x
561 .witnesses
562 .iter()
563 .map(|w| {
564 if w.name == *old_name {
565 CreatorWitness {
566 name: new_name.clone(),
567 viewpoints: w.viewpoints.clone(),
568 }
569 } else {
570 w.clone()
571 }
572 })
573 .collect(),
574 namespace: x.namespace.clone(),
575 }
576 } else {
577 let mut role = x.clone();
578 role.witnesses = role
579 .witnesses
580 .iter()
581 .map(|w| {
582 if w.name == *old_name {
583 CreatorWitness {
584 name: new_name.clone(),
585 viewpoints: w.viewpoints.clone(),
586 }
587 } else {
588 w.clone()
589 }
590 })
591 .collect();
592 role
593 }
594 })
595 .collect();
596
597 self.issuer.signers = self
598 .issuer
599 .signers
600 .iter()
601 .map(|x| {
602 if x.name == *old_name {
603 Role {
604 name: new_name.clone(),
605 namespace: x.namespace.clone(),
606 }
607 } else {
608 x.clone()
609 }
610 })
611 .collect();
612 }
613 }
614
615 pub fn roles_creators(
616 &self,
617 name: &str,
618 not_gov_val: Option<Vec<Namespace>>,
619 not_gov_eval: Option<Vec<Namespace>>,
620 ) -> NameCreators {
621 let mut val_namespace = self
622 .validator
623 .iter()
624 .filter(|x| x.name == name)
625 .map(|x| x.namespace.clone())
626 .collect::<Vec<Namespace>>();
627 if let Some(mut not_gov_val) = not_gov_val {
628 val_namespace.append(&mut not_gov_val);
629 }
630
631 let mut eval_namespace = self
632 .evaluator
633 .iter()
634 .filter(|x| x.name == name)
635 .map(|x| x.namespace.clone())
636 .collect::<Vec<Namespace>>();
637 if let Some(mut not_gov_eval) = not_gov_eval {
638 eval_namespace.append(&mut not_gov_eval);
639 }
640
641 let mut creators_val: Vec<String> = vec![];
642 for namespace in val_namespace.clone() {
643 let mut creators = self
644 .creator
645 .iter()
646 .filter(|x| {
647 let namespace_role = x.namespace.clone();
648 namespace.is_ancestor_or_equal_of(&namespace_role)
649 })
650 .map(|x| x.name.clone())
651 .collect::<Vec<String>>();
652
653 creators_val.append(&mut creators);
654 }
655
656 let mut creators_eval: Vec<String> = vec![];
657 for namespace in eval_namespace.clone() {
658 let mut creators = self
659 .creator
660 .iter()
661 .filter(|x| {
662 let namespace_role = x.namespace.clone();
663 namespace.is_ancestor_or_equal_of(&namespace_role)
664 })
665 .map(|x| x.name.clone())
666 .collect::<Vec<String>>();
667
668 creators_eval.append(&mut creators);
669 }
670
671 let hash_val: Option<HashSet<String>> = if val_namespace.is_empty() {
672 None
673 } else {
674 Some(HashSet::from_iter(creators_val.iter().cloned()))
675 };
676
677 let hash_eval: Option<HashSet<String>> = if eval_namespace.is_empty() {
678 None
679 } else {
680 Some(HashSet::from_iter(creators_eval.iter().cloned()))
681 };
682
683 NameCreators {
684 validation: hash_val,
685 evaluation: hash_eval,
686 }
687 }
688
689 pub const fn issuer_any(&self) -> bool {
690 self.issuer.any
691 }
692
693 pub fn hash_this_rol(
694 &self,
695 role: RoleTypes,
696 namespace: Namespace,
697 name: &str,
698 ) -> bool {
699 match role {
700 RoleTypes::Evaluator => self.evaluator.iter().any(|x| {
701 let namespace_role = x.namespace.clone();
702 namespace_role.is_ancestor_or_equal_of(&namespace)
703 && x.name == name
704 }),
705 RoleTypes::Validator => self.validator.iter().any(|x| {
706 let namespace_role = x.namespace.clone();
707 namespace_role.is_ancestor_or_equal_of(&namespace)
708 && x.name == name
709 }),
710 RoleTypes::Witness => self.witness.iter().any(|x| {
711 let namespace_role = x.namespace.clone();
712 namespace_role.is_ancestor_or_equal_of(&namespace)
713 && x.name == name
714 }),
715 RoleTypes::Creator => self.creator.iter().any(|x| {
716 let namespace_role = x.namespace.clone();
717 namespace_role.is_ancestor_or_equal_of(&namespace)
718 && x.name == name
719 }),
720 RoleTypes::Issuer => {
721 self.issuer.signers.iter().any(|x| {
722 let namespace_role = x.namespace.clone();
723 namespace_role.is_ancestor_or_equal_of(&namespace)
724 && x.name == name
725 }) || self.issuer.any
726 }
727 RoleTypes::Approver => false,
728 }
729 }
730
731 pub fn role_namespace(
732 &self,
733 role: ProtocolTypes,
734 name: &str,
735 ) -> Vec<Namespace> {
736 let role = RoleTypes::from(role);
737 match role {
738 RoleTypes::Evaluator => self
739 .evaluator
740 .iter()
741 .filter(|x| x.name == name)
742 .map(|x| x.namespace.clone())
743 .collect(),
744 RoleTypes::Validator => self
745 .validator
746 .iter()
747 .filter(|x| x.name == name)
748 .map(|x| x.namespace.clone())
749 .collect(),
750 RoleTypes::Approver => {
751 vec![]
752 }
753 _ => unreachable!("The role is obtained from ProtocolTypes"),
754 }
755 }
756
757 pub fn hash_this_rol_not_namespace(
758 &self,
759 role: ProtocolTypes,
760 name: &str,
761 ) -> bool {
762 let role = RoleTypes::from(role);
763 match role {
764 RoleTypes::Evaluator => {
765 self.evaluator.iter().any(|x| x.name == name)
766 }
767 RoleTypes::Validator => {
768 self.validator.iter().any(|x| x.name == name)
769 }
770 RoleTypes::Approver => false,
771 _ => unreachable!("The role is obtained from ProtocolTypes"),
772 }
773 }
774
775 pub fn max_creations(
776 &self,
777 namespace: Namespace,
778 name: &str,
779 ) -> Option<CreatorQuantity> {
780 self.creator
781 .get(&RoleCreator {
782 name: name.to_string(),
783 namespace,
784 witnesses: BTreeSet::default(),
785 quantity: CreatorQuantity::Infinity,
786 })
787 .map(|x| x.quantity.clone())
788 }
789
790 pub fn get_signers(
791 &self,
792 role: RoleTypes,
793 namespace: Namespace,
794 ) -> (Vec<String>, bool) {
795 match role {
796 RoleTypes::Evaluator => (
797 self.evaluator
798 .iter()
799 .filter(|x| {
800 let namespace_role = x.namespace.clone();
801 namespace_role.is_ancestor_or_equal_of(&namespace)
802 })
803 .map(|x| x.name.clone())
804 .collect::<Vec<String>>(),
805 false,
806 ),
807 RoleTypes::Validator => (
808 self.validator
809 .iter()
810 .filter(|x| {
811 let namespace_role = x.namespace.clone();
812 namespace_role.is_ancestor_or_equal_of(&namespace)
813 })
814 .map(|x| x.name.clone())
815 .collect::<Vec<String>>(),
816 false,
817 ),
818 RoleTypes::Witness => (
819 self.witness
820 .iter()
821 .filter(|x| {
822 let namespace_role = x.namespace.clone();
823 namespace_role.is_ancestor_or_equal_of(&namespace)
824 })
825 .map(|x| x.name.clone())
826 .collect::<Vec<String>>(),
827 false,
828 ),
829 RoleTypes::Creator => (
830 self.creator
831 .iter()
832 .filter(|x| {
833 let namespace_role = x.namespace.clone();
834 namespace_role.is_ancestor_or_equal_of(&namespace)
835 })
836 .map(|x| x.name.clone())
837 .collect::<Vec<String>>(),
838 false,
839 ),
840 RoleTypes::Issuer => (
841 self.issuer
842 .signers
843 .iter()
844 .filter(|x| {
845 let namespace_role = x.namespace.clone();
846 namespace_role.is_ancestor_or_equal_of(&namespace)
847 })
848 .map(|x| x.name.clone())
849 .collect::<Vec<String>>(),
850 self.issuer.any,
851 ),
852 RoleTypes::Approver => (vec![], false),
853 }
854 }
855}
856
857#[derive(Serialize, Deserialize, Clone, Debug)]
858pub enum RoleTypes {
859 Approver,
860 Evaluator,
861 Validator,
862 Witness,
863 Creator,
864 Issuer,
865}
866
867impl From<ProtocolTypes> for RoleTypes {
868 fn from(value: ProtocolTypes) -> Self {
869 match value {
870 ProtocolTypes::Approval => Self::Approver,
871 ProtocolTypes::Evaluation => Self::Evaluator,
872 ProtocolTypes::Validation => Self::Validator,
873 }
874 }
875}
876
877pub enum WitnessesData {
878 Gov,
879 Schema {
880 creator: PublicKey,
881 schema_id: SchemaType,
882 namespace: Namespace,
883 },
884}
885
886impl WitnessesData {
887 pub fn build(
888 schema_id: SchemaType,
889 namespace: Namespace,
890 creator: PublicKey,
891 ) -> Self {
892 if schema_id.is_gov() {
893 Self::Gov
894 } else {
895 Self::Schema {
896 creator,
897 schema_id,
898 namespace,
899 }
900 }
901 }
902}
903
904pub enum HashThisRole {
905 Gov {
906 who: PublicKey,
907 role: RoleTypes,
908 },
909 Schema {
910 who: PublicKey,
911 role: RoleTypes,
912 schema_id: SchemaType,
913 namespace: Namespace,
914 },
915 SchemaWitness {
916 who: PublicKey,
917 creator: PublicKey,
918 schema_id: SchemaType,
919 namespace: Namespace,
920 },
921}
922
923impl HashThisRole {
924 pub fn get_who(&self) -> PublicKey {
925 match self {
926 Self::Gov { who, .. } => who.clone(),
927 Self::Schema { who, .. } => who.clone(),
928 Self::SchemaWitness { who, .. } => who.clone(),
929 }
930 }
931}
932
933#[derive(
934 Debug,
935 Serialize,
936 Deserialize,
937 Clone,
938 PartialEq,
939 Eq,
940 Default,
941 BorshDeserialize,
942 BorshSerialize,
943)]
944pub struct RoleGovIssuer {
945 pub signers: BTreeSet<MemberName>,
946 pub any: bool,
947}
948
949#[derive(
950 Debug,
951 Serialize,
952 Deserialize,
953 Clone,
954 PartialEq,
955 Eq,
956 Default,
957 BorshDeserialize,
958 BorshSerialize,
959)]
960pub struct RoleSchemaIssuer {
961 pub signers: BTreeSet<Role>,
962 pub any: bool,
963}
964
965#[derive(
967 Debug,
968 Serialize,
969 Deserialize,
970 Clone,
971 PartialEq,
972 Eq,
973 Default,
974 BorshDeserialize,
975 BorshSerialize,
976)]
977pub struct PolicyGov {
978 pub approve: Quorum,
980 pub evaluate: Quorum,
982 pub validate: Quorum,
984}
985
986impl PolicyGov {
987 pub fn get_quorum(&self, role: ProtocolTypes) -> Option<Quorum> {
988 match role {
989 ProtocolTypes::Approval => Some(self.approve.clone()),
990 ProtocolTypes::Evaluation => Some(self.evaluate.clone()),
991 ProtocolTypes::Validation => Some(self.validate.clone()),
992 }
993 }
994}
995
996#[derive(
997 Debug,
998 Serialize,
999 Deserialize,
1000 Clone,
1001 Hash,
1002 PartialEq,
1003 Eq,
1004 Default,
1005 BorshDeserialize,
1006 BorshSerialize,
1007)]
1008pub struct PolicySchema {
1009 pub evaluate: Quorum,
1011 pub validate: Quorum,
1013}
1014
1015impl PolicySchema {
1016 pub fn get_quorum(&self, role: ProtocolTypes) -> Option<Quorum> {
1017 match role {
1018 ProtocolTypes::Approval => None,
1019 ProtocolTypes::Evaluation => Some(self.evaluate.clone()),
1020 ProtocolTypes::Validation => Some(self.validate.clone()),
1021 }
1022 }
1023}