defuse/contract/tokens/
imt.rs

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