diff --git a/contracts/airdrop/src/contract.rs b/contracts/airdrop/src/contract.rs index 471345b..aeac361 100644 --- a/contracts/airdrop/src/contract.rs +++ b/contracts/airdrop/src/contract.rs @@ -103,29 +103,22 @@ pub fn reward_users( ) -> Result { let mut res = vec![]; + let mut campaign = CAMPAIGN.load(deps.storage).map_err(|_| { + StdError::generic_err("Failed to load campaign data") + })?; + + if campaign.owner != info.sender + && !campaign.managers.contains(&info.sender) + { + return Err(StdError::generic_err("Unauthorized")); + } + for req in requests { - let mut campaign = CAMPAIGN.load(deps.storage).map_err(|_| { - StdError::generic_err("Failed to load campaign data") - })?; - - if campaign.owner != info.sender - && !campaign.managers.contains(&info.sender) - { - res.push(RewardUserResponse { - user_address: req.user_address.clone(), - success: false, - error_msg: "Unauthorized".to_string(), - }); - continue; - } if campaign.unallocated_amount < req.amount { - res.push(RewardUserResponse { - user_address: req.user_address.clone(), - success: false, - error_msg: "Not enough funds in campaign".to_string(), - }); - continue; + return Err(StdError::generic_err( + "Not enough funds in the campaign", + )); } match USER_REWARDS.may_load(deps.storage, req.user_address.clone())? { diff --git a/contracts/airdrop/src/tests/execute/reward_users.rs b/contracts/airdrop/src/tests/execute/reward_users.rs index 6d3f1b8..8da802c 100644 --- a/contracts/airdrop/src/tests/execute/reward_users.rs +++ b/contracts/airdrop/src/tests/execute/reward_users.rs @@ -2,7 +2,7 @@ use crate::contract::{instantiate, reward_users}; use crate::msg::{InstantiateMsg, RewardUserRequest, RewardUserResponse}; use crate::state::{Campaign, CAMPAIGN, USER_REWARDS}; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; -use cosmwasm_std::{coins, from_json, Addr, Uint128}; +use cosmwasm_std::{coins, from_json, Addr, Uint128, StdError}; use std::vec; #[test] @@ -171,3 +171,46 @@ fn test_reward_users_as_manager() { Uint128::new(250) ); } + +#[test] +fn test_fails_when_we_try_to_allocate_more_than_available() { + let mut deps = mock_dependencies(); + let env = mock_env(); + + instantiate( + deps.as_mut(), + env.clone(), + mock_info("owner", &coins(1000, "")), + InstantiateMsg { + campaign_id: "campaign_id".to_string(), + campaign_name: "campaign_name".to_string(), + campaign_description: "campaign_description".to_string(), + managers: vec![Addr::unchecked("manager1"), Addr::unchecked("manager2")], + }, + ) + .unwrap(); + + let resp = reward_users( + deps.as_mut(), + env.clone(), + mock_info("manager1", &[]), + vec![ + RewardUserRequest { + user_address: Addr::unchecked("user1"), + amount: Uint128::new(750), + }, + RewardUserRequest { + user_address: Addr::unchecked("user2"), + amount: Uint128::new(250), + }, + RewardUserRequest { + user_address: Addr::unchecked("user3"), + amount: Uint128::new(251), + }, + ], + ); + + assert_eq!(resp, Err(StdError::generic_err( + "Not enough funds in the campaign", + ))); +} \ No newline at end of file diff --git a/nibiru-std/src/proto/mod.rs b/nibiru-std/src/proto/mod.rs index 4311de8..cfdf394 100644 --- a/nibiru-std/src/proto/mod.rs +++ b/nibiru-std/src/proto/mod.rs @@ -5,8 +5,6 @@ mod type_url_cosmos; mod type_url_nibiru; pub use traits::*; -pub use type_url_cosmos::*; -pub use type_url_nibiru::*; pub mod cosmos { /// Authentication of accounts and transactions.