casperlabs-erc20 2.0.3

A Basic Erc20 Implementation with New CasperLabs Crate
Documentation
use std::collections::BTreeMap;

use crate::data;
use crate::event::*;
use alloc::string::String;
use casper_erc20_crate::{Address, Error, ERC20 as CasperErc20};
use casper_types::ContractHash;
use casper_types::Key;
use casper_types::{ContractPackageHash, U256};
use casperlabs_contract_utils::{ContractContext, ContractStorage};

pub trait ERC20<Storage: ContractStorage>: ContractContext<Storage> {
    fn init(&self, contract_hash: ContractHash, package_hash: ContractPackageHash) {
        data::set_contract_hash(contract_hash);
        data::set_package_hash(package_hash);
    }

    fn name(&self) -> String {
        CasperErc20::default().name()
    }

    fn symbol(&self) -> String {
        CasperErc20::default().symbol()
    }

    fn decimals(&self) -> u8 {
        CasperErc20::default().decimals()
    }

    fn total_supply(&self) -> U256 {
        CasperErc20::default().total_supply()
    }

    fn balance_of(&self, owner: Address) -> U256 {
        CasperErc20::default().balance_of(owner)
    }

    fn allowance(&self, owner: Address, spender: Address) -> U256 {
        CasperErc20::default().allowance(owner, spender)
    }

    fn increase_allowance(&self, spender: Address, amount: U256) -> Result<(), Error> {
        CasperErc20::default().increase_allowance(spender, amount)
    }

    fn decrease_allowance(&self, spender: Address, amount: U256) -> Result<(), Error> {
        CasperErc20::default().decrease_allowance(spender, amount)
    }

    fn transfer(&self, recipient: Address, amount: U256) -> Result<(), Error> {
        let ret = CasperErc20::default().transfer(recipient, amount);
        if ret.is_ok() {
            emit(&ERC20Event::Transfer {
                from: Address::from(self.get_caller()),
                to: recipient,
                value: amount,
            });
        }
        ret
    }

    fn _approve(&self, owner: Address, spender: Address, amount: U256) -> Result<(), Error> {
        let ret = CasperErc20::default()._approve(owner, spender, amount);
        if ret.is_ok() {
            emit(&ERC20Event::Approval {
                owner,
                spender,
                value: amount,
            });
        }
        ret
    }

    fn approve(&self, spender: Address, amount: U256) -> Result<(), Error> {
        let ret = CasperErc20::default().approve(spender, amount);
        if ret.is_ok() {
            emit(&ERC20Event::Approval {
                owner: Address::from(self.get_caller()),
                spender,
                value: amount,
            });
        }
        ret
    }

    fn transfer_from(&self, owner: Address, recipient: Address, amount: U256) -> Result<(), Error> {
        let ret = CasperErc20::default().transfer_from(owner, recipient, amount);
        if ret.is_ok() {
            emit(&ERC20Event::Transfer {
                from: owner,
                to: recipient,
                value: amount,
            });
        }
        ret
    }

    fn mint(&self, recipient: Address, amount: U256) -> Result<(), Error> {
        CasperErc20::default().mint(recipient, amount)
    }

    fn burn(&self, recipient: Address, amount: U256) -> Result<(), Error> {
        CasperErc20::default().burn(recipient, amount)
    }

    fn named_keys(
        &self,
        name: String,
        symbol: String,
        decimals: u8,
        initial_supply: U256,
    ) -> Result<BTreeMap<String, Key>, Error> {
        CasperErc20::default().named_keys(name, symbol, decimals, initial_supply)
    }
}