Skip to content

Commit

Permalink
Merge branch 'main' into shanev/testnet-genesis
Browse files Browse the repository at this point in the history
  • Loading branch information
shanev committed Mar 7, 2022
2 parents 11b1ef0 + 29cf2d2 commit 6793e28
Show file tree
Hide file tree
Showing 11 changed files with 101 additions and 64 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion contracts/minter/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "minter"
version = "0.7.2"
version = "0.7.4"
authors = ["Jake Hartnell <[email protected]>"]
edition = "2018"

Expand Down
10 changes: 10 additions & 0 deletions contracts/minter/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,16 @@ pub fn execute_set_whitelist(
return Err(ContractError::AlreadyStarted {});
}

if let Some(wl) = config.whitelist {
let res: WhitelistConfigResponse = deps
.querier
.query_wasm_smart(wl, &WhitelistQueryMsg::Config {})?;

if res.is_active {
return Err(ContractError::WhitelistAlreadyStarted {});
}
}

config.whitelist = Some(deps.api.addr_validate(whitelist)?);
CONFIG.save(deps.storage, &config)?;

Expand Down
96 changes: 45 additions & 51 deletions contracts/minter/src/contract_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -545,21 +545,11 @@ fn mint_count_query() {
setup_block_time(&mut router, GENESIS_MINT_START_TIME - 1000);

let wl_msg = WhitelistExecuteMsg::UpdateEndTime(EXPIRATION_TIME);
let res = router.execute_contract(
creator.clone(),
whitelist_addr.clone(),
&wl_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
);
let res = router.execute_contract(creator.clone(), whitelist_addr.clone(), &wl_msg, &[]);
assert!(res.is_ok());

let wl_msg = WhitelistExecuteMsg::UpdateStartTime(Timestamp::from_nanos(0));
let res = router.execute_contract(
creator.clone(),
whitelist_addr.clone(),
&wl_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
);
let res = router.execute_contract(creator.clone(), whitelist_addr.clone(), &wl_msg, &[]);
assert!(res.is_ok());

// Set whitelist in minter contract
Expand All @@ -570,7 +560,7 @@ fn mint_count_query() {
creator.clone(),
minter_addr.clone(),
&set_whitelist_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
&[],
);
assert!(res.is_ok());

Expand All @@ -582,7 +572,7 @@ fn mint_count_query() {
creator.clone(),
minter_addr.clone(),
&set_whitelist_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
&[],
);
assert!(res.is_ok());

Expand All @@ -591,12 +581,7 @@ fn mint_count_query() {
to_add: vec![buyer.to_string()],
};
let wasm_msg = WhitelistExecuteMsg::AddMembers(inner_msg);
let res = router.execute_contract(
creator.clone(),
whitelist_addr,
&wasm_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
);
let res = router.execute_contract(creator.clone(), whitelist_addr, &wasm_msg, &[]);
assert!(res.is_ok());

setup_block_time(&mut router, GENESIS_MINT_START_TIME);
Expand Down Expand Up @@ -754,6 +739,40 @@ fn whitelist_already_started() {
.unwrap_err();
}

#[test]
fn whitelist_can_update_before_start() {
let mut router = custom_mock_app();
let (creator, _) = setup_accounts(&mut router);
let num_tokens = 1;
let (minter_addr, _) = setup_minter_contract(&mut router, &creator, num_tokens);
let whitelist_addr = setup_whitelist_contract(&mut router, &creator);

setup_block_time(&mut router, GENESIS_MINT_START_TIME - 1000);

// set whitelist in minter contract
let set_whitelist_msg = ExecuteMsg::SetWhitelist {
whitelist: whitelist_addr.to_string(),
};
router
.execute_contract(
creator.clone(),
minter_addr.clone(),
&set_whitelist_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
)
.unwrap();

// can set twice before starting
router
.execute_contract(
creator.clone(),
minter_addr,
&set_whitelist_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
)
.unwrap();
}

#[test]
fn whitelist_access_len_add_remove_expiration() {
let mut router = custom_mock_app();
Expand All @@ -770,31 +789,16 @@ fn whitelist_access_len_add_remove_expiration() {
// Update whitelist_expiration fails if not admin
let wl_msg = WhitelistExecuteMsg::UpdateEndTime(AFTER_GENESIS_TIME);
router
.execute_contract(
buyer.clone(),
whitelist_addr.clone(),
&wl_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
)
.execute_contract(buyer.clone(), whitelist_addr.clone(), &wl_msg, &[])
.unwrap_err();

// Update whitelist_expiration succeeds when from admin
let wl_msg = WhitelistExecuteMsg::UpdateEndTime(AFTER_GENESIS_TIME);
let res = router.execute_contract(
creator.clone(),
whitelist_addr.clone(),
&wl_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
);
let res = router.execute_contract(creator.clone(), whitelist_addr.clone(), &wl_msg, &[]);
assert!(res.is_ok());

let wl_msg = WhitelistExecuteMsg::UpdateStartTime(Timestamp::from_nanos(0));
let res = router.execute_contract(
creator.clone(),
whitelist_addr.clone(),
&wl_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
);
let res = router.execute_contract(creator.clone(), whitelist_addr.clone(), &wl_msg, &[]);
assert!(res.is_ok());

// Set whitelist in minter contract
Expand All @@ -805,7 +809,7 @@ fn whitelist_access_len_add_remove_expiration() {
creator.clone(),
minter_addr.clone(),
&set_whitelist_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
&[],
);
assert!(res.is_ok());

Expand All @@ -824,12 +828,7 @@ fn whitelist_access_len_add_remove_expiration() {
to_add: vec![buyer.to_string()],
};
let wasm_msg = WhitelistExecuteMsg::AddMembers(inner_msg);
let res = router.execute_contract(
creator.clone(),
whitelist_addr.clone(),
&wasm_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
);
let res = router.execute_contract(creator.clone(), whitelist_addr.clone(), &wasm_msg, &[]);
assert!(res.is_ok());

// Mint fails, not whitelist price
Expand Down Expand Up @@ -919,12 +918,7 @@ fn whitelist_access_len_add_remove_expiration() {
// Remove buyer from whitelist
let inner_msg = AddMembersMsg { to_add: vec![] };
let wasm_msg = WhitelistExecuteMsg::AddMembers(inner_msg);
let res = router.execute_contract(
creator.clone(),
whitelist_addr,
&wasm_msg,
&coins(UNIT_PRICE, NATIVE_DENOM),
);
let res = router.execute_contract(creator.clone(), whitelist_addr, &wasm_msg, &[]);
assert!(res.is_ok());

// Mint fails
Expand Down
3 changes: 3 additions & 0 deletions contracts/minter/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ pub enum ContractError {
#[error("BeforeGenesisTime")]
BeforeGenesisTime {},

#[error("WhitelistAlreadyStarted")]
WhitelistAlreadyStarted {},

#[error("InvalidStartTime {0} < {1}")]
InvalidStartTime(Timestamp, Timestamp),

Expand Down
2 changes: 1 addition & 1 deletion contracts/sg721/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "sg721"
version = "0.7.2"
version = "0.7.3"
authors = ["Shane Vitarana <[email protected]>"]
edition = "2018"

Expand Down
2 changes: 1 addition & 1 deletion contracts/sg721/schema/collection_info_response.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"image": {
"type": "string"
},
"royalty": {
"royalty_info": {
"anyOf": [
{
"$ref": "#/definitions/RoyaltyInfoResponse"
Expand Down
6 changes: 3 additions & 3 deletions contracts/sg721/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ fn query_config(deps: Deps) -> StdResult<CollectionInfoResponse> {
description: info.description,
image: info.image,
external_link: info.external_link,
royalty: royalty_info_res,
royalty_info: royalty_info_res,
})
}

Expand Down Expand Up @@ -168,7 +168,7 @@ mod tests {
"https://example.com/external.html",
value.external_link.unwrap()
);
assert_eq!(None, value.royalty);
assert_eq!(None, value.royalty_info);
}

#[test]
Expand Down Expand Up @@ -206,7 +206,7 @@ mod tests {
payment_address: creator,
share: Decimal::percent(10),
}),
value.royalty
value.royalty_info
);
}
}
4 changes: 2 additions & 2 deletions contracts/sg721/src/msg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub struct RoyaltyInfoResponse {

impl RoyaltyInfoResponse {
pub fn share_validate(&self) -> Result<Decimal, ContractError> {
if self.share > Decimal::one() || self.share < Decimal::zero() {
if self.share > Decimal::one() {
return Err(ContractError::InvalidRoyalities {});
}

Expand Down Expand Up @@ -145,5 +145,5 @@ pub struct CollectionInfoResponse {
pub description: String,
pub image: String,
pub external_link: Option<String>,
pub royalty: Option<RoyaltyInfoResponse>,
pub royalty_info: Option<RoyaltyInfoResponse>,
}
34 changes: 32 additions & 2 deletions contracts/whitelist/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ pub fn execute_increase_member_limit(
member_limit: u32,
) -> Result<Response, ContractError> {
let mut config = CONFIG.load(deps.storage)?;
if config.member_limit > member_limit || member_limit > MAX_MEMBERS {
if config.member_limit >= member_limit || member_limit > MAX_MEMBERS {
return Err(ContractError::InvalidMemberLimit {
min: config.member_limit,
max: MAX_MEMBERS,
Expand Down Expand Up @@ -751,18 +751,48 @@ mod tests {
assert!(res.is_ok());

// 0 upgrade fee, fails when including a fee
// don't allow updating to the same number of memebers
let msg = ExecuteMsg::IncreaseMemberLimit(1002);
let info = mock_info(ADMIN, &[coin(1, "ustars")]);
execute(deps.as_mut(), mock_env(), info, msg).unwrap_err();

// 0 upgrade fee, fails when including a fee
let msg = ExecuteMsg::IncreaseMemberLimit(1003);
let info = mock_info(ADMIN, &[coin(1, "ustars")]);
let err = execute(deps.as_mut(), mock_env(), info, msg).unwrap_err();
assert_eq!(err.to_string(), "IncorrectCreationFee 1 < 0");

// 0 upgrade fee
let msg = ExecuteMsg::IncreaseMemberLimit(1502);
let info = mock_info(ADMIN, &[coin(0, "ustars")]);
let res = execute(deps.as_mut(), mock_env(), info, msg);
assert!(res.is_ok());

// 0 upgrade fee
let msg = ExecuteMsg::IncreaseMemberLimit(2000);
let info = mock_info(ADMIN, &[coin(0, "ustars")]);
let res = execute(deps.as_mut(), mock_env(), info, msg);
assert!(res.is_ok());

// needs upgrade fee
let msg = ExecuteMsg::IncreaseMemberLimit(2002);
let info = mock_info(ADMIN, &[coin(100_000_000, "ustars")]);
let res = execute(deps.as_mut(), mock_env(), info, msg);
assert!(res.is_ok());

// needs upgrade fee
let msg = ExecuteMsg::IncreaseMemberLimit(4002);
let info = mock_info(ADMIN, &[coin(200_000_000, "ustars")]);
let res = execute(deps.as_mut(), mock_env(), info, msg);
assert!(res.is_ok());

// over MAX_MEMBERS, Invalid member limit
let msg = ExecuteMsg::IncreaseMemberLimit(6000);
let info = mock_info(ADMIN, &[coin(400_000_000, "ustars")]);
let err = execute(deps.as_mut(), mock_env(), info, msg).unwrap_err();
assert_eq!(
err.to_string(),
"Invalid member limit. min: 1002, max: 5000, got: 6000"
"Invalid member limit. min: 4002, max: 5000, got: 6000"
);
}
}
2 changes: 1 addition & 1 deletion types/contracts/sg721/collection_info_response.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ creator: string
description: string
external_link?: (string | null)
image: string
royalty?: (RoyaltyInfoResponse | null)
royalty_info?: (RoyaltyInfoResponse | null)
[k: string]: unknown
}

0 comments on commit 6793e28

Please sign in to comment.