Skip to main content

defuse/contract/tokens/
imt.rs

1use std::borrow::Cow;
2
3use defuse_core::{
4    accounts::AccountEvent,
5    engine::State,
6    events::DefuseEvent,
7    intents::{MaybeIntentEvent, imt::ImtBurn},
8    tokens::imt::ImtTokens,
9};
10
11use near_plugins::{Pausable, pause};
12use near_sdk::{AccountId, FunctionError, assert_one_yocto, near};
13
14use crate::{
15    contract::{Contract, ContractExt},
16    tokens::imt::ImtBurner,
17};
18
19#[near]
20impl ImtBurner for Contract {
21    #[pause]
22    #[payable]
23    fn imt_burn(&mut self, minter_id: AccountId, tokens: ImtTokens, memo: Option<String>) {
24        assert_one_yocto();
25
26        let owner_id = self.ensure_auth_predecessor_id();
27
28        State::imt_burn(self, &owner_id, &minter_id, tokens.clone(), memo.clone())
29            .unwrap_or_else(|err| err.panic());
30
31        DefuseEvent::ImtBurn(Cow::Borrowed(
32            [MaybeIntentEvent::new_fn_call(AccountEvent::new(
33                owner_id,
34                Cow::Owned(ImtBurn {
35                    minter_id,
36                    tokens,
37                    memo,
38                }),
39            ))]
40            .as_slice(),
41        ))
42        .emit();
43    }
44}