From 1113068ceb02e464c40066021ca24279dc4753ab Mon Sep 17 00:00:00 2001 From: austinaminu2 Date: Tue, 24 Mar 2026 22:01:41 +0100 Subject: [PATCH] fix: add BurnAmountExceedsBalance check in burn function --- contracts/token-factory/Cargo.toml | 4 ++-- contracts/token-factory/src/lib.rs | 8 ++++++- contracts/token-factory/src/test.rs | 36 ++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/contracts/token-factory/Cargo.toml b/contracts/token-factory/Cargo.toml index 12381a80..0502a7b9 100644 --- a/contracts/token-factory/Cargo.toml +++ b/contracts/token-factory/Cargo.toml @@ -13,7 +13,7 @@ proptest = "1.4" [dev-dependencies] soroban-sdk = { version = "21.0.0", features = ["testutils"] } -soroban-token-sdk = { version = "21.0.0", features = ["testutils"] } +soroban-token-sdk = { version = "21.0.0" } [features] -testutils = ["soroban-sdk/testutils", "soroban-token-sdk/testutils"] \ No newline at end of file +testutils = ["soroban-sdk/testutils"] \ No newline at end of file diff --git a/contracts/token-factory/src/lib.rs b/contracts/token-factory/src/lib.rs index 6921f6be..d4e1df97 100644 --- a/contracts/token-factory/src/lib.rs +++ b/contracts/token-factory/src/lib.rs @@ -188,7 +188,13 @@ impl TokenFactory { return Err(Error::InvalidBurnAmount); } - TokenClient::new(&env, &token_address).burn(&from, &amount); + let token = TokenClient::new(&env, &token_address); + let balance = token.balance(&from); + if amount > balance { + return Err(Error::BurnAmountExceedsBalance); + } + + token.burn(&from, &amount); env.events().publish((symbol_short!("tokens_burned"),), (token_address, from, amount)); diff --git a/contracts/token-factory/src/test.rs b/contracts/token-factory/src/test.rs index 9df4db55..339b2ab2 100644 --- a/contracts/token-factory/src/test.rs +++ b/contracts/token-factory/src/test.rs @@ -48,4 +48,38 @@ fn test_create_token() { 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()); -} \ No newline at end of file +} + +#[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))); +}