defuse/tokens/
nep245.rs

1#![allow(clippy::too_many_arguments)]
2
3use defuse_nep245::{MultiTokenCore, TokenId, receiver::MultiTokenReceiver};
4use near_plugins::AccessControllable;
5use near_sdk::{AccountId, PromiseOrValue, ext_contract, json_types::U128};
6
7#[ext_contract(ext_mt_withdraw)]
8pub trait MultiTokenWithdrawer: MultiTokenReceiver + MultiTokenWithdrawResolver {
9    /// Returns number of tokens were successfully withdrawn
10    ///
11    /// Optionally can specify `storage_deposit` for `receiver_id` on `token`.
12    /// The amount will be subtracted from user's NEP-141 `wNEAR` balance.
13    ///
14    /// NOTE: MUST attach 1 yⓃ for security purposes.
15    fn mt_withdraw(
16        &mut self,
17        token: AccountId,
18        receiver_id: AccountId,
19        token_ids: Vec<TokenId>,
20        amounts: Vec<U128>,
21        memo: Option<String>,
22        msg: Option<String>,
23    ) -> PromiseOrValue<Vec<U128>>;
24}
25
26#[ext_contract(mt_withdraw_resolver)]
27pub trait MultiTokenWithdrawResolver {
28    fn mt_resolve_withdraw(
29        &mut self,
30        token: AccountId,
31        sender_id: AccountId,
32        token_ids: Vec<TokenId>,
33        amounts: Vec<U128>,
34        is_call: bool,
35    ) -> Vec<U128>;
36}
37
38/// Same as [`MultiTokenCore`], but allows permissioned accounts to transfer
39/// from any `owner_id` bypassing locked checks.
40#[ext_contract(ext_mt_force_core)]
41pub trait MultiTokenForcedCore: MultiTokenCore + AccessControllable {
42    fn mt_force_transfer(
43        &mut self,
44        owner_id: AccountId,
45        receiver_id: AccountId,
46        token_id: TokenId,
47        amount: U128,
48        approval: Option<(AccountId, u64)>,
49        memo: Option<String>,
50    );
51
52    fn mt_force_batch_transfer(
53        &mut self,
54        owner_id: AccountId,
55        receiver_id: AccountId,
56        token_ids: Vec<TokenId>,
57        amounts: Vec<U128>,
58        approvals: Option<Vec<Option<(AccountId, u64)>>>,
59        memo: Option<String>,
60    );
61
62    fn mt_force_transfer_call(
63        &mut self,
64        owner_id: AccountId,
65        receiver_id: AccountId,
66        token_id: TokenId,
67        amount: U128,
68        approval: Option<(AccountId, u64)>,
69        memo: Option<String>,
70        msg: String,
71    ) -> PromiseOrValue<Vec<U128>>;
72
73    fn mt_force_batch_transfer_call(
74        &mut self,
75        owner_id: AccountId,
76        receiver_id: AccountId,
77        token_ids: Vec<TokenId>,
78        amounts: Vec<U128>,
79        approvals: Option<Vec<Option<(AccountId, u64)>>>,
80        memo: Option<String>,
81        msg: String,
82    ) -> PromiseOrValue<Vec<U128>>;
83}
84
85#[ext_contract(ext_mt_force_withdraw)]
86pub trait MultiTokenForcedWithdrawer: MultiTokenWithdrawer + AccessControllable {
87    fn mt_force_withdraw(
88        &mut self,
89        owner_id: AccountId,
90        token: AccountId,
91        receiver_id: AccountId,
92        token_ids: Vec<TokenId>,
93        amounts: Vec<U128>,
94        memo: Option<String>,
95        msg: Option<String>,
96    ) -> PromiseOrValue<Vec<U128>>;
97}