near_contract_standards/fungible_token/resolver.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use near_sdk::{ext_contract, json_types::U128, AccountId};
/// [`FungibleTokenResolver`] provides token transfer resolve functionality.
///
/// # Examples
///
/// ```
/// use near_sdk::{near, PanicOnDefault, AccountId, log};
/// use near_sdk::collections::LazyOption;
/// use near_sdk::json_types::U128;
/// use near_contract_standards::fungible_token::{FungibleToken, FungibleTokenResolver};
/// use near_contract_standards::fungible_token::metadata::FungibleTokenMetadata;
///
/// #[near(contract_state)]
/// #[derive(PanicOnDefault)]
/// pub struct Contract {
/// token: FungibleToken,
/// metadata: LazyOption<FungibleTokenMetadata>,
/// }
///
///#[near]
/// impl FungibleTokenResolver for Contract {
/// #[private]
/// fn ft_resolve_transfer(
/// &mut self,
/// sender_id: AccountId,
/// receiver_id: AccountId,
/// amount: U128,
/// ) -> U128 {
/// let (used_amount, burned_amount) =
/// self.token.internal_ft_resolve_transfer(&sender_id, receiver_id, amount);
/// if burned_amount > 0 {
/// log!("Account @{} burned {}", sender_id, burned_amount);
/// }
/// used_amount.into()
/// }
/// }
/// ```
///
#[ext_contract(ext_ft_resolver)]
pub trait FungibleTokenResolver {
fn ft_resolve_transfer(
&mut self,
sender_id: AccountId,
receiver_id: AccountId,
amount: U128,
) -> U128;
}