diff --git a/CHANGELOG.md b/CHANGELOG.md index abe1bdd65..95c2d6753 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Splitter: avoid zero send messages, owner updates lock any time [(#457)](https://github.com/andromedaprotocol/andromeda-core/pull/457) + ### Removed - Schemas are no longer tracked [(#430)](https://github.com/andromedaprotocol/andromeda-core/pull/430) diff --git a/contracts/finance/andromeda-splitter/src/contract.rs b/contracts/finance/andromeda-splitter/src/contract.rs index 5fff11766..2864b5b1d 100644 --- a/contracts/finance/andromeda-splitter/src/contract.rs +++ b/contracts/finance/andromeda-splitter/src/contract.rs @@ -168,20 +168,22 @@ fn execute_send(ctx: ExecuteContext) -> Result { let recipient_percent = recipient_addr.percent; let mut vec_coin: Vec = Vec::new(); for (i, coin) in info.funds.clone().iter().enumerate() { - let mut recip_coin: Coin = coin.clone(); - recip_coin.amount = coin.amount * recipient_percent; - remainder_funds[i].amount = remainder_funds[i].amount.checked_sub(recip_coin.amount)?; - vec_coin.push(recip_coin.clone()); - amp_funds.push(recip_coin); + let amount_owed = coin.amount.mul_floor(recipient_percent); + if !amount_owed.is_zero() { + let mut recip_coin: Coin = coin.clone(); + recip_coin.amount = amount_owed; + remainder_funds[i].amount = + remainder_funds[i].amount.checked_sub(recip_coin.amount)?; + vec_coin.push(recip_coin.clone()); + amp_funds.push(recip_coin); + } + } + if !vec_coin.is_empty() { + let amp_msg = recipient_addr + .recipient + .generate_amp_msg(&deps.as_ref(), Some(vec_coin))?; + pkt = pkt.add_message(amp_msg); } - - // let direct_message = recipient_addr - // .recipient - // .generate_direct_msg(&deps.as_ref(), vec_coin)?; - let amp_msg = recipient_addr - .recipient - .generate_amp_msg(&deps.as_ref(), Some(vec_coin))?; - pkt = pkt.add_message(amp_msg); } remainder_funds.retain(|x| x.amount > Uint128::zero()); @@ -197,8 +199,11 @@ fn execute_send(ctx: ExecuteContext) -> Result { }))); } let kernel_address = ADOContract::default().get_kernel_address(deps.as_ref().storage)?; - let distro_msg = pkt.to_sub_msg(kernel_address, Some(amp_funds), 1)?; - msgs.push(distro_msg); + + if !pkt.messages.is_empty() { + let distro_msg = pkt.to_sub_msg(kernel_address, Some(amp_funds), 1)?; + msgs.push(distro_msg); + } Ok(Response::new() .add_submessages(msgs) @@ -259,12 +264,6 @@ fn execute_update_lock( let mut splitter = SPLITTER.load(deps.storage)?; - // Can't call this function while the lock isn't expired - - ensure!( - splitter.lock.is_expired(&env.block), - ContractError::ContractLocked {} - ); // Get current time let current_time = Milliseconds::from_seconds(env.block.time.seconds());