defuse/contract/
salts.rs

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        // NOTE: omits any errors
36        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}