From 3a76bf8b540734387ec8552746257713604265e1 Mon Sep 17 00:00:00 2001 From: "PFC(Ian)" Date: Mon, 27 Jun 2022 08:00:56 -0500 Subject: [PATCH 1/5] fix: emergency method to remove a validator with an invalid address. does not undelegate --- Cargo.lock | 4 +- contracts/hub/Cargo.toml | 2 +- contracts/hub/src/contract.rs | 80 ++++++++++++++++---------- contracts/hub/src/execute.rs | 104 +++++++++++++++++++++++----------- packages/steak/Cargo.toml | 2 +- packages/steak/src/hub.rs | 26 +++------ 6 files changed, 133 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b54699a..cd81dee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -567,7 +567,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "steak" -version = "2.0.0" +version = "2.0.1" dependencies = [ "cosmwasm-std", "cw20", @@ -577,7 +577,7 @@ dependencies = [ [[package]] name = "steak-hub" -version = "2.0.0" +version = "2.0.1" dependencies = [ "cosmwasm-std", "cw-storage-plus", diff --git a/contracts/hub/Cargo.toml b/contracts/hub/Cargo.toml index 84415c0..3c12810 100644 --- a/contracts/hub/Cargo.toml +++ b/contracts/hub/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "steak-hub" -version = "2.0.0" +version = "2.0.1" authors = ["larry ", "PFC "] edition = "2018" license = "GPL-3.0-or-later" diff --git a/contracts/hub/src/contract.rs b/contracts/hub/src/contract.rs index 99c0943..5bdbc50 100644 --- a/contracts/hub/src/contract.rs +++ b/contracts/hub/src/contract.rs @@ -25,31 +25,36 @@ pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> S let api = deps.api; match msg { ExecuteMsg::Receive(cw20_msg) => receive(deps, env, info, cw20_msg), - ExecuteMsg::Bond { - receiver, - } => execute::bond( + ExecuteMsg::Bond { receiver } => execute::bond( deps, env, - receiver.map(|s| api.addr_validate(&s)).transpose()?.unwrap_or(info.sender), + receiver + .map(|s| api.addr_validate(&s)) + .transpose()? + .unwrap_or(info.sender), parse_received_fund(&info.funds, "uluna")?, ), - ExecuteMsg::WithdrawUnbonded { - receiver, - } => execute::withdraw_unbonded( + ExecuteMsg::WithdrawUnbonded { receiver } => execute::withdraw_unbonded( deps, env, info.sender.clone(), - receiver.map(|s| api.addr_validate(&s)).transpose()?.unwrap_or(info.sender), + receiver + .map(|s| api.addr_validate(&s)) + .transpose()? + .unwrap_or(info.sender), ), - ExecuteMsg::AddValidator { - validator, - } => execute::add_validator(deps, info.sender, validator), - ExecuteMsg::RemoveValidator { - validator, - } => execute::remove_validator(deps, env, info.sender, validator), - ExecuteMsg::TransferOwnership { - new_owner, - } => execute::transfer_ownership(deps, info.sender, new_owner), + ExecuteMsg::AddValidator { validator } => { + execute::add_validator(deps, info.sender, validator) + } + ExecuteMsg::RemoveValidator { validator } => { + execute::remove_validator(deps, env, info.sender, validator) + } + ExecuteMsg::RemoveValidatorEx { validator } => { + execute::remove_validator_ex(deps, env, info.sender, validator) + } + ExecuteMsg::TransferOwnership { new_owner } => { + execute::transfer_ownership(deps, info.sender, new_owner) + } ExecuteMsg::AcceptOwnership {} => execute::accept_ownership(deps, info.sender), ExecuteMsg::Harvest {} => execute::harvest(deps, env), ExecuteMsg::Rebalance {} => execute::rebalance(deps, env), @@ -67,16 +72,15 @@ fn receive( ) -> StdResult { let api = deps.api; match from_binary(&cw20_msg.msg)? { - ReceiveMsg::QueueUnbond { - receiver, - } => { + ReceiveMsg::QueueUnbond { receiver } => { let state = State::default(); let steak_token = state.steak_token.load(deps.storage)?; if info.sender != steak_token { - return Err(StdError::generic_err( - format!("expecting Steak token, received {}", info.sender), - )); + return Err(StdError::generic_err(format!( + "expecting Steak token, received {}", + info.sender + ))); } execute::queue_unbond( @@ -85,7 +89,7 @@ fn receive( api.addr_validate(&receiver.unwrap_or(cw20_msg.sender))?, cw20_msg.amount, ) - }, + } } } @@ -96,7 +100,9 @@ fn callback( callback_msg: CallbackMsg, ) -> StdResult { if env.contract.address != info.sender { - return Err(StdError::generic_err("callbacks can only be invoked by the contract itself")); + return Err(StdError::generic_err( + "callbacks can only be invoked by the contract itself", + )); } match callback_msg { @@ -109,7 +115,10 @@ pub fn reply(deps: DepsMut, env: Env, reply: Reply) -> StdResult { match reply.id { 1 => execute::register_steak_token(deps, unwrap_reply(reply)?), 2 => execute::register_received_coins(deps, env, unwrap_reply(reply)?.events), - id => Err(StdError::generic_err(format!("invalid reply id: {}; must be 1-2", id))), + id => Err(StdError::generic_err(format!( + "invalid reply id: {}; must be 1-2", + id + ))), } } @@ -120,20 +129,29 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { QueryMsg::State {} => to_binary(&queries::state(deps, env)?), QueryMsg::PendingBatch {} => to_binary(&queries::pending_batch(deps)?), QueryMsg::PreviousBatch(id) => to_binary(&queries::previous_batch(deps, id)?), - QueryMsg::PreviousBatches { + QueryMsg::PreviousBatches { start_after, limit } => { + to_binary(&queries::previous_batches(deps, start_after, limit)?) + } + QueryMsg::UnbondRequestsByBatch { + id, start_after, limit, - } => to_binary(&queries::previous_batches(deps, start_after, limit)?), - QueryMsg::UnbondRequestsByBatch { + } => to_binary(&queries::unbond_requests_by_batch( + deps, id, start_after, limit, - } => to_binary(&queries::unbond_requests_by_batch(deps, id, start_after, limit)?), + )?), QueryMsg::UnbondRequestsByUser { user, start_after, limit, - } => to_binary(&queries::unbond_requests_by_user(deps, user, start_after, limit)?), + } => to_binary(&queries::unbond_requests_by_user( + deps, + user, + start_after, + limit, + )?), } } diff --git a/contracts/hub/src/execute.rs b/contracts/hub/src/execute.rs index 482e7ac..bbe2cd2 100644 --- a/contracts/hub/src/execute.rs +++ b/contracts/hub/src/execute.rs @@ -24,7 +24,9 @@ use crate::types::{Coins, Delegation}; pub fn instantiate(deps: DepsMut, env: Env, msg: InstantiateMsg) -> StdResult { let state = State::default(); - state.owner.save(deps.storage, &deps.api.addr_validate(&msg.owner)?)?; + state + .owner + .save(deps.storage, &deps.api.addr_validate(&msg.owner)?)?; state.epoch_period.save(deps.storage, &msg.epoch_period)?; state.unbond_period.save(deps.storage, &msg.unbond_period)?; state.validators.save(deps.storage, &msg.validators)?; @@ -233,14 +235,15 @@ pub fn register_received_coins( } let state = State::default(); - state.unlocked_coins.update(deps.storage, |coins| -> StdResult<_> { - let mut coins = Coins(coins); - coins.add_many(&received_coins)?; - Ok(coins.0) - })?; - - Ok(Response::new() - .add_attribute("action", "steakhub/register_received_coins")) + state + .unlocked_coins + .update(deps.storage, |coins| -> StdResult<_> { + let mut coins = Coins(coins); + coins.add_many(&received_coins)?; + Ok(coins.0) + })?; + + Ok(Response::new().add_attribute("action", "steakhub/register_received_coins")) } fn parse_coin_receiving_event(env: &Env, event: &Event) -> StdResult { @@ -328,15 +331,17 @@ pub fn submit_batch(deps: DepsMut, env: Env) -> StdResult { let current_time = env.block.time.seconds(); if current_time < pending_batch.est_unbond_start_time { - return Err(StdError::generic_err( - format!("batch can only be submitted for unbonding after {}", pending_batch.est_unbond_start_time), - )); + return Err(StdError::generic_err(format!( + "batch can only be submitted for unbonding after {}", + pending_batch.est_unbond_start_time + ))); } let delegations = query_delegations(&deps.querier, &validators, &env.contract.address)?; let usteak_supply = query_cw20_total_supply(&deps.querier, &steak_token)?; - let uluna_to_unbond = compute_unbond_amount(usteak_supply, pending_batch.usteak_to_burn, &delegations); + let uluna_to_unbond = + compute_unbond_amount(usteak_supply, pending_batch.usteak_to_burn, &delegations); let new_undelegations = compute_undelegations(uluna_to_unbond, &delegations); // NOTE: Regarding the `uluna_unclaimed` value @@ -419,18 +424,20 @@ pub fn reconcile(deps: DepsMut, env: Env) -> StdResult { .filter(|b| current_time > b.est_unbond_end_time) .collect::>(); - let uluna_expected_received: Uint128 = batches - .iter() - .map(|b| b.uluna_unclaimed) - .sum(); + let uluna_expected_received: Uint128 = batches.iter().map(|b| b.uluna_unclaimed).sum(); let unlocked_coins = state.unlocked_coins.load(deps.storage)?; let uluna_expected_unlocked = Coins(unlocked_coins).find("uluna").amount; let uluna_expected = uluna_expected_received + uluna_expected_unlocked; - let uluna_actual = deps.querier.query_balance(&env.contract.address, "uluna")?.amount; + let uluna_actual = deps + .querier + .query_balance(&env.contract.address, "uluna")? + .amount; - let uluna_to_deduct = uluna_expected.checked_sub(uluna_actual).unwrap_or_else(|_| Uint128::zero()); + let uluna_to_deduct = uluna_expected + .checked_sub(uluna_actual) + .unwrap_or_else(|_| Uint128::zero()); if !uluna_to_deduct.is_zero() { reconcile_batches(&mut batches, uluna_expected - uluna_actual); } @@ -502,10 +509,14 @@ pub fn withdraw_unbonded( if batch.total_shares.is_zero() { state.previous_batches.remove(deps.storage, request.id)?; } else { - state.previous_batches.save(deps.storage, batch.id, &batch)?; + state + .previous_batches + .save(deps.storage, batch.id, &batch)?; } - state.unbond_requests.remove(deps.storage, (request.id, &user))?; + state + .unbond_requests + .remove(deps.storage, (request.id, &user))?; } } } @@ -552,8 +563,7 @@ pub fn rebalance(deps: DepsMut, env: Env) -> StdResult { let amount: u128 = new_redelegations.iter().map(|rd| rd.amount).sum(); - let event = Event::new("steakhub/rebalanced") - .add_attribute("uluna_moved", amount.to_string()); + let event = Event::new("steakhub/rebalanced").add_attribute("uluna_moved", amount.to_string()); Ok(Response::new() .add_submessages(redelegate_submsgs) @@ -574,8 +584,7 @@ pub fn add_validator(deps: DepsMut, sender: Addr, validator: String) -> StdResul Ok(validators) })?; - let event = Event::new("steakhub/validator_added") - .add_attribute("validator", validator); + let event = Event::new("steakhub/validator_added").add_attribute("validator", validator); Ok(Response::new() .add_event(event) @@ -594,7 +603,9 @@ pub fn remove_validator( let validators = state.validators.update(deps.storage, |mut validators| { if !validators.contains(&validator) { - return Err(StdError::generic_err("validator is not already whitelisted")); + return Err(StdError::generic_err( + "validator is not already whitelisted", + )); } validators.retain(|v| *v != validator); Ok(validators) @@ -609,23 +620,50 @@ pub fn remove_validator( .map(|d| SubMsg::reply_on_success(d.to_cosmos_msg(), 2)) .collect::>(); - let event = Event::new("steak/validator_removed") - .add_attribute("validator", validator); + let event = Event::new("steak/validator_removed").add_attribute("validator", validator); Ok(Response::new() .add_submessages(redelegate_submsgs) .add_event(event) .add_attribute("action", "steakhub/remove_validator")) } +pub fn remove_validator_ex( + deps: DepsMut, + _env: Env, + sender: Addr, + validator: String, +) -> StdResult { + let state = State::default(); + + state.assert_owner(deps.storage, &sender)?; + + state.validators.update(deps.storage, |mut validators| { + if !validators.contains(&validator) { + return Err(StdError::generic_err( + "validator is not already whitelisted", + )); + } + validators.retain(|v| *v != validator); + Ok(validators) + })?; + + let event = Event::new("steak/validator_removed_ex").add_attribute("validator", validator); + + Ok(Response::new() + .add_submessages(redelegate_submsgs) + .add_event(event) + .add_attribute("action", "steakhub/remove_validator_ex")) +} pub fn transfer_ownership(deps: DepsMut, sender: Addr, new_owner: String) -> StdResult { let state = State::default(); state.assert_owner(deps.storage, &sender)?; - state.new_owner.save(deps.storage, &deps.api.addr_validate(&new_owner)?)?; + state + .new_owner + .save(deps.storage, &deps.api.addr_validate(&new_owner)?)?; - Ok(Response::new() - .add_attribute("action", "steakhub/transfer_ownership")) + Ok(Response::new().add_attribute("action", "steakhub/transfer_ownership")) } pub fn accept_ownership(deps: DepsMut, sender: Addr) -> StdResult { @@ -635,7 +673,9 @@ pub fn accept_ownership(deps: DepsMut, sender: Addr) -> StdResult { let new_owner = state.new_owner.load(deps.storage)?; if sender != new_owner { - return Err(StdError::generic_err("unauthorized: sender is not new owner")); + return Err(StdError::generic_err( + "unauthorized: sender is not new owner", + )); } state.owner.save(deps.storage, &sender)?; diff --git a/packages/steak/Cargo.toml b/packages/steak/Cargo.toml index bbdd500..c79c579 100644 --- a/packages/steak/Cargo.toml +++ b/packages/steak/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "steak" -version = "2.0.0" +version = "2.0.1" authors = ["larry ", "PFC "] edition = "2018" description = "Liquid staking protocol for the cosmos" diff --git a/packages/steak/src/hub.rs b/packages/steak/src/hub.rs index b793be1..5893a72 100644 --- a/packages/steak/src/hub.rs +++ b/packages/steak/src/hub.rs @@ -29,25 +29,17 @@ pub enum ExecuteMsg { /// Implements the Cw20 receiver interface Receive(Cw20ReceiveMsg), /// Bond specified amount of Luna - Bond { - receiver: Option, - }, + Bond { receiver: Option }, /// Withdraw Luna that have finished unbonding in previous batches - WithdrawUnbonded { - receiver: Option, - }, + WithdrawUnbonded { receiver: Option }, /// Add a validator to the whitelist; callable by the owner - AddValidator { - validator: String, - }, + AddValidator { validator: String }, /// Remove a validator from the whitelist; callable by the owner - RemoveValidator { - validator: String, - }, + RemoveValidator { validator: String }, + /// Remove a validator from the whitelist; callable by the owner; does not undelegate; use with caution + RemoveValidatorEx { validator: String }, /// Transfer ownership to another account; will not take effect unless the new owner accepts - TransferOwnership { - new_owner: String, - }, + TransferOwnership { new_owner: String }, /// Accept an ownership transfer AcceptOwnership {}, /// Claim staking rewards, swap all for Luna, and restake @@ -67,9 +59,7 @@ pub enum ExecuteMsg { pub enum ReceiveMsg { /// Submit an unbonding request to the current unbonding queue; automatically invokes `unbond` /// if `epoch_time` has elapsed since when the last unbonding queue was executed. - QueueUnbond { - receiver: Option, - }, + QueueUnbond { receiver: Option }, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] From 8dc912cc32906483f47e7abc41459d4b52d08bac Mon Sep 17 00:00:00 2001 From: "PFC(Ian)" Date: Mon, 27 Jun 2022 08:06:05 -0500 Subject: [PATCH 2/5] fix styling --- contracts/hub/src/contract.rs | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/contracts/hub/src/contract.rs b/contracts/hub/src/contract.rs index 5bdbc50..90f9c09 100644 --- a/contracts/hub/src/contract.rs +++ b/contracts/hub/src/contract.rs @@ -25,34 +25,40 @@ pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> S let api = deps.api; match msg { ExecuteMsg::Receive(cw20_msg) => receive(deps, env, info, cw20_msg), - ExecuteMsg::Bond { receiver } => execute::bond( + ExecuteMsg::Bond { + receiver, + } => execute::bond( deps, env, - receiver - .map(|s| api.addr_validate(&s)) - .transpose()? - .unwrap_or(info.sender), + receiver.map(|s| api.addr_validate(&s)).transpose()?.unwrap_or(info.sender), parse_received_fund(&info.funds, "uluna")?, ), - ExecuteMsg::WithdrawUnbonded { receiver } => execute::withdraw_unbonded( + ExecuteMsg::WithdrawUnbonded { + receiver, + } => execute::withdraw_unbonded( deps, env, info.sender.clone(), - receiver - .map(|s| api.addr_validate(&s)) - .transpose()? - .unwrap_or(info.sender), + receiver.map(|s| api.addr_validate(&s)) .transpose()?.unwrap_or(info.sender), ), - ExecuteMsg::AddValidator { validator } => { + ExecuteMsg::AddValidator { + validator, + } => { execute::add_validator(deps, info.sender, validator) } - ExecuteMsg::RemoveValidator { validator } => { + ExecuteMsg::RemoveValidator { + validator, + } => { execute::remove_validator(deps, env, info.sender, validator) } - ExecuteMsg::RemoveValidatorEx { validator } => { + ExecuteMsg::RemoveValidatorEx { + validator, + } => { execute::remove_validator_ex(deps, env, info.sender, validator) } - ExecuteMsg::TransferOwnership { new_owner } => { + ExecuteMsg::TransferOwnership { + new_owner, + } => { execute::transfer_ownership(deps, info.sender, new_owner) } ExecuteMsg::AcceptOwnership {} => execute::accept_ownership(deps, info.sender), From e5236f276546703e06abb6961e1365c5a6431c7f Mon Sep 17 00:00:00 2001 From: "PFC(Ian)" Date: Mon, 27 Jun 2022 08:13:20 -0500 Subject: [PATCH 3/5] fix styling --- contracts/hub/src/contract.rs | 61 ++++++++++++----------------------- contracts/hub/src/execute.rs | 17 ++++------ 2 files changed, 26 insertions(+), 52 deletions(-) diff --git a/contracts/hub/src/contract.rs b/contracts/hub/src/contract.rs index 90f9c09..8e9491e 100644 --- a/contracts/hub/src/contract.rs +++ b/contracts/hub/src/contract.rs @@ -39,28 +39,20 @@ pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> S deps, env, info.sender.clone(), - receiver.map(|s| api.addr_validate(&s)) .transpose()?.unwrap_or(info.sender), + receiver.map(|s| api.addr_validate(&s)).transpose()?.unwrap_or(info.sender), ), ExecuteMsg::AddValidator { validator, - } => { - execute::add_validator(deps, info.sender, validator) - } + } => execute::add_validator(deps, info.sender, validator), ExecuteMsg::RemoveValidator { validator, - } => { - execute::remove_validator(deps, env, info.sender, validator) - } + } => execute::remove_validator(deps, env, info.sender, validator), ExecuteMsg::RemoveValidatorEx { validator, - } => { - execute::remove_validator_ex(deps, env, info.sender, validator) - } + } => execute::remove_validator_ex(deps, env, info.sender, validator), ExecuteMsg::TransferOwnership { new_owner, - } => { - execute::transfer_ownership(deps, info.sender, new_owner) - } + } => execute::transfer_ownership(deps, info.sender, new_owner) ExecuteMsg::AcceptOwnership {} => execute::accept_ownership(deps, info.sender), ExecuteMsg::Harvest {} => execute::harvest(deps, env), ExecuteMsg::Rebalance {} => execute::rebalance(deps, env), @@ -78,15 +70,15 @@ fn receive( ) -> StdResult { let api = deps.api; match from_binary(&cw20_msg.msg)? { - ReceiveMsg::QueueUnbond { receiver } => { + ReceiveMsg::QueueUnbond { + receiver, + } => { let state = State::default(); let steak_token = state.steak_token.load(deps.storage)?; if info.sender != steak_token { - return Err(StdError::generic_err(format!( - "expecting Steak token, received {}", - info.sender - ))); + return Err(StdError::generic_err( + format!("expecting Steak token, received {}", info.sender))); } execute::queue_unbond( @@ -95,7 +87,7 @@ fn receive( api.addr_validate(&receiver.unwrap_or(cw20_msg.sender))?, cw20_msg.amount, ) - } + }, } } @@ -106,9 +98,7 @@ fn callback( callback_msg: CallbackMsg, ) -> StdResult { if env.contract.address != info.sender { - return Err(StdError::generic_err( - "callbacks can only be invoked by the contract itself", - )); + return Err(StdError::generic_err("callbacks can only be invoked by the contract itself")); } match callback_msg { @@ -121,10 +111,7 @@ pub fn reply(deps: DepsMut, env: Env, reply: Reply) -> StdResult { match reply.id { 1 => execute::register_steak_token(deps, unwrap_reply(reply)?), 2 => execute::register_received_coins(deps, env, unwrap_reply(reply)?.events), - id => Err(StdError::generic_err(format!( - "invalid reply id: {}; must be 1-2", - id - ))), + id => Err(StdError::generic_err(format!("invalid reply id: {}; must be 1-2", id))), } } @@ -135,29 +122,21 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { QueryMsg::State {} => to_binary(&queries::state(deps, env)?), QueryMsg::PendingBatch {} => to_binary(&queries::pending_batch(deps)?), QueryMsg::PreviousBatch(id) => to_binary(&queries::previous_batch(deps, id)?), - QueryMsg::PreviousBatches { start_after, limit } => { - to_binary(&queries::previous_batches(deps, start_after, limit)?) - } - QueryMsg::UnbondRequestsByBatch { - id, + QueryMsg::PreviousBatches { start_after, - limit, - } => to_binary(&queries::unbond_requests_by_batch( - deps, + limit + } => to_binary(&queries::previous_batches(deps, start_after, limit)?), + + QueryMsg::UnbondRequestsByBatch { id, start_after, limit, - )?), + } => to_binary(&queries::unbond_requests_by_batch(deps, id, start_after, limit)?), QueryMsg::UnbondRequestsByUser { user, start_after, limit, - } => to_binary(&queries::unbond_requests_by_user( - deps, - user, - start_after, - limit, - )?), + } => to_binary(&queries::unbond_requests_by_user(deps, user, start_after, limit)?), } } diff --git a/contracts/hub/src/execute.rs b/contracts/hub/src/execute.rs index bbe2cd2..4757a79 100644 --- a/contracts/hub/src/execute.rs +++ b/contracts/hub/src/execute.rs @@ -24,9 +24,7 @@ use crate::types::{Coins, Delegation}; pub fn instantiate(deps: DepsMut, env: Env, msg: InstantiateMsg) -> StdResult { let state = State::default(); - state - .owner - .save(deps.storage, &deps.api.addr_validate(&msg.owner)?)?; + state.owner.save(deps.storage, &deps.api.addr_validate(&msg.owner)?)?; state.epoch_period.save(deps.storage, &msg.epoch_period)?; state.unbond_period.save(deps.storage, &msg.unbond_period)?; state.validators.save(deps.storage, &msg.validators)?; @@ -235,15 +233,14 @@ pub fn register_received_coins( } let state = State::default(); - state - .unlocked_coins - .update(deps.storage, |coins| -> StdResult<_> { + state.unlocked_coins.update(deps.storage, |coins| -> StdResult<_> { let mut coins = Coins(coins); coins.add_many(&received_coins)?; Ok(coins.0) })?; - Ok(Response::new().add_attribute("action", "steakhub/register_received_coins")) + Ok(Response::new() + .add_attribute("action", "steakhub/register_received_coins")) } fn parse_coin_receiving_event(env: &Env, event: &Event) -> StdResult { @@ -331,10 +328,8 @@ pub fn submit_batch(deps: DepsMut, env: Env) -> StdResult { let current_time = env.block.time.seconds(); if current_time < pending_batch.est_unbond_start_time { - return Err(StdError::generic_err(format!( - "batch can only be submitted for unbonding after {}", - pending_batch.est_unbond_start_time - ))); + return Err(StdError::generic_err( + format!("batch can only be submitted for unbonding after {}", pending_batch.est_unbond_start_time))); } let delegations = query_delegations(&deps.querier, &validators, &env.contract.address)?; From 1df7d79a32600640574bc3edf80ae32603e67bd4 Mon Sep 17 00:00:00 2001 From: "PFC(Ian)" Date: Mon, 27 Jun 2022 08:15:02 -0500 Subject: [PATCH 4/5] fix styling --- contracts/hub/src/contract.rs | 7 ++++--- contracts/hub/src/execute.rs | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/hub/src/contract.rs b/contracts/hub/src/contract.rs index 8e9491e..187455f 100644 --- a/contracts/hub/src/contract.rs +++ b/contracts/hub/src/contract.rs @@ -52,7 +52,7 @@ pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> S } => execute::remove_validator_ex(deps, env, info.sender, validator), ExecuteMsg::TransferOwnership { new_owner, - } => execute::transfer_ownership(deps, info.sender, new_owner) + } => execute::transfer_ownership(deps, info.sender, new_owner), ExecuteMsg::AcceptOwnership {} => execute::accept_ownership(deps, info.sender), ExecuteMsg::Harvest {} => execute::harvest(deps, env), ExecuteMsg::Rebalance {} => execute::rebalance(deps, env), @@ -78,7 +78,8 @@ fn receive( let steak_token = state.steak_token.load(deps.storage)?; if info.sender != steak_token { return Err(StdError::generic_err( - format!("expecting Steak token, received {}", info.sender))); + format!("expecting Steak token, received {}", info.sender) + )); } execute::queue_unbond( @@ -124,7 +125,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { QueryMsg::PreviousBatch(id) => to_binary(&queries::previous_batch(deps, id)?), QueryMsg::PreviousBatches { start_after, - limit + limit, } => to_binary(&queries::previous_batches(deps, start_after, limit)?), QueryMsg::UnbondRequestsByBatch { diff --git a/contracts/hub/src/execute.rs b/contracts/hub/src/execute.rs index 4757a79..cf1b11e 100644 --- a/contracts/hub/src/execute.rs +++ b/contracts/hub/src/execute.rs @@ -645,7 +645,6 @@ pub fn remove_validator_ex( let event = Event::new("steak/validator_removed_ex").add_attribute("validator", validator); Ok(Response::new() - .add_submessages(redelegate_submsgs) .add_event(event) .add_attribute("action", "steakhub/remove_validator_ex")) } From 9f041f0496b2eec7f348ec040fecb191d6958705 Mon Sep 17 00:00:00 2001 From: "PFC(Ian)" Date: Mon, 27 Jun 2022 08:24:39 -0500 Subject: [PATCH 5/5] fix styling --- contracts/hub/src/contract.rs | 3 +- contracts/hub/src/execute.rs | 52 ++++++++++++++--------------------- 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/contracts/hub/src/contract.rs b/contracts/hub/src/contract.rs index 187455f..6865581 100644 --- a/contracts/hub/src/contract.rs +++ b/contracts/hub/src/contract.rs @@ -78,7 +78,7 @@ fn receive( let steak_token = state.steak_token.load(deps.storage)?; if info.sender != steak_token { return Err(StdError::generic_err( - format!("expecting Steak token, received {}", info.sender) + format!("expecting Steak token, received {}", info.sender), )); } @@ -127,7 +127,6 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { start_after, limit, } => to_binary(&queries::previous_batches(deps, start_after, limit)?), - QueryMsg::UnbondRequestsByBatch { id, start_after, diff --git a/contracts/hub/src/execute.rs b/contracts/hub/src/execute.rs index cf1b11e..a3e68e9 100644 --- a/contracts/hub/src/execute.rs +++ b/contracts/hub/src/execute.rs @@ -234,10 +234,10 @@ pub fn register_received_coins( let state = State::default(); state.unlocked_coins.update(deps.storage, |coins| -> StdResult<_> { - let mut coins = Coins(coins); - coins.add_many(&received_coins)?; - Ok(coins.0) - })?; + let mut coins = Coins(coins); + coins.add_many(&received_coins)?; + Ok(coins.0) + })?; Ok(Response::new() .add_attribute("action", "steakhub/register_received_coins")) @@ -329,14 +329,14 @@ pub fn submit_batch(deps: DepsMut, env: Env) -> StdResult { let current_time = env.block.time.seconds(); if current_time < pending_batch.est_unbond_start_time { return Err(StdError::generic_err( - format!("batch can only be submitted for unbonding after {}", pending_batch.est_unbond_start_time))); + format!("batch can only be submitted for unbonding after {}", pending_batch.est_unbond_start_time) + )); } let delegations = query_delegations(&deps.querier, &validators, &env.contract.address)?; let usteak_supply = query_cw20_total_supply(&deps.querier, &steak_token)?; - let uluna_to_unbond = - compute_unbond_amount(usteak_supply, pending_batch.usteak_to_burn, &delegations); + let uluna_to_unbond = compute_unbond_amount(usteak_supply, pending_batch.usteak_to_burn, &delegations); let new_undelegations = compute_undelegations(uluna_to_unbond, &delegations); // NOTE: Regarding the `uluna_unclaimed` value @@ -425,14 +425,9 @@ pub fn reconcile(deps: DepsMut, env: Env) -> StdResult { let uluna_expected_unlocked = Coins(unlocked_coins).find("uluna").amount; let uluna_expected = uluna_expected_received + uluna_expected_unlocked; - let uluna_actual = deps - .querier - .query_balance(&env.contract.address, "uluna")? - .amount; + let uluna_actual = deps.querier.query_balance(&env.contract.address, "uluna")?.amount; - let uluna_to_deduct = uluna_expected - .checked_sub(uluna_actual) - .unwrap_or_else(|_| Uint128::zero()); + let uluna_to_deduct = uluna_expected.checked_sub(uluna_actual).unwrap_or_else(|_| Uint128::zero()); if !uluna_to_deduct.is_zero() { reconcile_batches(&mut batches, uluna_expected - uluna_actual); } @@ -504,14 +499,10 @@ pub fn withdraw_unbonded( if batch.total_shares.is_zero() { state.previous_batches.remove(deps.storage, request.id)?; } else { - state - .previous_batches - .save(deps.storage, batch.id, &batch)?; + state.previous_batches.save(deps.storage, batch.id, &batch)?; } - state - .unbond_requests - .remove(deps.storage, (request.id, &user))?; + state.unbond_requests.remove(deps.storage, (request.id, &user))?; } } } @@ -558,7 +549,8 @@ pub fn rebalance(deps: DepsMut, env: Env) -> StdResult { let amount: u128 = new_redelegations.iter().map(|rd| rd.amount).sum(); - let event = Event::new("steakhub/rebalanced").add_attribute("uluna_moved", amount.to_string()); + let event = Event::new("steakhub/rebalanced") + .add_attribute("uluna_moved", amount.to_string()); Ok(Response::new() .add_submessages(redelegate_submsgs) @@ -598,9 +590,7 @@ pub fn remove_validator( let validators = state.validators.update(deps.storage, |mut validators| { if !validators.contains(&validator) { - return Err(StdError::generic_err( - "validator is not already whitelisted", - )); + return Err(StdError::generic_err("validator is not already whitelisted")); } validators.retain(|v| *v != validator); Ok(validators) @@ -615,7 +605,8 @@ pub fn remove_validator( .map(|d| SubMsg::reply_on_success(d.to_cosmos_msg(), 2)) .collect::>(); - let event = Event::new("steak/validator_removed").add_attribute("validator", validator); + let event = Event::new("steak/validator_removed") + .add_attribute("validator", validator); Ok(Response::new() .add_submessages(redelegate_submsgs) @@ -634,15 +625,14 @@ pub fn remove_validator_ex( state.validators.update(deps.storage, |mut validators| { if !validators.contains(&validator) { - return Err(StdError::generic_err( - "validator is not already whitelisted", - )); + return Err(StdError::generic_err("validator is not already whitelisted")); } validators.retain(|v| *v != validator); Ok(validators) })?; - let event = Event::new("steak/validator_removed_ex").add_attribute("validator", validator); + let event = Event::new("steak/validator_removed_ex") + .add_attribute("validator", validator); Ok(Response::new() .add_event(event) @@ -653,9 +643,7 @@ pub fn transfer_ownership(deps: DepsMut, sender: Addr, new_owner: String) -> Std let state = State::default(); state.assert_owner(deps.storage, &sender)?; - state - .new_owner - .save(deps.storage, &deps.api.addr_validate(&new_owner)?)?; + state.new_owner.save(deps.storage, &deps.api.addr_validate(&new_owner)?)?; Ok(Response::new().add_attribute("action", "steakhub/transfer_ownership")) }