Skip to content

Commit 0696ee6

Browse files
committed
fix: unimplemented whale info methods
1 parent b435897 commit 0696ee6

3 files changed

Lines changed: 151 additions & 5 deletions

File tree

build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
docker run --rm -v "$(pwd)":/code \
44
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \
55
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
6-
cosmwasm/optimizer:0.16.0
6+
cosmwasm/optimizer:0.15.0

contracts/cw20-taxed/src/contract.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::state::{
2727
};
2828

2929
use crate::tax::TaxMap;
30-
use crate::whale::{self, WhaleInfo};
30+
use crate::whale::{self, execute_set_whale_admin, execute_set_whale_info, WhaleInfo};
3131

3232
// version info for migration info
3333
pub const CONTRACT_NAME: &str = "crates.io:cw20-base";
@@ -266,8 +266,21 @@ pub fn execute(
266266
ExecuteMsg::SetTaxAdmin { tax_admin } => execute_set_tax_admin(deps, env, info, tax_admin),
267267

268268
// WhaleInfo related extension
269-
ExecuteMsg::SetWhaleInfo { whale_info } => panic!("Not implemented"),
270-
ExecuteMsg::SetWhaleAdmin { whale_admin } => panic!("Not implemented"),
269+
ExecuteMsg::SetWhaleInfo { whale_info } => {
270+
match whale_info {
271+
Some(x) => execute_set_whale_info(deps, env, info, x),
272+
None => { Ok(Response::new()) }
273+
}
274+
},
275+
ExecuteMsg::SetWhaleAdmin { whale_admin } => {
276+
match whale_admin {
277+
Some(x) => {
278+
let new_addr = deps.api.addr_validate(x.as_str())?;
279+
execute_set_whale_admin(deps, env, info, new_addr)
280+
}
281+
None => { Ok(Response::new()) }
282+
}
283+
},
271284
}
272285
}
273286

contracts/cw20-taxed/src/whale.rs

Lines changed: 134 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
use std::char::REPLACEMENT_CHARACTER;
2+
3+
use cosmwasm_std::{DepsMut, Env, MessageInfo, Response};
14
use cosmwasm_std::{Addr, Decimal, StdError, StdResult, Storage, Uint128};
5+
use crate::ContractError;
26
use schemars::JsonSchema;
37
use serde::{Deserialize, Serialize};
8+
use crate::state::ANTI_WHALE_INFO;
49

510
use crate::state::TOKEN_INFO;
611

@@ -54,9 +59,44 @@ impl WhaleInfo {
5459
}
5560
}
5661

