near_contract_standards/fungible_token/
events.rsuse crate::event::NearEvent;
use near_sdk::json_types::U128;
use near_sdk::serde::Serialize;
use near_sdk::AccountIdRef;
#[must_use]
#[derive(Serialize, Debug, Clone)]
#[serde(crate = "near_sdk::serde")]
pub struct FtMint<'a> {
pub owner_id: &'a AccountIdRef,
pub amount: U128,
#[serde(skip_serializing_if = "Option::is_none")]
pub memo: Option<&'a str>,
}
impl FtMint<'_> {
pub fn emit(self) {
Self::emit_many(&[self])
}
pub fn emit_many(data: &[FtMint<'_>]) {
new_141_v1(Nep141EventKind::FtMint(data)).emit()
}
}
#[must_use]
#[derive(Serialize, Debug, Clone)]
#[serde(crate = "near_sdk::serde")]
pub struct FtTransfer<'a> {
pub old_owner_id: &'a AccountIdRef,
pub new_owner_id: &'a AccountIdRef,
pub amount: U128,
#[serde(skip_serializing_if = "Option::is_none")]
pub memo: Option<&'a str>,
}
impl FtTransfer<'_> {
pub fn emit(self) {
Self::emit_many(&[self])
}
pub fn emit_many(data: &[FtTransfer<'_>]) {
new_141_v1(Nep141EventKind::FtTransfer(data)).emit()
}
}
#[must_use]
#[derive(Serialize, Debug, Clone)]
#[serde(crate = "near_sdk::serde")]
pub struct FtBurn<'a> {
pub owner_id: &'a AccountIdRef,
pub amount: U128,
#[serde(skip_serializing_if = "Option::is_none")]
pub memo: Option<&'a str>,
}
impl FtBurn<'_> {
pub fn emit(self) {
Self::emit_many(&[self])
}
pub fn emit_many<'a>(data: &'a [FtBurn<'a>]) {
new_141_v1(Nep141EventKind::FtBurn(data)).emit()
}
}
#[derive(Serialize, Debug)]
#[serde(crate = "near_sdk::serde")]
pub(crate) struct Nep141Event<'a> {
version: &'static str,
#[serde(flatten)]
event_kind: Nep141EventKind<'a>,
}
#[derive(Serialize, Debug)]
#[serde(crate = "near_sdk::serde")]
#[serde(tag = "event", content = "data")]
#[serde(rename_all = "snake_case")]
#[allow(clippy::enum_variant_names)]
enum Nep141EventKind<'a> {
FtMint(&'a [FtMint<'a>]),
FtTransfer(&'a [FtTransfer<'a>]),
FtBurn(&'a [FtBurn<'a>]),
}
fn new_141<'a>(version: &'static str, event_kind: Nep141EventKind<'a>) -> NearEvent<'a> {
NearEvent::Nep141(Nep141Event { version, event_kind })
}
fn new_141_v1(event_kind: Nep141EventKind) -> NearEvent {
new_141("1.0.0", event_kind)
}
#[cfg(test)]
mod tests {
use super::*;
use near_sdk::{test_utils, AccountIdRef};
#[test]
fn ft_mint() {
let owner_id = AccountIdRef::new_or_panic("bob");
let amount = U128(100);
FtMint { owner_id, amount, memo: None }.emit();
assert_eq!(
test_utils::get_logs()[0],
r#"EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_mint","data":[{"owner_id":"bob","amount":"100"}]}"#
);
}
#[test]
fn ft_mints() {
let owner_id = AccountIdRef::new_or_panic("bob");
let amount = U128(100);
let mint_log = FtMint { owner_id, amount, memo: None };
FtMint::emit_many(&[
mint_log,
FtMint {
owner_id: AccountIdRef::new_or_panic("alice"),
amount: U128(200),
memo: Some("has memo"),
},
]);
assert_eq!(
test_utils::get_logs()[0],
r#"EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_mint","data":[{"owner_id":"bob","amount":"100"},{"owner_id":"alice","amount":"200","memo":"has memo"}]}"#
);
}
#[test]
fn ft_burn() {
let owner_id = AccountIdRef::new_or_panic("bob");
let amount = U128(100);
FtBurn { owner_id, amount, memo: None }.emit();
assert_eq!(
test_utils::get_logs()[0],
r#"EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_burn","data":[{"owner_id":"bob","amount":"100"}]}"#
);
}
#[test]
fn ft_burns() {
let owner_id = AccountIdRef::new_or_panic("bob");
let amount = U128(100);
FtBurn::emit_many(&[
FtBurn {
owner_id: AccountIdRef::new_or_panic("alice"),
amount: U128(200),
memo: Some("has memo"),
},
FtBurn { owner_id, amount, memo: None },
]);
assert_eq!(
test_utils::get_logs()[0],
r#"EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_burn","data":[{"owner_id":"alice","amount":"200","memo":"has memo"},{"owner_id":"bob","amount":"100"}]}"#
);
}
#[test]
fn ft_transfer() {
let old_owner_id = AccountIdRef::new_or_panic("bob");
let new_owner_id = AccountIdRef::new_or_panic("alice");
let amount = U128(100);
FtTransfer { old_owner_id, new_owner_id, amount, memo: None }.emit();
assert_eq!(
test_utils::get_logs()[0],
r#"EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_transfer","data":[{"old_owner_id":"bob","new_owner_id":"alice","amount":"100"}]}"#
);
}
#[test]
fn ft_transfers() {
let old_owner_id = AccountIdRef::new_or_panic("bob");
let new_owner_id = AccountIdRef::new_or_panic("alice");
let amount = U128(100);
FtTransfer::emit_many(&[
FtTransfer {
old_owner_id: AccountIdRef::new_or_panic("alice"),
new_owner_id: AccountIdRef::new_or_panic("bob"),
amount: U128(200),
memo: Some("has memo"),
},
FtTransfer { old_owner_id, new_owner_id, amount, memo: None },
]);
assert_eq!(
test_utils::get_logs()[0],
r#"EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_transfer","data":[{"old_owner_id":"alice","new_owner_id":"bob","amount":"200","memo":"has memo"},{"old_owner_id":"bob","new_owner_id":"alice","amount":"100"}]}"#
);
}
}