Skip to main content

defuse/contract/
admin_call.rs

1use defuse_near_promise::{NearPromise, actions::NearAction};
2use near_plugins::{AccessControllable, access_control_any};
3use near_sdk::{env, near, require};
4
5use super::{Contract, ContractExt, Role};
6use crate::admin_call::AdminCallManager;
7
8#[near]
9impl AdminCallManager for Contract {
10    #[access_control_any(roles(Role::DAO))]
11    #[payable]
12    fn admin_call(&mut self, promises: Vec<NearPromise>) {
13        require!(
14            !env::attached_deposit().is_zero(),
15            "requires attached deposit of at least 1 yoctoNEAR"
16        );
17
18        for p in promises {
19            require!(
20                p.actions.iter().all(|action| {
21                    matches!(
22                        action,
23                        NearAction::FunctionCall(_) | NearAction::Transfer(_)
24                    )
25                }),
26                "unsupported action"
27            );
28
29            p.build().detach();
30        }
31    }
32}