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 defuse_near_utils::UnwrapOrPanic;
12use near_plugins::{Pausable, pause};
13use near_sdk::{AccountId, assert_one_yocto, near};
14
15use crate::{
16    contract::{Contract, ContractExt},
17    tokens::imt::ImtBurner,
18};
19
20#[near]
21impl ImtBurner for Contract {
22    #[pause]
23    #[payable]
24    fn imt_burn(&mut self, minter_id: AccountId, tokens: ImtTokens, memo: Option<String>) {
25        assert_one_yocto();
26
27        let owner_id = self.ensure_auth_predecessor_id();
28
29        State::imt_burn(self, &owner_id, &minter_id, tokens.clone(), memo.clone())
30            .unwrap_or_panic();
31
32        DefuseEvent::ImtBurn(Cow::Borrowed(
33            [MaybeIntentEvent::new_fn_call(AccountEvent::new(
34                owner_id,
35                Cow::Owned(ImtBurn {
36                    minter_id,
37                    tokens,
38                    memo,
39                }),
40            ))]
41            .as_slice(),
42        ))
43        .emit();
44    }
45}