casperlabs-erc20 2.0.3

A Basic Erc20 Implementation with New CasperLabs Crate
Documentation
use alloc::{
    collections::BTreeMap,
    string::{String, ToString},
};
use casper_contract::contract_api::storage;
use casper_erc20_crate::Address;
use casper_types::U256;

use crate::data::get_package_hash;

pub enum ERC20Event {
    Approval {
        owner: Address,
        spender: Address,
        value: U256,
    },
    Transfer {
        from: Address,
        to: Address,
        value: U256,
    },
}

impl ERC20Event {
    pub fn type_name(&self) -> String {
        match self {
            ERC20Event::Approval {
                owner: _,
                spender: _,
                value: _,
            } => "approve",
            ERC20Event::Transfer {
                from: _,
                to: _,
                value: _,
            } => "transfer",
        }
        .to_string()
    }
}

pub fn emit(erc20_event: &ERC20Event) {
    match erc20_event {
        ERC20Event::Approval {
            owner,
            spender,
            value,
        } => {
            let mut event = BTreeMap::new();
            event.insert("contract_package_hash", get_package_hash().to_string());
            event.insert("event_type", erc20_event.type_name());
            event.insert("owner", owner.to_string());
            event.insert("spender", spender.to_string());
            event.insert("value", value.to_string());
            storage::new_uref(event)
        }
        ERC20Event::Transfer { from, to, value } => {
            let mut event = BTreeMap::new();
            event.insert("contract_package_hash", get_package_hash().to_string());
            event.insert("event_type", erc20_event.type_name());
            event.insert("from", from.to_string());
            event.insert("to", to.to_string());
            event.insert("value", value.to_string());
            storage::new_uref(event)
        }
    };
}