1use core::mem;
2use std::borrow::Cow;
3
4use defuse_core::{
5 events::DefuseIntentEmit,
6 fees::{FeeChangedEvent, FeeCollectorChangedEvent, Pips},
7};
8use near_plugins::{AccessControllable, Pausable, access_control_any, pause};
9use near_sdk::{AccountId, assert_one_yocto, near, require};
10
11use crate::fees::FeesManager;
12
13use super::{Contract, ContractExt, Role};
14
15#[near]
16impl FeesManager for Contract {
17 #[pause(name = "intents")]
18 #[access_control_any(roles(Role::DAO, Role::FeesManager))]
19 #[payable]
20 fn set_fee(&mut self, #[allow(unused_mut)] mut fee: Pips) {
21 assert_one_yocto();
22 require!(self.fees.fee != fee, "same");
23 mem::swap(&mut self.fees.fee, &mut fee);
24 FeeChangedEvent {
25 old_fee: fee,
26 new_fee: self.fees.fee,
27 }
28 .emit();
29 }
30
31 fn fee(&self) -> Pips {
32 self.fees.fee
33 }
34
35 #[pause(name = "intents")]
36 #[access_control_any(roles(Role::DAO, Role::FeesManager))]
37 #[payable]
38 fn set_fee_collector(&mut self, #[allow(unused_mut)] mut fee_collector: AccountId) {
39 assert_one_yocto();
40 require!(self.fees.fee_collector != fee_collector, "same");
41 mem::swap(&mut self.fees.fee_collector, &mut fee_collector);
42 FeeCollectorChangedEvent {
43 old_fee_collector: fee_collector.into(),
44 new_fee_collector: Cow::Borrowed(self.fees.fee_collector.as_ref()),
45 }
46 .emit();
47 }
48
49 fn fee_collector(&self) -> &AccountId {
50 &self.fees.fee_collector
51 }
52}