1use std::collections::BTreeSet;
2
3use defuse_core::{Salt, accounts::SaltRotationEvent, events::DefuseIntentEmit};
4use defuse_near_utils::UnwrapOrPanic;
5use near_plugins::{AccessControllable, access_control_any};
6use near_sdk::{assert_one_yocto, near};
7
8use super::{Contract, ContractExt, Role};
9use crate::salts::SaltManager;
10
11#[near]
12impl SaltManager for Contract {
13 #[access_control_any(roles(Role::DAO, Role::SaltManager))]
14 #[payable]
15 fn update_current_salt(&mut self) -> Salt {
16 assert_one_yocto();
17
18 self.salts.set_new().unwrap_or_panic();
19 let current = self.salts.current();
20
21 SaltRotationEvent {
22 current,
23 invalidated: BTreeSet::new(),
24 }
25 .emit();
26
27 current
28 }
29
30 #[access_control_any(roles(Role::DAO, Role::SaltManager))]
31 #[payable]
32 fn invalidate_salts(&mut self, salts: Vec<Salt>) -> Salt {
33 assert_one_yocto();
34
35 let invalidated = salts
37 .into_iter()
38 .filter(|s| self.salts.invalidate(*s).is_ok())
39 .collect();
40
41 let current = self.salts.current();
42
43 SaltRotationEvent {
44 current,
45 invalidated,
46 }
47 .emit();
48
49 current
50 }
51
52 #[inline]
53 fn is_valid_salt(&self, salt: Salt) -> bool {
54 self.salts.is_valid(salt)
55 }
56
57 #[inline]
58 fn current_salt(&self) -> Salt {
59 self.salts.current()
60 }
61}