62+
pub fn execute_set_whale_info(
63+
deps: DepsMut,
64+
env: Env, info: MessageInfo,
65+
whale_info: WhaleInfo
66+
) -> Result<Response, ContractError> {
67+
let mut old_whale_info = ANTI_WHALE_INFO.load(deps.storage)?;
68+
whale_info.validate()?;
69+
if info.sender != old_whale_info.admin {
70+
return Err(ContractError::Unauthorized {});
71+
}
72+
ANTI_WHALE_INFO.save(deps.storage, &whale_info)?;
73+
Ok(Response::new())
74+
}
75+
76+
pub fn execute_set_whale_admin(
77+
deps: DepsMut,
78+
env: Env,
79+
info: MessageInfo,
80+
admin: Addr
81+
) -> Result<Response, ContractError> {
82+
let mut old_info = ANTI_WHALE_INFO.load(deps.storage)?;
83+
if info.sender != old_info.admin {
84+
return Err(ContractError::Unauthorized{});
85+
}
86+
old_info.admin = admin;
87+
ANTI_WHALE_INFO.save(deps.storage, &old_info)?;
88+
Ok(Response::new())
89+
}
90+
5791
#[cfg(test)]
5892
mod test {
59-
use cosmwasm_std::{testing::MockStorage, Addr, Decimal, Uint128};
93+
use std::ops::Add;
94+
95+
use cosmwasm_std::{
96+
testing::{mock_dependencies, mock_env, mock_info, MockStorage}, Addr, Decimal, Uint128
97+
};
98+
use crate::ContractError;
99+
use serde::de;
60100

61101
use crate::state::TokenInfo;
62102

@@ -132,4 +172,97 @@ mod test {
132172
assert!(info.assert_no_whale(storage, &addr3, whale_amount).is_err());
133173
assert!(info.assert_no_whale(storage, &addr3, fish_amount).is_ok());
134174
}
175+
176+
#[test]
177+
fn test_set_whale_info_works() {
178+
let mut deps = mock_dependencies();
179+
let info = mock_info("admin", &[]);
180+
let expected_whale_info = super::WhaleInfo {
181+
threshold: Decimal::percent(10),
182+
whitelist: vec![Addr::unchecked("whale1"), Addr::unchecked("whale2")],
183+
admin: Addr::unchecked("admin"),
184+
};
185+
186+
// mock info being set by instantiation
187+
super::ANTI_WHALE_INFO.save(deps.as_mut().storage, &super::WhaleInfo {
188+
threshold: Decimal::one(),
189+
whitelist: vec![],
190+
admin: Addr::unchecked("admin"),
191+
}).unwrap();
192+
193+
super::execute_set_whale_info(deps.as_mut(), mock_env(), info, expected_whale_info).unwrap();
194+
195+
let new_info = super::ANTI_WHALE_INFO.load(deps.as_ref().storage).unwrap();
196+
assert_eq!(new_info, new_info);
197+
198+
}
199+
200+
#[test]
201+
fn test_set_whale_info_rejects_no_admin() {
202+
let mut deps = mock_dependencies();
203+
let info = mock_info("no_admin", &[]);
204+
let expected_whale_info = super::WhaleInfo {
205+
threshold: Decimal::percent(10),
206+
whitelist: vec![Addr::unchecked("whale1"), Addr::unchecked("whale2")],
207+
admin: Addr::unchecked("admin"),
208+
};
209+
210+
// mock info being set by instantiation
211+
super::ANTI_WHALE_INFO.save(deps.as_mut().storage, &super::WhaleInfo {
212+
threshold: Decimal::one(),
213+
whitelist: vec![],
214+
admin: Addr::unchecked("admin"),
215+
}).unwrap();
216+
217+
let err = super::execute_set_whale_info(deps.as_mut(), mock_env(), info, expected_whale_info);
218+
match err {
219+
Ok(_) => { panic!("expected failrue"); },
220+
Err(e) => {
221+
assert_eq!( e, ContractError::Unauthorized { } )
222+
}
223+
}
224+
225+
}
226+
227+
#[test]
228+
fn test_set_whale_admin() {
229+
let mut deps = mock_dependencies();
230+
let info = mock_info("admin", &[]);
231+
let old_whale_info = super::WhaleInfo {
232+
threshold: Decimal::percent(10),
233+
whitelist: vec![Addr::unchecked("whale1"), Addr::unchecked("whale2")],
234+
admin: Addr::unchecked("admin"),
235+
};
236+
let mut expected_whale_info = old_whale_info.clone();
237+
expected_whale_info.admin = Addr::unchecked("admin2");
238+
239+
// mock info being set by instantiation
240+
super::ANTI_WHALE_INFO.save(deps.as_mut().storage, &old_whale_info).unwrap();
241+
242+
super::execute_set_whale_admin(deps.as_mut(), mock_env(), info, Addr::unchecked("admin2")).unwrap();
243+
244+
let new_info = super::ANTI_WHALE_INFO.load(deps.as_mut().storage).unwrap();
245+
assert_eq!(new_info, expected_whale_info)
246+
}
247+
248+
#[test]
249+
fn test_set_whale_admin_unauthorized() {
250+
let mut deps = mock_dependencies();
251+
let info = mock_info("no_admin", &[]);
252+
let old_whale_info = super::WhaleInfo {
253+
threshold: Decimal::percent(10),
254+
whitelist: vec![Addr::unchecked("whale1"), Addr::unchecked("whale2")],
255+
admin: Addr::unchecked("admin"),
256+
};
257+
258+
// mock info being set by instantiation
259+
super::ANTI_WHALE_INFO.save(deps.as_mut().storage, &old_whale_info).unwrap();
260+
261+
let res = super::execute_set_whale_admin(deps.as_mut(), mock_env(), info, Addr::unchecked("admin2"));
262+
match res {
263+
Ok(_) => {panic!("unexpected success of setting admin!")},
264+
Err(e) => {assert_eq!(e, ContractError::Unauthorized { })}
265+
}
266+
267+
}
135268
}

0 commit comments

Comments
 (0)