Skip to content

Commit

Permalink
refactor: extracted common validation snippet
Browse files Browse the repository at this point in the history
  • Loading branch information
kerber0x committed Jul 1, 2024
1 parent 15935f6 commit a326961
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 51 deletions.
100 changes: 51 additions & 49 deletions contracts/liquidity_hub/bonding-manager/src/bonding/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use cosmwasm_std::{
Uint128,
};

use white_whale_std::bonding_manager::{Bond, BondAction, TemporalBondAction};
use white_whale_std::bonding_manager::{Bond, BondAction, Config, TemporalBondAction};
use white_whale_std::pool_network::asset;

use crate::helpers::temporal_bond_action_response;
Expand All @@ -23,30 +23,10 @@ pub(crate) fn bond(
helpers::validate_buckets_not_empty(&deps)?;
let config = CONFIG.load(deps.storage)?;

if helpers::validate_claimed(&deps, info).is_err() {
return temporal_bond_action_response(
&mut deps,
env.contract.address,
TemporalBondAction {
sender: info.sender.clone(),
coin: asset.clone(),
action: BondAction::Bond,
},
ContractError::UnclaimedRewards,
);
}

if helpers::validate_bonding_for_current_epoch(&deps, &env).is_err() {
return temporal_bond_action_response(
&mut deps,
config.epoch_manager_addr,
TemporalBondAction {
sender: info.sender.clone(),
coin: asset.clone(),
action: BondAction::Bond,
},
ContractError::EpochNotCreatedYet,
);
if let Some(temporal_bond_action_response) =
validate_bond_operation(&mut deps, info, &env, asset, &config, BondAction::Bond)
{
return temporal_bond_action_response;
}

let current_epoch: white_whale_std::epoch_manager::epoch_manager::EpochResponse =
Expand Down Expand Up @@ -137,30 +117,10 @@ pub(crate) fn unbond(

let config = CONFIG.load(deps.storage)?;

if helpers::validate_claimed(&deps, info).is_err() {
return temporal_bond_action_response(
&mut deps,
env.contract.address,
TemporalBondAction {
sender: info.sender.clone(),
coin: asset.clone(),
action: BondAction::Unbond,
},
ContractError::UnclaimedRewards,
);
}

if helpers::validate_bonding_for_current_epoch(&deps, &env).is_err() {
return temporal_bond_action_response(
&mut deps,
config.epoch_manager_addr,
TemporalBondAction {
sender: info.sender.clone(),
coin: asset.clone(),
action: BondAction::Unbond,
},
ContractError::EpochNotCreatedYet,
);
if let Some(temporal_bond_action_response) =
validate_bond_operation(&mut deps, info, &env, asset, &config, BondAction::Unbond)
{
return temporal_bond_action_response;
}

let bonds_by_receiver = get_bonds_by_receiver(
Expand Down Expand Up @@ -291,3 +251,45 @@ pub(crate) fn withdraw(
("refund_amount", refund_amount.to_string()),
]))
}

/// Validates the bond operation. Makes sure the user has claimed pending rewards and that the current
/// epoch is valid. If any of these operations fail, the contract will resolve them by triggering
/// the claim rewards operation on behalf of the user, or by sending a message to the epoch manager
/// to create a new epoch.
///
/// Used during both Bond and Unbond.
fn validate_bond_operation(
deps: &mut DepsMut,
info: &MessageInfo,
env: &Env,
asset: &Coin,
config: &Config,
bond_action: BondAction,
) -> Option<Result<Response, ContractError>> {
if helpers::validate_claimed(deps, info).is_err() {
return Some(temporal_bond_action_response(
deps,
&env.contract.address,
TemporalBondAction {
sender: info.sender.clone(),
coin: asset.clone(),
action: bond_action,
},
ContractError::UnclaimedRewards,
));
}

if helpers::validate_bonding_for_current_epoch(deps, env).is_err() {
return Some(temporal_bond_action_response(
deps,
&config.epoch_manager_addr,
TemporalBondAction {
sender: info.sender.clone(),
coin: asset.clone(),
action: bond_action,
},
ContractError::EpochNotCreatedYet,
));
}
None
}
4 changes: 2 additions & 2 deletions contracts/liquidity_hub/bonding-manager/src/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ pub fn fill_upcoming_reward_bucket(deps: DepsMut, funds: Coin) -> StdResult<()>
/// Creates a [SubMsg] for the given [TemporalBondAction].
pub fn temporal_bond_action_response(
deps: &mut DepsMut,
contract_addr: Addr,
contract_addr: &Addr,
temporal_bond_action: TemporalBondAction,
error: ContractError,
) -> Result<Response, ContractError> {
Expand Down Expand Up @@ -532,7 +532,7 @@ pub fn temporal_bond_action_response(
/// If there are unclaimed rewards, creates a [SubMsg] to claim rewards. Used to trigger when the
/// user is bonding/unbonding, and it hasn't claimed pending rewards yet.
fn create_temporal_bond_action_submsg(
contract_addr: Addr,
contract_addr: &Addr,
msg: &impl Serialize,
) -> Result<SubMsg, ContractError> {
Ok(SubMsg::reply_on_success(
Expand Down

0 comments on commit a326961

Please sign in to comment.