I'd like to propose that we split up the token interface into a set of small interfaces that tokens can choose to implement.
pub trait Token {
fn name(env: Env) -> Bytes;
fn symbol(env: Env) -> Bytes;
fn decimals(env: Env) -> u32;
fn balance(env: Env, id: Address) -> i128;
fn spendable_balance(env: Env, id: Address) -> i128;
fn transfer(env: Env, from: Address, to: Address, amount: i128);
}
pub trait Mint {
fn mint(env: Env, to: Address, amount: i128);
}
pub trait Burn {
fn burn(env: Env, from: Address, amount: i128);
}
pub trait Allowance {
fn allowance(env: Env, from: Address, spender: Address) -> i128;
fn increase_allowance(env: Env, from: Address, spender: Address, amount: i128);
fn decrease_allowance(env: Env, from: Address, spender: Address, amount: i128);
}
pub trait AllowanceTransfer {
fn transfer_from(env: Env, spender: Address, from: Address, to: Address, amount: i128);
}
pub trait AllowanceBurn {
fn burn_from(env: Env, spender: Address, from: Address, amount: i128);
}
pub trait Authorized {
fn authorized(env: Env, id: Address) -> bool;
fn set_authorized(env: Env, id: Address, authorize: bool);
}
pub trait Clawback {
fn clawback(env: Env, from: Address, amount: i128);
}
pub trait Admin {
fn admin(env: Env) -> Option<Address>;
fn set_admin(env: Env, new_admin: Address);
}