|
1 | 1 | use std::collections::BTreeMap;
|
2 | 2 |
|
3 | 3 | use cosmwasm_std::{
|
| 4 | + from_json, |
4 | 5 | testing::{message_info, mock_dependencies, mock_env, MockApi, MockQuerier, MockStorage},
|
5 |
| - Addr, Event, Order, OwnedDeps, Response, Uint128, |
| 6 | + to_json_binary, Addr, ContractResult, DecCoin, Decimal, DistributionMsg, Event, Order, |
| 7 | + OwnedDeps, QuerierResult, Response, Uint128, WasmQuery, |
6 | 8 | };
|
7 | 9 | use cw_account::{
|
8 | 10 | state::{Admins, Zkgm},
|
9 | 11 | types::{Admin, LocalAdmin},
|
10 | 12 | };
|
11 | 13 | use depolama::StorageExt;
|
| 14 | +use lst::{msg::ConfigResponse, types::ProtocolFeeConfig}; |
12 | 15 |
|
13 |
| -use crate::{execute, msg::ExecuteMsg, ContractError}; |
| 16 | +use crate::{execute, msg::ExecuteMsg, withdraw_all_rewards, ContractError}; |
14 | 17 |
|
15 | 18 | const ADMIN: &str = "admin";
|
| 19 | +const LST_HUB: &str = "lst-hub"; |
16 | 20 |
|
17 | 21 | fn setup_local() -> OwnedDeps<MockStorage, MockApi, MockQuerier> {
|
18 | 22 | let mut deps = mock_dependencies();
|
@@ -41,6 +45,14 @@ fn setup_local() -> OwnedDeps<MockStorage, MockApi, MockQuerier> {
|
41 | 45 | // zkgm does not exist after a local admin init
|
42 | 46 | assert!(deps.storage.maybe_read_item::<Zkgm>().unwrap().is_none());
|
43 | 47 |
|
| 48 | + execute( |
| 49 | + deps.as_mut(), |
| 50 | + mock_env(), |
| 51 | + message_info(&Addr::unchecked(ADMIN), &[]), |
| 52 | + ExecuteMsg::SetLstHubAddress(Addr::unchecked(LST_HUB)), |
| 53 | + ) |
| 54 | + .unwrap(); |
| 55 | + |
44 | 56 | deps
|
45 | 57 | }
|
46 | 58 |
|
@@ -108,7 +120,7 @@ fn admin_ops_require_admin() {
|
108 | 120 | fn lst_ops_require_lst() {
|
109 | 121 | let mut deps = setup_local();
|
110 | 122 |
|
111 |
| - let lst_hub = Addr::unchecked("lst-hub"); |
| 123 | + let lst_hub = Addr::unchecked(LST_HUB); |
112 | 124 | let non_admin = Addr::unchecked("non-admin");
|
113 | 125 |
|
114 | 126 | assert_eq!(
|
@@ -149,3 +161,84 @@ fn lst_ops_require_lst() {
|
149 | 161 | },
|
150 | 162 | );
|
151 | 163 | }
|
| 164 | + |
| 165 | +#[test] |
| 166 | +fn withdraw_all_rewards_floors_correctly() { |
| 167 | + let mut deps = setup_local(); |
| 168 | + let env = mock_env(); |
| 169 | + |
| 170 | + deps.querier.update_wasm(|w| match w { |
| 171 | + WasmQuery::Smart { contract_addr, msg } => match &**contract_addr { |
| 172 | + LST_HUB => match from_json::<lst::msg::QueryMsg>(msg).unwrap() { |
| 173 | + lst::msg::QueryMsg::Config {} => QuerierResult::Ok(ContractResult::Ok( |
| 174 | + to_json_binary(&ConfigResponse { |
| 175 | + native_token_denom: "au".to_owned(), |
| 176 | + minimum_liquid_stake_amount: Default::default(), |
| 177 | + protocol_fee_config: ProtocolFeeConfig { |
| 178 | + fee_rate: Default::default(), |
| 179 | + fee_recipient: "".to_owned(), |
| 180 | + }, |
| 181 | + monitors: Default::default(), |
| 182 | + lst_address: Addr::unchecked(""), |
| 183 | + staker_address: Addr::unchecked(""), |
| 184 | + batch_period_seconds: Default::default(), |
| 185 | + unbonding_period_seconds: Default::default(), |
| 186 | + stopped: Default::default(), |
| 187 | + }) |
| 188 | + .unwrap(), |
| 189 | + )), |
| 190 | + _ => todo!(), |
| 191 | + }, |
| 192 | + _ => todo!(), |
| 193 | + }, |
| 194 | + _ => todo!(), |
| 195 | + }); |
| 196 | + |
| 197 | + let (native_token_denom, total_pending_rewards, withdraw_msgs) = |
| 198 | + withdraw_all_rewards(deps.as_ref(), &env).unwrap(); |
| 199 | + |
| 200 | + assert_eq!(native_token_denom, "au"); |
| 201 | + assert_eq!(total_pending_rewards, Uint128::zero()); |
| 202 | + assert_eq!(withdraw_msgs.collect::<Vec<_>>(), vec![]); |
| 203 | + |
| 204 | + deps.querier.distribution.set_rewards( |
| 205 | + "val-1", |
| 206 | + &env.contract.address, |
| 207 | + vec![DecCoin::new("1.5".parse::<Decimal>().unwrap(), "au")], |
| 208 | + ); |
| 209 | + |
| 210 | + let (native_token_denom, total_pending_rewards, withdraw_msgs) = |
| 211 | + withdraw_all_rewards(deps.as_ref(), &env).unwrap(); |
| 212 | + |
| 213 | + assert_eq!(native_token_denom, "au"); |
| 214 | + assert_eq!(total_pending_rewards, Uint128::new(1)); |
| 215 | + assert_eq!( |
| 216 | + withdraw_msgs.collect::<Vec<_>>(), |
| 217 | + vec![DistributionMsg::WithdrawDelegatorReward { |
| 218 | + validator: "val-1".to_owned() |
| 219 | + }] |
| 220 | + ); |
| 221 | + |
| 222 | + deps.querier.distribution.set_rewards( |
| 223 | + "val-2", |
| 224 | + &env.contract.address, |
| 225 | + vec![DecCoin::new("0.5".parse::<Decimal>().unwrap(), "au")], |
| 226 | + ); |
| 227 | + |
| 228 | + let (native_token_denom, total_pending_rewards, withdraw_msgs) = |
| 229 | + withdraw_all_rewards(deps.as_ref(), &env).unwrap(); |
| 230 | + |
| 231 | + assert_eq!(native_token_denom, "au"); |
| 232 | + assert_eq!(total_pending_rewards, Uint128::new(1)); |
| 233 | + assert_eq!( |
| 234 | + withdraw_msgs.collect::<Vec<_>>(), |
| 235 | + vec![ |
| 236 | + DistributionMsg::WithdrawDelegatorReward { |
| 237 | + validator: "val-1".to_owned() |
| 238 | + }, |
| 239 | + DistributionMsg::WithdrawDelegatorReward { |
| 240 | + validator: "val-2".to_owned() |
| 241 | + } |
| 242 | + ] |
| 243 | + ); |
| 244 | +} |
0 commit comments