#![allow(missing_docs)] #[ixc::handler(SimpleAsset)] pub mod simple_asset { use ixc::*; #[derive(Resources)] pub struct SimpleAsset { #[state] owner: Item, #[state(key(account), value(balance))] balances: Map, } impl SimpleAsset { #[on_create] pub fn init(&self, ctx: &mut Context, initial_balance: u128) -> Result<()> { let owner = ctx.caller(); self.owner.set(ctx, &owner)?; self.balances.set(ctx, owner, initial_balance)?; Ok(()) } #[publish] pub fn get_balance(&self, ctx: &Context, account: AccountID) -> Result { let res = self.balances.get(ctx, account)?; Ok(res.unwrap_or(0)) } #[publish] pub fn send(&self, ctx: &mut Context, amount: u128, to: AccountID) -> Result<()> { let from = ctx.caller(); let from_balance = self.balances.get(ctx, from)?.unwrap_or(0); ensure!(from_balance >= amount, "insufficient balance"); let to_balance = self.balances.get(ctx, to)?.unwrap_or(0); self.balances.set(ctx, from, from_balance - amount)?; self.balances.set(ctx, to, to_balance + amount)?; Ok(()) } } } #[cfg(test)] mod tests { use ixc_core::account_api::create_account; use ixc_testing::*; use crate::simple_asset::{SimpleAsset, SimpleAssetInit}; #[test] fn test() { let mut app = TestApp::default(); app.register_handler::().unwrap(); let mut alice = app.new_client_context().unwrap(); let mut bob = app.new_client_context().unwrap(); let asset_client = create_account::(&mut alice, SimpleAssetInit{ initial_balance: 100 }).unwrap(); let alice_balance = asset_client.get_balance(&alice, alice.self_account_id()).unwrap(); assert_eq!(alice_balance, 100); asset_client.send(&mut alice, 50, bob.self_account_id()).unwrap(); let alice_balance = asset_client.get_balance(&alice, alice.self_account_id()).unwrap(); assert_eq!(alice_balance, 50); let bob_balance = asset_client.get_balance(&bob, bob.self_account_id()).unwrap(); } } fn main() {}