#![no_std]
#[cfg(any(test, feature = "testutils"))]
pub mod testutils;
use soroban_sdk::{contractclient, symbol_short, Address, Env, String};
#[contractclient(name = "TokenClient")]
pub trait Token {
fn allowance(env: Env, from: Address, spender: Address) -> i128;
fn approve(env: Env, from: Address, spender: Address, amount: i128, live_until_ledger: u32);
fn balance(env: Env, id: Address) -> i128;
fn transfer(env: Env, from: Address, to: Address, amount: i128);
fn transfer_from(env: Env, spender: Address, from: Address, to: Address, amount: i128);
fn burn(env: Env, from: Address, amount: i128);
fn burn_from(env: Env, spender: Address, from: Address, amount: i128);
fn decimals(env: Env) -> u32;
fn name(env: Env) -> String;
fn symbol(env: Env) -> String;
}
#[contractclient(name = "StellarAssetClient")]
pub trait StellarAssetExtension {
fn mint(env: Env, to: Address, amount: i128);
fn set_authorized(env: Env, addr: Address, authorize: bool);
fn authorized(env: Env, addr: Address) -> bool;
fn clawback(env: Env, from: Address, amount: i128);
fn set_admin(env: Env, new_admin: Address);
fn admin(env: Env);
}
pub struct TokenEvents {}
impl TokenEvents {
pub fn approve(
env: &Env,
from: Address,
spender: Address,
amount: i128,
live_until_ledger: u32,
) {
let topics = (symbol_short!("approve"), from, spender);
env.events().publish(topics, (amount, live_until_ledger));
}
pub fn transfer(env: &Env, from: Address, to: Address, amount: i128) {
let topics = (symbol_short!("transfer"), from, to);
env.events().publish(topics, amount);
}
pub fn burn(env: &Env, from: Address, amount: i128) {
let topics = (symbol_short!("burn"), from);
env.events().publish(topics, amount);
}
pub fn mint(env: &Env, admin: Address, to: Address, amount: i128) {
let topics = (symbol_short!("mint"), admin, to);
env.events().publish(topics, amount);
}
}