Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions contracts/token-factory/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,13 @@ impl TokenFactory {
return Err(Error::InvalidBurnAmount);
}

let token = TokenClient::new(&env, &token_address);
let balance = token.balance(&from);
if amount > balance {
return Err(Error::BurnAmountExceedsBalance);
}

token.burn(&from, &amount);
// Check burn_enabled via reverse index lookup
let idx_key = (&token_address, symbol_short!("idx"));
if let Some(index) = env.storage().instance().get::<_, u32>(&idx_key) {
Expand Down
59 changes: 59 additions & 0 deletions contracts/token-factory/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,65 @@ fn test_create_token() {
}

#[test]
fn test_create_token() {
let env = Env::default();
let contract_id = env.register_contract(None, TokenFactory);
let client = TokenFactoryClient::new(&env, &contract_id);

let admin = Address::generate(&env);
let treasury = Address::generate(&env);
let creator = Address::generate(&env);

client.initialize(&admin, &treasury, &70000000, &30000000);

// Mock fee payment
env.mock_auths(&[MockAuth {
address: &creator,
invoke: &MockAuthInvoke {
contract: &contract_id,
fn_name: "create_token",
args: vec![&env, creator.clone(), String::from_str(&env, "Test Token"), String::from_str(&env, "TEST"), 7u32, 1000000000i128, 70000000i128],
sub_invokes: &[],
},
}]);

let token_address = client.create_token(&creator, &String::from_str(&env, "Test Token"), &String::from_str(&env, "TEST"), &7, &1000000000, &70000000);

assert!(token_address.is_some());
}

#[test]
fn test_burn_amount_exceeds_balance() {
let env = Env::default();
env.mock_all_auths();

let contract_id = env.register_contract(None, TokenFactory);
let client = TokenFactoryClient::new(&env, &contract_id);

let admin = Address::generate(&env);
let treasury = Address::generate(&env);
let user = Address::generate(&env);

client.initialize(&admin, &treasury, &0, &0);

// Deploy a token and mint a known balance to user
let token_address = client.create_token(
&admin,
&String::from_str(&env, "Test Token"),
&String::from_str(&env, "TEST"),
&7,
&0,
&0,
);
let token_client = token::TokenClient::new(&env, &token_address);
// Mint 100 tokens to user
token::StellarAssetClient::new(&env, &token_address).mint(&user, &100);

assert_eq!(token_client.balance(&user), 100);

// Attempt to burn more than the balance
let result = client.try_burn(&token_address, &user, &200);
assert_eq!(result, Err(Ok(Error::BurnAmountExceedsBalance)));
fn test_create_token_insufficient_fee() {
let s = Setup::new();
let creator = Address::generate(&s.env);
Expand Down
Loading