From 149d68eeee67a56b905c243c69b91bc91f40bfc3 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Thu, 14 Dec 2023 13:13:01 -0500 Subject: [PATCH 01/91] Add asks by renew time query --- contracts/marketplace/src/msg.rs | 7 ++++++ contracts/marketplace/src/query.rs | 36 +++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index ba4b3976..aa17273d 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -127,6 +127,13 @@ pub enum QueryMsg { start_after: Option, limit: Option, }, + /// Get all renewable Asks + #[returns(Vec)] + AsksByRenewTime { + max_time: Timestamp, + start_after: Option, + limit: Option, + }, /// Get data for a specific bid #[returns(Option)] Bid { token_id: TokenId, bidder: Bidder }, diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 26059c1e..adb9190c 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -6,7 +6,7 @@ use crate::state::{ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{to_binary, Addr, Binary, Deps, Env, Order, StdResult, Timestamp}; -use cw_storage_plus::Bound; +use cw_storage_plus::{Bound, PrefixBound}; // Query limits const DEFAULT_QUERY_LIMIT: u32 = 10; @@ -29,6 +29,16 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { start_after, limit, )?), + QueryMsg::AsksByRenewTime { + max_time, + start_after, + limit, + } => to_binary(&query_asks_by_renew_time( + deps, + max_time, + start_after, + limit, + )?), QueryMsg::AskCount {} => to_binary(&query_ask_count(deps)?), QueryMsg::Bid { token_id, bidder } => { to_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) @@ -141,6 +151,30 @@ pub fn query_asks_by_seller( .collect::>>() } +pub fn query_asks_by_renew_time( + deps: Deps, + max_time: Timestamp, + start_after: Option, + limit: Option, +) -> StdResult> { + let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT) as usize; + + let renewable_asks = asks() + .idx + .renewal_time + .prefix_range( + deps.storage, + start_after.map(|start| PrefixBound::exclusive(start.seconds())), + Some(PrefixBound::inclusive(max_time.seconds())), + Order::Ascending, + ) + .take(limit) + .map(|item| item.map(|(_, v)| v)) + .collect::>>()?; + + Ok(renewable_asks) +} + pub fn query_ask(deps: Deps, token_id: TokenId) -> StdResult> { asks().may_load(deps.storage, ask_key(&token_id)) } From 683895479c0872843a910b6f58500c3bc5d370f0 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Thu, 14 Dec 2023 13:37:11 -0500 Subject: [PATCH 02/91] Add boiler-plate around end-blocker and contract migration --- contracts/marketplace/src/execute.rs | 66 ++++++++---------- contracts/marketplace/src/helpers.rs | 22 +++++- contracts/marketplace/src/lib.rs | 1 + contracts/marketplace/src/migrate.rs | 68 +++++++++++++++++++ contracts/marketplace/src/msg.rs | 7 +- contracts/marketplace/src/state.rs | 2 + contracts/marketplace/src/sudo.rs | 37 +++++++++- contracts/marketplace/src/unit_tests.rs | 3 + .../name-minter/src/integration_tests.rs | 1 + 9 files changed, 162 insertions(+), 45 deletions(-) create mode 100644 contracts/marketplace/src/migrate.rs diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index a55f44aa..a85d3b9a 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -1,6 +1,7 @@ use std::marker::PhantomData; use crate::error::ContractError; +use crate::helpers::process_renewal; use crate::hooks::{prepare_ask_hook, prepare_bid_hook, prepare_sale_hook}; use crate::msg::{ExecuteMsg, HookAction, InstantiateMsg}; use crate::state::{ @@ -11,19 +12,20 @@ use crate::state::{ use cosmwasm_std::entry_point; use cosmwasm_std::{ coin, coins, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, - Order, StdError, StdResult, Storage, Timestamp, Uint128, WasmMsg, + Order, StdError, StdResult, Storage, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721::{Cw721ExecuteMsg, OwnerOfResponse}; use cw721_base::helpers::Cw721Contract; +use cw_storage_plus::PrefixBound; use cw_utils::{must_pay, nonpayable}; use semver::Version; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_std::{Response, SubMsg, NATIVE_DENOM}; // Version info for migration info -const CONTRACT_NAME: &str = "crates.io:sg-name-marketplace"; -const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); +pub const CONTRACT_NAME: &str = "crates.io:sg-name-marketplace"; +pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); // bps fee can not exceed 100% const MAX_FEE_BPS: u64 = 10000; @@ -44,6 +46,7 @@ pub fn instantiate( trading_fee_percent: Decimal::percent(msg.trading_fee_bps) / Uint128::from(100u128), min_price: msg.min_price, ask_interval: msg.ask_interval, + max_renewals_per_block: msg.max_renewals_per_block, }; SUDO_PARAMS.save(deps.storage, ¶ms)?; @@ -76,7 +79,7 @@ pub fn execute( } ExecuteMsg::FundRenewal { token_id } => execute_fund_renewal(deps, info, &token_id), ExecuteMsg::RefundRenewal { token_id } => execute_refund_renewal(deps, info, &token_id), - ExecuteMsg::ProcessRenewals { time } => execute_process_renewal(deps, env, time), + ExecuteMsg::ProcessRenewals { limit } => execute_process_renewal(deps, env, limit), ExecuteMsg::Setup { minter, collection } => execute_setup( deps, api.addr_validate(&minter)?, @@ -431,45 +434,30 @@ pub fn execute_refund_renewal( /// Anyone can call this to process renewals for a block and earn a reward pub fn execute_process_renewal( - _deps: DepsMut, + mut deps: DepsMut, env: Env, - time: Timestamp, + limit: u32, ) -> Result { - println!("Processing renewals at time {}", time); - - if time > env.block.time { - return Err(ContractError::CannotProcessFutureRenewal {}); + let renewable_asks = asks() + .idx + .renewal_time + .prefix_range( + deps.storage, + None, + Some(PrefixBound::inclusive(env.block.time.seconds())), + Order::Ascending, + ) + .take(limit as usize) + .map(|item| item.map(|(_, v)| v)) + .collect::>>()?; + + let mut response = Response::new(); + + for renewable_ask in renewable_asks { + response = process_renewal(deps.branch(), &env, renewable_ask, response)?; } - // // TODO: add renewal processing logic - // let renewal_queue = RENEWAL_QUEUE.load(deps.storage, time)?; - // for name in renewal_queue.iter() { - // let ask = asks().load(deps.storage, ask_key(name))?; - // if ask.renewal_fund.is_zero() { - // continue; - // // transfer ownership to name service - // // list in marketplace for 0.5% of bid price - // // if no bids, list for original price - // } - - // // charge renewal fee - // // pay out reward to operator - // // reset ask - - // // Update Ask with new renewal_time - // let renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); - // let ask = Ask { - // token_id: name.to_string(), - // id: ask.id, - // seller: ask.seller, - // renewal_time, - // renewal_fund: ask.renewal_fund - payment, // validate payment - // }; - // store_ask(deps.storage, &ask)?; - // } - - let event = Event::new("process-renewal").add_attribute("time", time.to_string()); - Ok(Response::new().add_event(event)) + Ok(response) } /// Transfers funds and NFT, updates bid diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index bed1074f..55c96c07 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -1,12 +1,14 @@ use crate::{ msg::{ExecuteMsg, QueryMsg}, - state::Bid, + state::{Ask, Bid}, + ContractError, }; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_binary, Addr, QuerierWrapper, QueryRequest, StdError, StdResult, WasmMsg, WasmQuery, + ensure, to_binary, Addr, DepsMut, Env, QuerierWrapper, QueryRequest, StdError, StdResult, + WasmMsg, WasmQuery, }; -use sg_std::CosmosMsg; +use sg_std::{CosmosMsg, Response}; /// MarketplaceContract is a wrapper around Addr that provides a lot of helpers #[cw_serde] @@ -69,3 +71,17 @@ impl NameMarketplaceContract { }) } } + +pub fn process_renewal( + deps: DepsMut, + env: &Env, + ask: Ask, + response: Response, +) -> Result { + ensure!( + ask.renewal_time.seconds() <= env.block.time.seconds(), + ContractError::CannotProcessFutureRenewal {} + ); + + Ok(Response::new()) +} diff --git a/contracts/marketplace/src/lib.rs b/contracts/marketplace/src/lib.rs index f3747155..465ca723 100644 --- a/contracts/marketplace/src/lib.rs +++ b/contracts/marketplace/src/lib.rs @@ -2,6 +2,7 @@ mod error; pub mod execute; mod helpers; pub mod hooks; +pub mod migrate; pub mod msg; pub mod query; pub mod state; diff --git a/contracts/marketplace/src/migrate.rs b/contracts/marketplace/src/migrate.rs new file mode 100644 index 00000000..aec1f144 --- /dev/null +++ b/contracts/marketplace/src/migrate.rs @@ -0,0 +1,68 @@ +use crate::{ + error::ContractError, + execute::{CONTRACT_NAME, CONTRACT_VERSION}, + state::{SudoParams, SUDO_PARAMS}, +}; + +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{ensure, Decimal, DepsMut, Env, Event, StdError, Uint128}; +use cw_storage_plus::Item; +use sg_std::Response; + +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; + +#[cw_serde] +pub struct SudoParamsV1_2 { + /// Fair Burn + Community Pool fee for winning bids + pub trading_fee_percent: Decimal, + /// Min value for a bid + pub min_price: Uint128, + /// Interval to rate limit setting asks (in seconds) + pub ask_interval: u64, +} + +pub const SUDO_PARAMS_V1_2: Item = Item::new("sudo-params"); + +#[cw_serde] +pub struct MigrateMsg { + max_renewals_per_block: u64, +} + +#[cfg_attr(not(feature = "library"), entry_point)] +#[allow(clippy::cmp_owned)] +pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { + let prev_contract_version = cw2::get_contract_version(deps.storage)?; + + let valid_contract_names = vec![CONTRACT_NAME.to_string()]; + ensure!( + valid_contract_names.contains(&prev_contract_version.contract), + StdError::generic_err("Invalid contract name for migration") + ); + + ensure!( + prev_contract_version.version < CONTRACT_VERSION.to_string(), + StdError::generic_err("Must upgrade contract version") + ); + + let sudo_params_v1_2 = SUDO_PARAMS_V1_2.load(deps.storage)?; + let sudo_params = SudoParams { + trading_fee_percent: sudo_params_v1_2.trading_fee_percent, + min_price: sudo_params_v1_2.min_price, + ask_interval: sudo_params_v1_2.ask_interval, + max_renewals_per_block: msg.max_renewals_per_block, + }; + SUDO_PARAMS.save(deps.storage, &sudo_params)?; + + cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + + let response = Response::new().add_event( + Event::new("migrate") + .add_attribute("from_name", prev_contract_version.contract) + .add_attribute("from_version", prev_contract_version.version) + .add_attribute("to_name", CONTRACT_NAME) + .add_attribute("to_version", CONTRACT_VERSION), + ); + + Ok(response) +} diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index aa17273d..8bee348a 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -12,6 +12,8 @@ pub struct InstantiateMsg { pub min_price: Uint128, /// Interval to rate limit setting asks (in seconds) pub ask_interval: u64, + /// The maximum number of renewals that can be processed in each block + pub max_renewals_per_block: u64, } #[cw_serde] @@ -37,7 +39,7 @@ pub enum ExecuteMsg { RefundRenewal { token_id: TokenId }, /// Check if expired names have been paid for, and collect fees. /// If not paid, transfer ownership to the highest bidder. - ProcessRenewals { time: Timestamp }, + ProcessRenewals { limit: u32 }, /// Setup contract with minter and collection addresses /// Can only be run once Setup { minter: String, collection: String }, @@ -68,6 +70,9 @@ pub enum SudoMsg { AddSaleHook { hook: String }, /// Remove a trade hook RemoveSaleHook { hook: String }, + /// Is called by x/cron module EndBlocker, + /// and is used to process name renewals. + EndBlock {}, } pub type Collection = String; diff --git a/contracts/marketplace/src/state.rs b/contracts/marketplace/src/state.rs index 31d39a24..643891e1 100644 --- a/contracts/marketplace/src/state.rs +++ b/contracts/marketplace/src/state.rs @@ -12,6 +12,8 @@ pub struct SudoParams { pub min_price: Uint128, /// Interval to rate limit setting asks (in seconds) pub ask_interval: u64, + /// The maximum number of renewals that can be processed in each block + pub max_renewals_per_block: u64, } pub const SUDO_PARAMS: Item = Item::new("sudo-params"); diff --git a/contracts/marketplace/src/sudo.rs b/contracts/marketplace/src/sudo.rs index e224b844..1074a9fe 100644 --- a/contracts/marketplace/src/sudo.rs +++ b/contracts/marketplace/src/sudo.rs @@ -1,9 +1,13 @@ use crate::error::ContractError; +use crate::helpers::process_renewal; use crate::msg::SudoMsg; -use crate::state::{ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, SALE_HOOKS, SUDO_PARAMS}; +use crate::state::{ + asks, Ask, ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, SALE_HOOKS, SUDO_PARAMS, +}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{Addr, Decimal, DepsMut, Env, Event, Uint128}; +use cosmwasm_std::{Addr, Decimal, DepsMut, Env, Event, Order, StdResult, Uint128}; +use cw_storage_plus::PrefixBound; use sg_std::Response; // bps fee can not exceed 100% @@ -45,6 +49,7 @@ pub fn sudo(deps: DepsMut, env: Env, msg: SudoMsg) -> Result { sudo_update_name_minter(deps, api.addr_validate(&minter)?) } + SudoMsg::EndBlock {} => sudo_end_block(deps, env), } } @@ -144,3 +149,31 @@ pub fn sudo_remove_bid_hook(deps: DepsMut, hook: Addr) -> Result Result { + let sudo_params = SUDO_PARAMS.load(deps.storage)?; + + let mut response = Response::new(); + + let renewable_asks = asks() + .idx + .renewal_time + .prefix_range( + deps.storage, + None, + Some(PrefixBound::inclusive(env.block.time.seconds())), + Order::Ascending, + ) + .take(sudo_params.max_renewals_per_block as usize) + .map(|item| item.map(|(_, v)| v)) + .collect::>>()?; + + response = response + .add_event(Event::new("sudo-end-block").add_attribute("action", "process-name-renewals")); + + for renewable_ask in renewable_asks { + response = process_renewal(deps.branch(), &env, renewable_ask, response)?; + } + + Ok(response) +} diff --git a/contracts/marketplace/src/unit_tests.rs b/contracts/marketplace/src/unit_tests.rs index a90c9556..92433e73 100644 --- a/contracts/marketplace/src/unit_tests.rs +++ b/contracts/marketplace/src/unit_tests.rs @@ -90,6 +90,7 @@ fn setup_contract(deps: DepsMut) { trading_fee_bps: TRADING_FEE_BASIS_POINTS, min_price: Uint128::from(5u128), ask_interval: 60, + max_renewals_per_block: 20, }; let info = mock_info(CREATOR, &[]); let res = instantiate(deps, mock_env(), info, msg).unwrap(); @@ -104,6 +105,7 @@ fn proper_initialization() { trading_fee_bps: TRADING_FEE_BASIS_POINTS, min_price: Uint128::from(5u128), ask_interval: 60, + max_renewals_per_block: 20, }; let info = mock_info("creator", &coins(1000, NATIVE_DENOM)); @@ -121,6 +123,7 @@ fn bad_fees_initialization() { trading_fee_bps: 10001, min_price: Uint128::from(5u128), ask_interval: 60, + max_renewals_per_block: 20, }; let info = mock_info("creator", &coins(1000, NATIVE_DENOM)); let res = instantiate(deps.as_mut(), mock_env(), info, msg); diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 97e64a27..74ba95c0 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -122,6 +122,7 @@ fn instantiate_contracts( trading_fee_bps: TRADING_FEE_BPS, min_price: Uint128::from(5u128), ask_interval: 60, + max_renewals_per_block: 20, }; let marketplace = app .instantiate_contract( From fcfb3840ed2847ca9cce930dd76174d7cab5a463 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Fri, 15 Dec 2023 13:06:52 -0500 Subject: [PATCH 03/91] First pass at process renewal logic --- Cargo.lock | 3 +- Cargo.toml | 1 + contracts/marketplace/Cargo.toml | 3 +- contracts/marketplace/src/execute.rs | 29 ++- contracts/marketplace/src/helpers.rs | 174 +++++++++++++++++- contracts/marketplace/src/migrate.rs | 8 +- contracts/marketplace/src/msg.rs | 11 +- contracts/marketplace/src/state.rs | 9 +- contracts/marketplace/src/sudo.rs | 20 +- contracts/marketplace/src/unit_tests.rs | 13 +- .../name-minter/src/integration_tests.rs | 5 + 11 files changed, 257 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e3b77bd..f91db7bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -547,11 +547,12 @@ dependencies = [ "serde", "sg-controllers", "sg-multi-test", + "sg-name", "sg-name-common", + "sg-name-minter", "sg-std", "sg1", "sg721", - "sg721-name", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 9c490453..e6fd2b9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ sg-name-common = { version = "1.2.5", path = "./packages/sg-name-common" } sg721-name = { version = "1.2.5", path = "./contracts/sg721-name" } sg-name = { version = "1.2.5", path = "./packages/sg-name" } sg-name-market = { version = "1.2.5", path = "./packages/sg-name-market" } +sg-name-minter = { version = "1.2.5", path = "./packages/sg-name-minter" } name-marketplace = { version = "1.2.5", path = "./contracts/marketplace", features = [ "library", ] } diff --git a/contracts/marketplace/Cargo.toml b/contracts/marketplace/Cargo.toml index 33682d18..4d8a0f7c 100644 --- a/contracts/marketplace/Cargo.toml +++ b/contracts/marketplace/Cargo.toml @@ -42,9 +42,10 @@ sg-name-common = { workspace = true } sg-std = { workspace = true } sg1 = { workspace = true } thiserror = { workspace = true } +sg-name = { workspace = true } +sg-name-minter = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } sg-multi-test = { workspace = true } -sg721-name = { workspace = true, features = ["library"] } sg721 = { workspace = true } diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index a85d3b9a..f2969a74 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -21,6 +21,7 @@ use cw_storage_plus::PrefixBound; use cw_utils::{must_pay, nonpayable}; use semver::Version; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; +use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; use sg_std::{Response, SubMsg, NATIVE_DENOM}; // Version info for migration info @@ -47,6 +48,9 @@ pub fn instantiate( min_price: msg.min_price, ask_interval: msg.ask_interval, max_renewals_per_block: msg.max_renewals_per_block, + valid_bid_query_limit: msg.valid_bid_query_limit, + valid_bid_seconds_delta: msg.valid_bid_seconds_delta, + renewal_bid_percentage: msg.renewal_bid_percentage, }; SUDO_PARAMS.save(deps.storage, ¶ms)?; @@ -451,17 +455,34 @@ pub fn execute_process_renewal( .map(|item| item.map(|(_, v)| v)) .collect::>>()?; + let sudo_params = SUDO_PARAMS.load(deps.storage)?; + + let name_minter = NAME_MINTER.load(deps.storage)?; + let name_minter_params = deps + .querier + .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; + + let name_collection = NAME_COLLECTION.load(deps.storage)?; + let mut response = Response::new(); for renewable_ask in renewable_asks { - response = process_renewal(deps.branch(), &env, renewable_ask, response)?; + response = process_renewal( + deps.branch(), + &env, + &sudo_params, + &name_minter_params, + &name_collection, + renewable_ask, + response, + )?; } Ok(response) } /// Transfers funds and NFT, updates bid -fn finalize_sale( +pub fn finalize_sale( deps: Deps, ask: Ask, price: Uint128, @@ -522,11 +543,11 @@ fn payout( Ok(()) } -fn store_bid(store: &mut dyn Storage, bid: &Bid) -> StdResult<()> { +pub fn store_bid(store: &mut dyn Storage, bid: &Bid) -> StdResult<()> { bids().save(store, bid_key(&bid.token_id, &bid.bidder), bid) } -fn store_ask(store: &mut dyn Storage, ask: &Ask) -> StdResult<()> { +pub fn store_ask(store: &mut dyn Storage, ask: &Ask) -> StdResult<()> { asks().save(store, ask_key(&ask.token_id), ask) } diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 55c96c07..0710b646 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -1,14 +1,21 @@ +use std::cmp::max; + use crate::{ - msg::{ExecuteMsg, QueryMsg}, - state::{Ask, Bid}, + execute::{finalize_sale, store_ask}, + hooks::prepare_ask_hook, + msg::{ExecuteMsg, HookAction, QueryMsg}, + state::{ask_key, asks, bid_key, bids, Ask, Bid, SudoParams, RENEWAL_QUEUE}, ContractError, }; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - ensure, to_binary, Addr, DepsMut, Env, QuerierWrapper, QueryRequest, StdError, StdResult, - WasmMsg, WasmQuery, + coins, ensure, to_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, + QueryRequest, StdError, StdResult, Uint128, WasmMsg, WasmQuery, }; -use sg_std::{CosmosMsg, Response}; +use cw721::Cw721ExecuteMsg; +use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; +use sg_name_minter::SudoParams as NameMinterParams; +use sg_std::{CosmosMsg, Response, NATIVE_DENOM}; /// MarketplaceContract is a wrapper around Addr that provides a lot of helpers #[cw_serde] @@ -72,16 +79,169 @@ impl NameMarketplaceContract { } } +/// Iterate over top n priced bids, if one is within the time window then it is valid +fn find_valid_bid( + deps: Deps, + env: &Env, + sudo_params: &SudoParams, +) -> Result, ContractError> { + let min_time = env.block.time.seconds() - sudo_params.valid_bid_seconds_delta; + + let bid = bids() + .idx + .price + .range(deps.storage, None, None, Order::Descending) + .take(sudo_params.valid_bid_query_limit as usize) + .filter_map(|item| { + item.map_or(None, |(_, bid)| { + if bid.created_time.seconds() >= min_time { + Some(bid) + } else { + None + } + }) + }) + .next(); + + Ok(bid) +} + +// Calculate the renewal price based on the name length +pub fn get_char_price(base_price: u128, name_len: usize) -> Uint128 { + match name_len { + 0..=2 => unreachable!("name_len should be at least 3"), + 3 => base_price * 100, + 4 => base_price * 10, + _ => base_price, + } + .into() +} + pub fn process_renewal( deps: DepsMut, env: &Env, + sudo_params: &SudoParams, + name_minter_params: &NameMinterParams, + collection: &Addr, ask: Ask, - response: Response, + mut response: Response, ) -> Result { ensure!( ask.renewal_time.seconds() <= env.block.time.seconds(), ContractError::CannotProcessFutureRenewal {} ); - Ok(Response::new()) + let mut process_renewal_event = Event::new("process-renewal") + .add_attribute("token_id", ask.token_id.to_string()) + .add_attribute("renewal_time", ask.renewal_time.seconds().to_string()); + + let valid_bid = find_valid_bid(deps.as_ref(), env, &sudo_params)?; + + // Renewal price is the max of the char based price and a percentage of highest valid bid + let renewal_char_price = + get_char_price(name_minter_params.base_price.u128(), ask.token_id.len()); + let renewal_bid_price = valid_bid.as_ref().map_or(Uint128::zero(), |bid| { + bid.amount * sudo_params.renewal_bid_percentage + }); + let renewal_price = max(renewal_char_price, renewal_bid_price); + + let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); + + // If the renewal fund is sufficient, renew it + if ask.renewal_fund > renewal_price { + // Take renewal payment + charge_fees( + &mut response, + sudo_params.trading_fee_percent, + renewal_price, + ); + + // Update renewal time + RENEWAL_QUEUE.save( + deps.storage, + (next_renewal_time.seconds(), ask.id), + &ask.token_id.to_string(), + )?; + + // Update Ask with new renewal time + let next_renewal_fund = ask.renewal_fund - renewal_price; + let ask = Ask { + token_id: ask.token_id.to_string(), + id: ask.id, + seller: ask.seller, + renewal_time: next_renewal_time, + renewal_fund: next_renewal_fund, + }; + store_ask(deps.storage, &ask)?; + + response = response.add_event(process_renewal_event); + + // Finished processing renewal, return + return Ok(response); + } + + // Renewal fund is insufficient, send it back to the owner + if !ask.renewal_fund.is_zero() { + response = response.add_message(BankMsg::Send { + to_address: ask.seller.to_string(), + amount: coins(ask.renewal_fund.u128(), NATIVE_DENOM), + }); + } + + if let Some(bid) = valid_bid { + // The renewal fund is insufficient, sell to the highest bidder + process_renewal_event = process_renewal_event.add_attribute("action", "sell"); + + // Remove accepted bid + bids().remove(deps.storage, bid_key(&ask.token_id, &bid.bidder))?; + + // Update renewal queue + RENEWAL_QUEUE.save( + deps.storage, + (next_renewal_time.seconds(), ask.id), + &ask.token_id.to_string(), + )?; + + // Transfer funds and NFT + finalize_sale( + deps.as_ref(), + ask.clone(), + bid.amount, + bid.bidder.clone(), + &mut response, + )?; + + // Update Ask with new seller and renewal time + let ask = Ask { + token_id: ask.token_id.to_string(), + id: ask.id, + seller: bid.bidder.clone(), + renewal_time: next_renewal_time, + renewal_fund: Uint128::zero(), + }; + store_ask(deps.storage, &ask)?; + } else { + // Burn name + process_renewal_event = process_renewal_event.add_attribute("action", "burn"); + + response = response.add_message(WasmMsg::Execute { + contract_addr: collection.to_string(), + msg: to_binary(&Cw721ExecuteMsg::Burn { + token_id: ask.token_id.to_string(), + })?, + funds: vec![], + }); + + // Delete ask + asks().remove(deps.storage, ask_key(&ask.token_id))?; + + let hook = prepare_ask_hook(deps.as_ref(), &ask, HookAction::Delete)?; + let event = Event::new("remove-ask").add_attribute("token_id", ask.token_id); + + response = response.add_submessages(hook).add_event(event); + } + + response = response.add_event(process_renewal_event); + + return Ok(response); } diff --git a/contracts/marketplace/src/migrate.rs b/contracts/marketplace/src/migrate.rs index aec1f144..ccbd61dc 100644 --- a/contracts/marketplace/src/migrate.rs +++ b/contracts/marketplace/src/migrate.rs @@ -26,7 +26,10 @@ pub const SUDO_PARAMS_V1_2: Item = Item::new("sudo-params"); #[cw_serde] pub struct MigrateMsg { - max_renewals_per_block: u64, + max_renewals_per_block: u32, + valid_bid_query_limit: u32, + valid_bid_seconds_delta: u64, + renewal_bid_percentage: Decimal, } #[cfg_attr(not(feature = "library"), entry_point)] @@ -51,6 +54,9 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result = Item::new("sudo-params"); diff --git a/contracts/marketplace/src/sudo.rs b/contracts/marketplace/src/sudo.rs index 1074a9fe..54173a34 100644 --- a/contracts/marketplace/src/sudo.rs +++ b/contracts/marketplace/src/sudo.rs @@ -8,6 +8,7 @@ use crate::state::{ use cosmwasm_std::entry_point; use cosmwasm_std::{Addr, Decimal, DepsMut, Env, Event, Order, StdResult, Uint128}; use cw_storage_plus::PrefixBound; +use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; use sg_std::Response; // bps fee can not exceed 100% @@ -171,8 +172,25 @@ pub fn sudo_end_block(mut deps: DepsMut, env: Env) -> Result(name_minter, &SgNameMinterQueryMsg::Params {})?; + + let name_collection = NAME_COLLECTION.load(deps.storage)?; + for renewable_ask in renewable_asks { - response = process_renewal(deps.branch(), &env, renewable_ask, response)?; + response = process_renewal( + deps.branch(), + &env, + &sudo_params, + &name_minter_params, + &name_collection, + renewable_ask, + response, + )?; } Ok(response) diff --git a/contracts/marketplace/src/unit_tests.rs b/contracts/marketplace/src/unit_tests.rs index 92433e73..ea1c34e1 100644 --- a/contracts/marketplace/src/unit_tests.rs +++ b/contracts/marketplace/src/unit_tests.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + #[cfg(test)] use crate::execute::{execute, instantiate}; use crate::msg::{ExecuteMsg, InstantiateMsg}; @@ -5,7 +7,7 @@ use crate::query::{query_asks_by_seller, query_bids_by_bidder}; use crate::state::{ask_key, asks, bid_key, bids, Ask, Bid}; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; -use cosmwasm_std::{coins, Addr, DepsMut, Timestamp, Uint128}; +use cosmwasm_std::{coins, Addr, Decimal, DepsMut, Timestamp, Uint128}; use sg_std::NATIVE_DENOM; const CREATOR: &str = "creator"; @@ -91,6 +93,9 @@ fn setup_contract(deps: DepsMut) { min_price: Uint128::from(5u128), ask_interval: 60, max_renewals_per_block: 20, + valid_bid_query_limit: 10, + valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), }; let info = mock_info(CREATOR, &[]); let res = instantiate(deps, mock_env(), info, msg).unwrap(); @@ -106,6 +111,9 @@ fn proper_initialization() { min_price: Uint128::from(5u128), ask_interval: 60, max_renewals_per_block: 20, + valid_bid_query_limit: 10, + valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), }; let info = mock_info("creator", &coins(1000, NATIVE_DENOM)); @@ -124,6 +132,9 @@ fn bad_fees_initialization() { min_price: Uint128::from(5u128), ask_interval: 60, max_renewals_per_block: 20, + valid_bid_query_limit: 10, + valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), }; let info = mock_info("creator", &coins(1000, NATIVE_DENOM)); let res = instantiate(deps.as_mut(), mock_env(), info, msg); diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 74ba95c0..c8079bc7 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use crate::contract::{execute, instantiate, reply}; use crate::msg::{ExecuteMsg, InstantiateMsg}; use crate::query::query; @@ -123,6 +125,9 @@ fn instantiate_contracts( min_price: Uint128::from(5u128), ask_interval: 60, max_renewals_per_block: 20, + valid_bid_query_limit: 10, + valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), }; let marketplace = app .instantiate_contract( From afb5716e90dd9355b4cdcec6b4b640a5be7a84f7 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Fri, 15 Dec 2023 14:05:39 -0500 Subject: [PATCH 04/91] Add renew query and execute --- contracts/marketplace/src/error.rs | 5 +- contracts/marketplace/src/execute.rs | 87 ++++++++++++++++++++++++++-- contracts/marketplace/src/helpers.rs | 39 +++++++++---- contracts/marketplace/src/msg.rs | 10 +++- contracts/marketplace/src/query.rs | 47 ++++++++++++++- 5 files changed, 168 insertions(+), 20 deletions(-) diff --git a/contracts/marketplace/src/error.rs b/contracts/marketplace/src/error.rs index 023f6ae5..c5b594a8 100644 --- a/contracts/marketplace/src/error.rs +++ b/contracts/marketplace/src/error.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{StdError, Uint128}; +use cosmwasm_std::{Coin, StdError, Uint128}; use cw_utils::PaymentError; use sg_controllers::HookError; use thiserror::Error; @@ -50,6 +50,9 @@ pub enum ContractError { #[error("CannotProcessFutureRenewal")] CannotProcessFutureRenewal {}, + #[error("InsufficientRenewalFunds: expected {expected}, actual {actual}")] + InsufficientRenewalFunds { expected: Coin, actual: Coin }, + #[error("Cannot remove ask with existing bids")] ExistingBids {}, diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index f2969a74..8d70c686 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -1,7 +1,7 @@ use std::marker::PhantomData; use crate::error::ContractError; -use crate::helpers::process_renewal; +use crate::helpers::{find_valid_bid, get_renewal_price, process_renewal}; use crate::hooks::{prepare_ask_hook, prepare_bid_hook, prepare_sale_hook}; use crate::msg::{ExecuteMsg, HookAction, InstantiateMsg}; use crate::state::{ @@ -11,14 +11,14 @@ use crate::state::{ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - coin, coins, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, - Order, StdError, StdResult, Storage, Uint128, WasmMsg, + coin, coins, ensure, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, Event, + MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721::{Cw721ExecuteMsg, OwnerOfResponse}; use cw721_base::helpers::Cw721Contract; use cw_storage_plus::PrefixBound; -use cw_utils::{must_pay, nonpayable}; +use cw_utils::{may_pay, must_pay, nonpayable}; use semver::Version; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; @@ -83,6 +83,7 @@ pub fn execute( } ExecuteMsg::FundRenewal { token_id } => execute_fund_renewal(deps, info, &token_id), ExecuteMsg::RefundRenewal { token_id } => execute_refund_renewal(deps, info, &token_id), + ExecuteMsg::Renew { token_id } => execute_renew(deps, env, info, &token_id), ExecuteMsg::ProcessRenewals { limit } => execute_process_renewal(deps, env, limit), ExecuteMsg::Setup { minter, collection } => execute_setup( deps, @@ -436,6 +437,84 @@ pub fn execute_refund_renewal( Ok(Response::new().add_event(event).add_message(msg)) } +pub fn execute_renew( + deps: DepsMut, + env: Env, + info: MessageInfo, + token_id: &str, +) -> Result { + let mut ask = asks().load(deps.storage, ask_key(&token_id))?; + let sudo_params = SUDO_PARAMS.load(deps.storage)?; + + let ask_renew_start_time = ask.renewal_time.seconds() - sudo_params.valid_bid_seconds_delta; + + ensure!( + env.block.time.seconds() >= ask_renew_start_time, + ContractError::CannotProcessFutureRenewal {} + ); + + let name_minter = NAME_MINTER.load(deps.storage)?; + let name_minter_params = deps + .querier + .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; + + let valid_bid = find_valid_bid(deps.as_ref(), &env.block.time, &sudo_params) + .map_err(|_| StdError::generic_err("failed to check for valid bids".to_string()))?; + + let renewal_price = get_renewal_price( + name_minter_params.base_price.u128(), + token_id.len(), + valid_bid.as_ref(), + sudo_params.renewal_bid_percentage, + ); + + let payment = may_pay(&info, NATIVE_DENOM)?; + + ask.renewal_fund += payment; + + ensure!( + ask.renewal_fund >= renewal_price, + ContractError::InsufficientRenewalFunds { + expected: coin(renewal_price.u128(), NATIVE_DENOM), + actual: coin(ask.renewal_fund.u128(), NATIVE_DENOM), + } + ); + + let mut response = Response::new(); + + charge_fees( + &mut response, + sudo_params.trading_fee_percent, + renewal_price, + ); + + let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); + RENEWAL_QUEUE.save( + deps.storage, + (next_renewal_time.seconds(), ask.id), + &ask.token_id.to_string(), + )?; + + // Update Ask with new renewal time + let next_renewal_fund = ask.renewal_fund - renewal_price; + let ask = Ask { + token_id: ask.token_id.to_string(), + id: ask.id, + seller: ask.seller, + renewal_time: next_renewal_time, + renewal_fund: next_renewal_fund, + }; + store_ask(deps.storage, &ask)?; + + response = response.add_event( + Event::new("renew") + .add_attribute("token_id", token_id) + .add_attribute("renewal_price", renewal_price), + ); + + Ok(response) +} + /// Anyone can call this to process renewals for a block and earn a reward pub fn execute_process_renewal( mut deps: DepsMut, diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 0710b646..51067440 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -9,8 +9,8 @@ use crate::{ }; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - coins, ensure, to_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, - QueryRequest, StdError, StdResult, Uint128, WasmMsg, WasmQuery, + coins, ensure, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Env, Event, Order, + QuerierWrapper, QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, }; use cw721::Cw721ExecuteMsg; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; @@ -80,12 +80,12 @@ impl NameMarketplaceContract { } /// Iterate over top n priced bids, if one is within the time window then it is valid -fn find_valid_bid( +pub fn find_valid_bid( deps: Deps, - env: &Env, + block_time: &Timestamp, sudo_params: &SudoParams, ) -> Result, ContractError> { - let min_time = env.block.time.seconds() - sudo_params.valid_bid_seconds_delta; + let min_time = block_time.seconds() - sudo_params.valid_bid_seconds_delta; let bid = bids() .idx @@ -117,6 +117,21 @@ pub fn get_char_price(base_price: u128, name_len: usize) -> Uint128 { .into() } +// Renewal price is the max of the char based price and a percentage of highest valid bid +pub fn get_renewal_price( + base_price: u128, + name_len: usize, + valid_bid: Option<&Bid>, + renewal_bid_percentage: Decimal, +) -> Uint128 { + let renewal_char_price = get_char_price(base_price, name_len); + let renewal_bid_price = valid_bid + .as_ref() + .map_or(Uint128::zero(), |bid| bid.amount * renewal_bid_percentage); + let renewal_price = max(renewal_char_price, renewal_bid_price); + renewal_price +} + pub fn process_renewal( deps: DepsMut, env: &Env, @@ -135,15 +150,15 @@ pub fn process_renewal( .add_attribute("token_id", ask.token_id.to_string()) .add_attribute("renewal_time", ask.renewal_time.seconds().to_string()); - let valid_bid = find_valid_bid(deps.as_ref(), env, &sudo_params)?; + let valid_bid = find_valid_bid(deps.as_ref(), &env.block.time, &sudo_params)?; // Renewal price is the max of the char based price and a percentage of highest valid bid - let renewal_char_price = - get_char_price(name_minter_params.base_price.u128(), ask.token_id.len()); - let renewal_bid_price = valid_bid.as_ref().map_or(Uint128::zero(), |bid| { - bid.amount * sudo_params.renewal_bid_percentage - }); - let renewal_price = max(renewal_char_price, renewal_bid_price); + let renewal_price = get_renewal_price( + name_minter_params.base_price.u128(), + ask.token_id.len(), + valid_bid.as_ref(), + sudo_params.renewal_bid_percentage, + ); let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index 5afb74b6..513c0557 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -1,6 +1,6 @@ use crate::state::{Ask, Bid, Id, SudoParams, TokenId}; use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_binary, Addr, Binary, Decimal, StdResult, Timestamp, Uint128}; +use cosmwasm_std::{to_binary, Addr, Binary, Coin, Decimal, StdResult, Timestamp, Uint128}; use sg_controllers::HooksResponse; #[cw_serde] @@ -44,6 +44,8 @@ pub enum ExecuteMsg { FundRenewal { token_id: TokenId }, /// Refund a renewal of a name RefundRenewal { token_id: TokenId }, + /// Fully renew a name if within the renewal period + Renew { token_id: TokenId }, /// Check if expired names have been paid for, and collect fees. /// If not paid, transfer ownership to the highest bidder. ProcessRenewals { limit: u32 }, @@ -146,6 +148,12 @@ pub enum QueryMsg { start_after: Option, limit: Option, }, + /// Get the renewal price for a specific name + #[returns(Option)] + AskRenewPrice { + current_time: Timestamp, + token_id: TokenId, + }, /// Get data for a specific bid #[returns(Option)] Bid { token_id: TokenId, bidder: Bidder }, diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index adb9190c..c8929149 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -1,12 +1,19 @@ +use crate::helpers::{find_valid_bid, get_renewal_price}; use crate::msg::{BidOffset, Bidder, ConfigResponse, QueryMsg}; use crate::state::{ ask_key, asks, bid_key, bids, Ask, AskKey, Bid, BidKey, Id, SudoParams, TokenId, ASK_COUNT, ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, SUDO_PARAMS, }; + +use cosmwasm_std::{ + coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, +}; +use cw_storage_plus::{Bound, PrefixBound}; +use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; + #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{to_binary, Addr, Binary, Deps, Env, Order, StdResult, Timestamp}; -use cw_storage_plus::{Bound, PrefixBound}; +use sg_std::NATIVE_DENOM; // Query limits const DEFAULT_QUERY_LIMIT: u32 = 10; @@ -39,6 +46,10 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { start_after, limit, )?), + QueryMsg::AskRenewPrice { + current_time, + token_id, + } => to_binary(&query_ask_renew_price(deps, current_time, token_id)?), QueryMsg::AskCount {} => to_binary(&query_ask_count(deps)?), QueryMsg::Bid { token_id, bidder } => { to_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) @@ -175,6 +186,38 @@ pub fn query_asks_by_renew_time( Ok(renewable_asks) } +pub fn query_ask_renew_price( + deps: Deps, + current_time: Timestamp, + token_id: String, +) -> StdResult> { + let ask = asks().load(deps.storage, ask_key(&token_id))?; + let sudo_params = SUDO_PARAMS.load(deps.storage)?; + + let ask_renew_start_time = ask.renewal_time.seconds() - sudo_params.valid_bid_seconds_delta; + + if current_time.seconds() < ask_renew_start_time { + return Ok(None); + } + + let name_minter = NAME_MINTER.load(deps.storage)?; + let name_minter_params = deps + .querier + .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; + + let valid_bid = find_valid_bid(deps, ¤t_time, &sudo_params) + .map_err(|_| StdError::generic_err("failed to check for valid bids".to_string()))?; + + let renewal_price = get_renewal_price( + name_minter_params.base_price.u128(), + token_id.len(), + valid_bid.as_ref(), + sudo_params.renewal_bid_percentage, + ); + + return Ok(Some(coin(renewal_price.u128(), NATIVE_DENOM))); +} + pub fn query_ask(deps: Deps, token_id: TokenId) -> StdResult> { asks().may_load(deps.storage, ask_key(&token_id)) } From 716e36f004b2cb4513479a820d1cf9589c10e783 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Mon, 18 Dec 2023 16:53:14 -0500 Subject: [PATCH 05/91] Add unit-tests to process renew logic --- contracts/marketplace/src/execute.rs | 48 +-- contracts/marketplace/src/helpers.rs | 197 +++++---- contracts/marketplace/src/lib.rs | 2 +- contracts/marketplace/src/query.rs | 10 +- contracts/marketplace/src/sudo.rs | 9 +- contracts/marketplace/src/unit_tests.rs | 36 +- contracts/name-minter/Cargo.toml | 23 +- .../name-minter/src/integration_tests.rs | 385 +++++++++++++++++- contracts/sg721-name/src/contract.rs | 53 ++- 9 files changed, 614 insertions(+), 149 deletions(-) diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 8d70c686..4f59efb1 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -1,5 +1,3 @@ -use std::marker::PhantomData; - use crate::error::ContractError; use crate::helpers::{find_valid_bid, get_renewal_price, process_renewal}; use crate::hooks::{prepare_ask_hook, prepare_bid_hook, prepare_sale_hook}; @@ -8,8 +6,7 @@ use crate::state::{ ask_key, asks, bid_key, bids, increment_asks, Ask, Bid, SudoParams, IS_SETUP, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SUDO_PARAMS, }; -#[cfg(not(feature = "library"))] -use cosmwasm_std::entry_point; + use cosmwasm_std::{ coin, coins, ensure, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, @@ -17,12 +14,12 @@ use cosmwasm_std::{ use cw2::set_contract_version; use cw721::{Cw721ExecuteMsg, OwnerOfResponse}; use cw721_base::helpers::Cw721Contract; -use cw_storage_plus::PrefixBound; +use cw_storage_plus::Bound; use cw_utils::{may_pay, must_pay, nonpayable}; -use semver::Version; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; use sg_std::{Response, SubMsg, NATIVE_DENOM}; +use std::marker::PhantomData; // Version info for migration info pub const CONTRACT_NAME: &str = "crates.io:sg-name-marketplace"; @@ -31,6 +28,9 @@ pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); // bps fee can not exceed 100% const MAX_FEE_BPS: u64 = 10000; +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; + #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( deps: DepsMut, @@ -443,7 +443,7 @@ pub fn execute_renew( info: MessageInfo, token_id: &str, ) -> Result { - let mut ask = asks().load(deps.storage, ask_key(&token_id))?; + let mut ask = asks().load(deps.storage, ask_key(token_id))?; let sudo_params = SUDO_PARAMS.load(deps.storage)?; let ask_renew_start_time = ask.renewal_time.seconds() - sudo_params.valid_bid_seconds_delta; @@ -524,10 +524,13 @@ pub fn execute_process_renewal( let renewable_asks = asks() .idx .renewal_time - .prefix_range( + .range( deps.storage, None, - Some(PrefixBound::inclusive(env.block.time.seconds())), + Some(Bound::exclusive(( + (env.block.time.seconds() + 1), + "".to_string(), + ))), Order::Ascending, ) .take(limit as usize) @@ -645,30 +648,3 @@ fn only_owner( Ok(res) } - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result { - let current_version = cw2::get_contract_version(deps.storage)?; - if current_version.contract != CONTRACT_NAME { - return Err(StdError::generic_err("Cannot upgrade to a different contract").into()); - } - let version: Version = current_version - .version - .parse() - .map_err(|_| StdError::generic_err("Invalid contract version"))?; - let new_version: Version = CONTRACT_VERSION - .parse() - .map_err(|_| StdError::generic_err("Invalid contract version"))?; - - if version > new_version { - return Err(StdError::generic_err("Cannot upgrade to a previous contract version").into()); - } - // if same version return - if version == new_version { - return Ok(Response::new()); - } - - // set new contract version - set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - Ok(Response::new()) -} diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 51067440..377a99d3 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -94,7 +94,7 @@ pub fn find_valid_bid( .take(sudo_params.valid_bid_query_limit as usize) .filter_map(|item| { item.map_or(None, |(_, bid)| { - if bid.created_time.seconds() >= min_time { + if bid.created_time.seconds() <= min_time { Some(bid) } else { None @@ -128,8 +128,111 @@ pub fn get_renewal_price( let renewal_bid_price = valid_bid .as_ref() .map_or(Uint128::zero(), |bid| bid.amount * renewal_bid_percentage); - let renewal_price = max(renewal_char_price, renewal_bid_price); - renewal_price + max(renewal_char_price, renewal_bid_price) +} + +fn renew_name( + deps: DepsMut, + env: &Env, + sudo_params: &SudoParams, + ask: Ask, + renewal_price: Uint128, + mut response: Response, +) -> Result { + // Take renewal payment + charge_fees( + &mut response, + sudo_params.trading_fee_percent, + renewal_price, + ); + + let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); + + // Update renewal time + RENEWAL_QUEUE.save( + deps.storage, + (next_renewal_time.seconds(), ask.id), + &ask.token_id.to_string(), + )?; + + // Update Ask with new renewal time + let next_renewal_fund = ask.renewal_fund - renewal_price; + let ask = Ask { + token_id: ask.token_id.to_string(), + id: ask.id, + seller: ask.seller, + renewal_time: next_renewal_time, + renewal_fund: next_renewal_fund, + }; + store_ask(deps.storage, &ask)?; + + Ok(response) +} + +fn sell_name( + deps: DepsMut, + env: &Env, + ask: Ask, + bid: Bid, + mut response: Response, +) -> Result { + // Remove accepted bid + bids().remove(deps.storage, bid_key(&ask.token_id, &bid.bidder))?; + + let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); + + // Update renewal queue + RENEWAL_QUEUE.save( + deps.storage, + (next_renewal_time.seconds(), ask.id), + &ask.token_id.to_string(), + )?; + + // Transfer funds and NFT + finalize_sale( + deps.as_ref(), + ask.clone(), + bid.amount, + bid.bidder.clone(), + &mut response, + )?; + + // Update Ask with new seller and renewal time + let ask = Ask { + token_id: ask.token_id.to_string(), + id: ask.id, + seller: bid.bidder.clone(), + renewal_time: next_renewal_time, + renewal_fund: Uint128::zero(), + }; + store_ask(deps.storage, &ask)?; + + Ok(response) +} + +fn burn_name( + deps: DepsMut, + collection: &Addr, + ask: Ask, + mut response: Response, +) -> Result { + response = response.add_message(WasmMsg::Execute { + contract_addr: collection.to_string(), + msg: to_binary(&Cw721ExecuteMsg::Burn { + token_id: ask.token_id.to_string(), + })?, + funds: vec![], + }); + + // Delete ask + asks().remove(deps.storage, ask_key(&ask.token_id))?; + + let hook = prepare_ask_hook(deps.as_ref(), &ask, HookAction::Delete)?; + let event = Event::new("remove-ask").add_attribute("token_id", ask.token_id); + + response = response.add_submessages(hook).add_event(event); + + Ok(response) } pub fn process_renewal( @@ -150,7 +253,7 @@ pub fn process_renewal( .add_attribute("token_id", ask.token_id.to_string()) .add_attribute("renewal_time", ask.renewal_time.seconds().to_string()); - let valid_bid = find_valid_bid(deps.as_ref(), &env.block.time, &sudo_params)?; + let valid_bid = find_valid_bid(deps.as_ref(), &env.block.time, sudo_params)?; // Renewal price is the max of the char based price and a percentage of highest valid bid let renewal_price = get_renewal_price( @@ -160,39 +263,12 @@ pub fn process_renewal( sudo_params.renewal_bid_percentage, ); - let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); - // If the renewal fund is sufficient, renew it - if ask.renewal_fund > renewal_price { - // Take renewal payment - charge_fees( - &mut response, - sudo_params.trading_fee_percent, - renewal_price, - ); - - // Update renewal time - RENEWAL_QUEUE.save( - deps.storage, - (next_renewal_time.seconds(), ask.id), - &ask.token_id.to_string(), - )?; - - // Update Ask with new renewal time - let next_renewal_fund = ask.renewal_fund - renewal_price; - let ask = Ask { - token_id: ask.token_id.to_string(), - id: ask.id, - seller: ask.seller, - renewal_time: next_renewal_time, - renewal_fund: next_renewal_fund, - }; - store_ask(deps.storage, &ask)?; - + if ask.renewal_fund >= renewal_price { + process_renewal_event = process_renewal_event.add_attribute("action", "renew"); response = response.add_event(process_renewal_event); - // Finished processing renewal, return - return Ok(response); + return renew_name(deps, env, sudo_params, ask, renewal_price, response); } // Renewal fund is insufficient, send it back to the owner @@ -206,57 +282,14 @@ pub fn process_renewal( if let Some(bid) = valid_bid { // The renewal fund is insufficient, sell to the highest bidder process_renewal_event = process_renewal_event.add_attribute("action", "sell"); + response = response.add_event(process_renewal_event); - // Remove accepted bid - bids().remove(deps.storage, bid_key(&ask.token_id, &bid.bidder))?; - - // Update renewal queue - RENEWAL_QUEUE.save( - deps.storage, - (next_renewal_time.seconds(), ask.id), - &ask.token_id.to_string(), - )?; - - // Transfer funds and NFT - finalize_sale( - deps.as_ref(), - ask.clone(), - bid.amount, - bid.bidder.clone(), - &mut response, - )?; - - // Update Ask with new seller and renewal time - let ask = Ask { - token_id: ask.token_id.to_string(), - id: ask.id, - seller: bid.bidder.clone(), - renewal_time: next_renewal_time, - renewal_fund: Uint128::zero(), - }; - store_ask(deps.storage, &ask)?; + sell_name(deps, env, ask, bid, response) } else { - // Burn name + // The renewal fund is insufficient, and there is no valid bid, burn it process_renewal_event = process_renewal_event.add_attribute("action", "burn"); + response = response.add_event(process_renewal_event); - response = response.add_message(WasmMsg::Execute { - contract_addr: collection.to_string(), - msg: to_binary(&Cw721ExecuteMsg::Burn { - token_id: ask.token_id.to_string(), - })?, - funds: vec![], - }); - - // Delete ask - asks().remove(deps.storage, ask_key(&ask.token_id))?; - - let hook = prepare_ask_hook(deps.as_ref(), &ask, HookAction::Delete)?; - let event = Event::new("remove-ask").add_attribute("token_id", ask.token_id); - - response = response.add_submessages(hook).add_event(event); + burn_name(deps, collection, ask, response) } - - response = response.add_event(process_renewal_event); - - return Ok(response); } diff --git a/contracts/marketplace/src/lib.rs b/contracts/marketplace/src/lib.rs index 465ca723..64e02250 100644 --- a/contracts/marketplace/src/lib.rs +++ b/contracts/marketplace/src/lib.rs @@ -1,6 +1,6 @@ mod error; pub mod execute; -mod helpers; +pub mod helpers; pub mod hooks; pub mod migrate; pub mod msg; diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index c8929149..0c3ff72a 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -8,7 +8,7 @@ use crate::state::{ use cosmwasm_std::{ coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, }; -use cw_storage_plus::{Bound, PrefixBound}; +use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; #[cfg(not(feature = "library"))] @@ -173,10 +173,10 @@ pub fn query_asks_by_renew_time( let renewable_asks = asks() .idx .renewal_time - .prefix_range( + .range( deps.storage, - start_after.map(|start| PrefixBound::exclusive(start.seconds())), - Some(PrefixBound::inclusive(max_time.seconds())), + start_after.map(|start| Bound::inclusive((start.seconds() + 1, "".to_string()))), + Some(Bound::exclusive((max_time.seconds() + 1, "".to_string()))), Order::Ascending, ) .take(limit) @@ -215,7 +215,7 @@ pub fn query_ask_renew_price( sudo_params.renewal_bid_percentage, ); - return Ok(Some(coin(renewal_price.u128(), NATIVE_DENOM))); + Ok(Some(coin(renewal_price.u128(), NATIVE_DENOM))) } pub fn query_ask(deps: Deps, token_id: TokenId) -> StdResult> { diff --git a/contracts/marketplace/src/sudo.rs b/contracts/marketplace/src/sudo.rs index 54173a34..5836f847 100644 --- a/contracts/marketplace/src/sudo.rs +++ b/contracts/marketplace/src/sudo.rs @@ -7,7 +7,7 @@ use crate::state::{ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{Addr, Decimal, DepsMut, Env, Event, Order, StdResult, Uint128}; -use cw_storage_plus::PrefixBound; +use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; use sg_std::Response; @@ -159,10 +159,13 @@ pub fn sudo_end_block(mut deps: DepsMut, env: Env) -> Result"] -version = { workspace = true } -edition = { workspace = true } -homepage = { workspace = true } -repository = { workspace = true } -license = { workspace = true } +name = "name-minter" +authors = ["Shane Vitarana "] +version = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } exclude = [ # Those files are rust-optimizer artifacts. You might want to commit them for convenience but they should not be part of the source code publication. @@ -49,7 +49,8 @@ whitelist-updatable = { path = "../whitelist-updatable", features = [ ] } [dev-dependencies] -cw-multi-test = { workspace = true } -sg-multi-test = { workspace = true } -sg721-base = { workspace = true } -anyhow = "1" +cw-multi-test = { workspace = true } +sg-multi-test = { workspace = true } +sg721-base = { workspace = true } +name-marketplace = { workspace = true } +anyhow = "1" diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index c8079bc7..72077cd4 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -9,16 +9,22 @@ use cw721::{NumTokensResponse, OwnerOfResponse}; use cw_multi_test::{ AppResponse, BankSudo, Contract, ContractWrapper, Executor, SudoMsg as CwSudoMsg, }; +use name_marketplace::helpers::get_char_price; use name_marketplace::msg::{ ExecuteMsg as MarketplaceExecuteMsg, QueryMsg as MarketplaceQueryMsg, SudoMsg as MarketplaceSudoMsg, }; use name_marketplace::state::Bid; +use name_marketplace::{ + msg::QueryMsg as NameMarketplaceQueryMsg, state::SudoParams as NameMarketplaceParams, +}; use sg721_name::ExecuteMsg as Sg721NameExecuteMsg; use sg_multi_test::StargazeApp; use sg_name::{SgNameExecuteMsg, SgNameQueryMsg}; use sg_name_common::SECONDS_PER_YEAR; -use sg_name_minter::PUBLIC_MINT_START_TIME_IN_SECONDS; +use sg_name_minter::{ + SgNameMinterQueryMsg, SudoParams as NameMinterParams, PUBLIC_MINT_START_TIME_IN_SECONDS, +}; use sg_std::{StargazeMsgWrapper, NATIVE_DENOM}; use whitelist_updatable::msg::{ExecuteMsg as WhitelistExecuteMsg, QueryMsg as WhitelistQueryMsg}; @@ -850,6 +856,8 @@ mod admin { } mod query { + use cosmwasm_std::coin; + use cosmwasm_std::Coin; use cosmwasm_std::StdResult; use name_marketplace::msg::BidOffset; use name_marketplace::state::Ask; @@ -1032,7 +1040,7 @@ mod query { } #[test] - fn renewal_fee() { + fn renewal_fee_transfer_refund() { let mut app = instantiate_contracts(None, None, None); mint_and_list(&mut app, NAME, USER, None).unwrap(); @@ -1095,6 +1103,379 @@ mod query { assert_eq!(bob_balance, Uint128::zero()); } + #[test] + fn renew_price_no_bid() { + let mut app = instantiate_contracts(None, None, None); + + mint_and_list(&mut app, NAME, USER, None).unwrap(); + + let res: StdResult = app.wrap().query_wasm_smart( + COLLECTION, + &SgNameQueryMsg::Name { + address: USER.to_string(), + }, + ); + assert!(res.is_err()); + + let renewal_price = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewPrice { + current_time: app.block_info().time, + token_id: NAME.to_string(), + }, + ); + assert!(renewal_price.is_ok()); + assert!(renewal_price.unwrap().is_none()); + + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 30)); + + let renewal_price = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewPrice { + current_time: app.block_info().time, + token_id: NAME.to_string(), + }, + ); + assert!(renewal_price.is_ok()); + + let params: NameMinterParams = app + .wrap() + .query_wasm_smart(MINTER, &SgNameMinterQueryMsg::Params {}) + .unwrap(); + + let char_price = get_char_price(params.base_price.u128(), NAME.len()); + + println!("char_price: {}", char_price); + + assert_eq!(renewal_price.unwrap().unwrap().amount, char_price); + } + + #[test] + fn renew_price_with_bid() { + let mut app = instantiate_contracts(None, None, None); + + mint_and_list(&mut app, NAME, USER, None).unwrap(); + + // Amount to make it just above the char price + let bid_amount = 1_000_000_000u128 * 201u128; + + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 31)); + + bid(&mut app, NAME, BIDDER, bid_amount); + + update_block_time(&mut app, 60 * 60 * 24 * 31); + + let renewal_price = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewPrice { + current_time: app.block_info().time, + token_id: NAME.to_string(), + }, + ); + assert!(renewal_price.is_ok()); + + let params: NameMarketplaceParams = app + .wrap() + .query_wasm_smart(MKT, &NameMarketplaceQueryMsg::Params {}) + .unwrap(); + + let expect_price = Uint128::from(bid_amount) * params.renewal_bid_percentage; + assert_eq!(renewal_price.unwrap().unwrap().amount, expect_price); + } + + #[test] + fn renew_execute_msg() { + let mut app = instantiate_contracts(None, None, None); + + mint_and_list(&mut app, NAME, USER, None).unwrap(); + + // Amount to make it just above the char price + let bid_amount = 1_000_000_000u128 * 201u128; + + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 31)); + + bid(&mut app, NAME, BIDDER, bid_amount); + + update_block_time(&mut app, 60 * 60 * 24 * 10); + + let renewal_price = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewPrice { + current_time: app.block_info().time, + token_id: NAME.to_string(), + }, + ); + assert!(renewal_price.is_ok()); + + let renewal_amount = renewal_price.unwrap().unwrap().amount; + + let fund_amount = coins(renewal_amount.u128() * 100_u128, NATIVE_DENOM); + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: USER.to_string(), + amount: fund_amount.clone(), + } + })) + .map_err(|err| println!("{:?}", err)) + .ok(); + + let result = app.execute_contract( + Addr::unchecked(USER), + Addr::unchecked(MKT), + &MarketplaceExecuteMsg::Renew { + token_id: NAME.to_string(), + }, + &[coin(renewal_amount.u128(), NATIVE_DENOM)], + ); + assert!(result.is_ok()); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::Ask { + token_id: NAME.to_string(), + }, + ); + assert!(result.is_ok()); + let ask = result.unwrap().unwrap(); + + assert_eq!(ask.renewal_fund, Uint128::zero()); + + let expected_renewal_time = app.block_info().time.plus_seconds(SECONDS_PER_YEAR); + assert_eq!(ask.renewal_time, expected_renewal_time); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::RenewalQueue { + time: expected_renewal_time, + }, + ); + assert!(result.is_ok()); + + let asks = result.unwrap(); + assert_eq!(asks.len(), 1); + } + + #[test] + fn process_renewals_renew() { + let mut app = instantiate_contracts(None, None, None); + + mint_and_list(&mut app, NAME, USER, None).unwrap(); + + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 30)); + + let response = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewPrice { + current_time: app.block_info().time, + token_id: NAME.to_string(), + }, + ); + assert!(response.is_ok()); + let renewal_price = response.unwrap().unwrap(); + + let fund_amount = coins(renewal_price.amount.u128() * 100_u128, NATIVE_DENOM); + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: USER.to_string(), + amount: fund_amount.clone(), + } + })) + .map_err(|err| println!("{:?}", err)) + .ok(); + let result = app.execute_contract( + Addr::unchecked(USER), + Addr::unchecked(MKT), + &MarketplaceExecuteMsg::FundRenewal { + token_id: NAME.to_string(), + }, + &[coin(renewal_price.amount.u128(), NATIVE_DENOM)], + ); + assert!(result.is_ok()); + + update_block_time(&mut app, 60 * 60 * 24 * 30); + + let result = app.execute_contract( + Addr::unchecked(USER), + Addr::unchecked(MKT), + &MarketplaceExecuteMsg::ProcessRenewals { limit: 1 }, + &[], + ); + assert!(result.is_ok()); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::Ask { + token_id: NAME.to_string(), + }, + ); + assert!(result.is_ok()); + let ask = result.unwrap().unwrap(); + + assert_eq!(ask.seller, USER.to_string()); + assert_eq!(ask.renewal_fund, Uint128::zero()); + + let expected_renewal_time = app.block_info().time.plus_seconds(SECONDS_PER_YEAR); + assert_eq!(ask.renewal_time, expected_renewal_time); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::RenewalQueue { + time: expected_renewal_time, + }, + ); + assert!(result.is_ok()); + + let asks = result.unwrap(); + assert_eq!(asks.len(), 1); + } + + #[test] + fn process_renewals_sell() { + let mut app = instantiate_contracts(None, None, None); + + mint_and_list(&mut app, NAME, USER, None).unwrap(); + + // Amount to make it just above the char price + let bid_amount = 1_000_000_000u128 * 201u128; + + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 31)); + + bid(&mut app, NAME, BIDDER, bid_amount); + + update_block_time(&mut app, 60 * 60 * 24 * 31); + + let response = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewPrice { + current_time: app.block_info().time, + token_id: NAME.to_string(), + }, + ); + assert!(response.is_ok()); + let renewal_price = response.unwrap().unwrap(); + + let fund_amount = coins(renewal_price.amount.u128() * 100_u128, NATIVE_DENOM); + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: USER.to_string(), + amount: fund_amount.clone(), + } + })) + .map_err(|err| println!("{:?}", err)) + .ok(); + let result = app.execute_contract( + Addr::unchecked(USER), + Addr::unchecked(MKT), + &MarketplaceExecuteMsg::FundRenewal { + token_id: NAME.to_string(), + }, + &[coin(renewal_price.amount.u128() - 1u128, NATIVE_DENOM)], + ); + assert!(result.is_ok()); + + let user_balance_before = app + .wrap() + .query_balance(USER.to_string(), NATIVE_DENOM) + .unwrap(); + + let result = app.execute_contract( + Addr::unchecked(USER), + Addr::unchecked(MKT), + &MarketplaceExecuteMsg::ProcessRenewals { limit: 1 }, + &[], + ); + assert!(result.is_ok()); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::Ask { + token_id: NAME.to_string(), + }, + ); + assert!(result.is_ok()); + let ask = result.unwrap().unwrap(); + + assert_eq!(ask.seller, BIDDER.to_string()); + assert_eq!(ask.renewal_fund, Uint128::zero()); + + let expected_renewal_time = app.block_info().time.plus_seconds(SECONDS_PER_YEAR); + assert_eq!(ask.renewal_time, expected_renewal_time); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::RenewalQueue { + time: expected_renewal_time, + }, + ); + assert!(result.is_ok()); + + let asks = result.unwrap(); + assert_eq!(asks.len(), 1); + + let user_balance_after = app + .wrap() + .query_balance(USER.to_string(), NATIVE_DENOM) + .unwrap(); + assert!(user_balance_before.amount < user_balance_after.amount); + } + + #[test] + fn process_renewals_burn() { + let mut app = instantiate_contracts(None, None, None); + + mint_and_list(&mut app, NAME, USER, None).unwrap(); + + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 30)); + + let response = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewPrice { + current_time: app.block_info().time, + token_id: NAME.to_string(), + }, + ); + assert!(response.is_ok()); + let renewal_price = response.unwrap().unwrap(); + + let fund_amount = coins(renewal_price.amount.u128() * 100_u128, NATIVE_DENOM); + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: USER.to_string(), + amount: fund_amount.clone(), + } + })) + .map_err(|err| println!("{:?}", err)) + .ok(); + let result = app.execute_contract( + Addr::unchecked(USER), + Addr::unchecked(MKT), + &MarketplaceExecuteMsg::FundRenewal { + token_id: NAME.to_string(), + }, + &[coin(renewal_price.amount.u128() - 1u128, NATIVE_DENOM)], + ); + assert!(result.is_ok()); + + update_block_time(&mut app, 60 * 60 * 24 * 30); + + let result = app.execute_contract( + Addr::unchecked(USER), + Addr::unchecked(MKT), + &MarketplaceExecuteMsg::ProcessRenewals { limit: 1 }, + &[], + ); + assert!(result.is_ok()); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::Ask { + token_id: NAME.to_string(), + }, + ); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + #[test] fn query_name() { let mut app = instantiate_contracts(None, None, None); diff --git a/contracts/sg721-name/src/contract.rs b/contracts/sg721-name/src/contract.rs index 9bed45b7..002ed039 100644 --- a/contracts/sg721-name/src/contract.rs +++ b/contracts/sg721-name/src/contract.rs @@ -9,7 +9,7 @@ use cosmwasm_std::{ }; use cw721_base::{state::TokenInfo, MintMsg}; -use cw_utils::nonpayable; +use cw_utils::{nonpayable, Expiration}; use sg721::ExecuteMsg as Sg721ExecuteMsg; use sg721_base::ContractError::{Claimed, Unauthorized}; @@ -124,15 +124,39 @@ pub fn execute_mint( Ok(Response::new().add_event(event)) } -/// WIP Throw not implemented error pub fn execute_burn( - _deps: DepsMut, - _env: Env, + deps: DepsMut, + env: Env, info: MessageInfo, - _token_id: String, + token_id: String, ) -> Result { nonpayable(&info)?; - Err(ContractError::NotImplemented {}) + + let names_marketplace = NAME_MARKETPLACE.load(deps.storage)?; + + ensure!(info.sender == names_marketplace, Unauthorized {}); + + let sg721 = Sg721NameContract::default(); + + // Force names marketplace address as operator + sg721.operators.save( + deps.storage, + (&info.sender, &names_marketplace), + &Expiration::Never {}, + )?; + + sg721.execute( + deps, + env, + info.clone(), + Sg721ExecuteMsg::Burn { + token_id: token_id.to_string(), + }, + )?; + + let event = Event::new("burn-name").add_attribute("token_id", token_id); + + Ok(Response::new().add_event(event)) } pub fn execute_transfer_nft( @@ -143,9 +167,12 @@ pub fn execute_transfer_nft( token_id: String, ) -> Result { nonpayable(&info)?; + + let names_marketplace = NAME_MARKETPLACE.load(deps.storage)?; let recipient = deps.api.addr_validate(&recipient)?; - let update_ask_msg = _transfer_nft(deps, env, &info, &recipient, &token_id)?; + let update_ask_msg = + _transfer_nft(deps, env, &info, &recipient, &token_id, &names_marketplace)?; let event = Event::new("transfer") .add_attribute("sender", info.sender) @@ -213,6 +240,7 @@ fn _transfer_nft( info: &MessageInfo, recipient: &Addr, token_id: &str, + names_marketplace: &Addr, ) -> Result { let update_ask_msg = update_ask_on_marketplace(deps.as_ref(), token_id, recipient.clone())?; @@ -223,7 +251,16 @@ fn _transfer_nft( token_id: token_id.to_string(), }; - Sg721NameContract::default().execute(deps, env, info.clone(), msg)?; + let sg721 = Sg721NameContract::default(); + + // Force names marketplace address as operator + sg721.operators.save( + deps.storage, + (&info.sender, names_marketplace), + &Expiration::Never {}, + )?; + + sg721.execute(deps, env, info.clone(), msg)?; Ok(update_ask_msg) } From 0a082106e5efae1b66a72ee1eaae49f9306eb775 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Mon, 18 Dec 2023 17:23:03 -0500 Subject: [PATCH 06/91] Lint --- .circleci/config.yml | 36 +++++++++---------- contracts/marketplace/src/helpers.rs | 6 ++-- .../name-minter/src/integration_tests.rs | 8 ++--- contracts/sg721-name/src/contract.rs | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 494146f5..f415879b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ workflows: jobs: contract_marketplace: docker: - - image: rust:1.65.0 + - image: rust:1.68.2 working_directory: ~/project/contracts/marketplace steps: - checkout: @@ -31,7 +31,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-marketplace-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-marketplace-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -53,11 +53,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-marketplace-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-marketplace-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} contract_name-minter: docker: - - image: rust:1.65.0 + - image: rust:1.68.2 working_directory: ~/project/contracts/name-minter steps: - checkout: @@ -67,7 +67,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-name-minter-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-name-minter-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -89,11 +89,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-name-minter-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-name-minter-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} contract_sg721-name: docker: - - image: rust:1.65.0 + - image: rust:1.68.2 working_directory: ~/project/contracts/sg721-name steps: - checkout: @@ -103,7 +103,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-sg721-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-sg721-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -125,11 +125,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-sg721-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-sg721-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} package_sg-name: docker: - - image: rust:1.65.0 + - image: rust:1.68.2 working_directory: ~/project/package/sg-name steps: - checkout: @@ -139,7 +139,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-sg-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-sg-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -149,11 +149,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-sg-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-sg-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} lint: docker: - - image: rust:1.65.0 + - image: rust:1.68.2 steps: - checkout - run: @@ -161,7 +161,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-lint-rust:1.65.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-lint-rust:1.68.2-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -180,7 +180,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-lint-rust:1.65.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-lint-rust:1.68.2-{{ checksum "Cargo.lock" }} # This runs one time on the top level to ensure all contracts compile properly into wasm. # We don't run the wasm build per contract build, and then reuse a lot of the same dependencies, so this speeds up CI time @@ -188,7 +188,7 @@ jobs: # We also sanity-check the resultant wasm files. wasm-build: docker: - - image: rust:1.65.0 + - image: rust:1.68.2 steps: - checkout: path: ~/project @@ -197,7 +197,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-wasm-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-wasm-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown @@ -217,7 +217,7 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-wasm-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-wasm-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} - run: name: Check wasm contracts command: | diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 377a99d3..99d97a0a 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -152,7 +152,7 @@ fn renew_name( RENEWAL_QUEUE.save( deps.storage, (next_renewal_time.seconds(), ask.id), - &ask.token_id.to_string(), + &ask.token_id, )?; // Update Ask with new renewal time @@ -185,7 +185,7 @@ fn sell_name( RENEWAL_QUEUE.save( deps.storage, (next_renewal_time.seconds(), ask.id), - &ask.token_id.to_string(), + &ask.token_id, )?; // Transfer funds and NFT @@ -201,7 +201,7 @@ fn sell_name( let ask = Ask { token_id: ask.token_id.to_string(), id: ask.id, - seller: bid.bidder.clone(), + seller: bid.bidder, renewal_time: next_renewal_time, renewal_fund: Uint128::zero(), }; diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 72077cd4..a3ffd0a8 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1213,7 +1213,7 @@ mod query { app.sudo(CwSudoMsg::Bank({ BankSudo::Mint { to_address: USER.to_string(), - amount: fund_amount.clone(), + amount: fund_amount, } })) .map_err(|err| println!("{:?}", err)) @@ -1277,7 +1277,7 @@ mod query { app.sudo(CwSudoMsg::Bank({ BankSudo::Mint { to_address: USER.to_string(), - amount: fund_amount.clone(), + amount: fund_amount, } })) .map_err(|err| println!("{:?}", err)) @@ -1358,7 +1358,7 @@ mod query { app.sudo(CwSudoMsg::Bank({ BankSudo::Mint { to_address: USER.to_string(), - amount: fund_amount.clone(), + amount: fund_amount, } })) .map_err(|err| println!("{:?}", err)) @@ -1441,7 +1441,7 @@ mod query { app.sudo(CwSudoMsg::Bank({ BankSudo::Mint { to_address: USER.to_string(), - amount: fund_amount.clone(), + amount: fund_amount, } })) .map_err(|err| println!("{:?}", err)) diff --git a/contracts/sg721-name/src/contract.rs b/contracts/sg721-name/src/contract.rs index 002ed039..952b3763 100644 --- a/contracts/sg721-name/src/contract.rs +++ b/contracts/sg721-name/src/contract.rs @@ -148,7 +148,7 @@ pub fn execute_burn( sg721.execute( deps, env, - info.clone(), + info, Sg721ExecuteMsg::Burn { token_id: token_id.to_string(), }, From d9b0b9cc8a2d77aef3b3a21cdc15509c2ba146df Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Mon, 18 Dec 2023 17:35:06 -0500 Subject: [PATCH 07/91] Schema --- .circleci/config.yml | 2 +- .../marketplace/schema/name-marketplace.json | 274 ++++++++++++++++-- ts/src/NameMarketplace.client.ts | 80 ++++- ts/src/NameMarketplace.message-composer.ts | 38 ++- ts/src/NameMarketplace.types.ts | 37 ++- 5 files changed, 392 insertions(+), 39 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f415879b..a1e6652a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -207,7 +207,7 @@ jobs: for C in ./contracts/*/ do echo "Compiling `basename $C`..." - (cd $C && cargo build --release --lib --target wasm32-unknown-unknown --locked --lib) + (cd $C && cargo build --release --lib --target wasm32-unknown-unknown --locked) done - run: name: Install check_contract diff --git a/contracts/marketplace/schema/name-marketplace.json b/contracts/marketplace/schema/name-marketplace.json index 36187503..1cfeb5d5 100644 --- a/contracts/marketplace/schema/name-marketplace.json +++ b/contracts/marketplace/schema/name-marketplace.json @@ -8,8 +8,12 @@ "type": "object", "required": [ "ask_interval", + "max_renewals_per_block", "min_price", - "trading_fee_bps" + "renewal_bid_percentage", + "trading_fee_bps", + "valid_bid_query_limit", + "valid_bid_seconds_delta" ], "properties": { "ask_interval": { @@ -18,6 +22,12 @@ "format": "uint64", "minimum": 0.0 }, + "max_renewals_per_block": { + "description": "The maximum number of renewals that can be processed in each block", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "min_price": { "description": "Min value for bids and asks", "allOf": [ @@ -26,15 +36,39 @@ } ] }, + "renewal_bid_percentage": { + "description": "The percentage of the winning bid that must be paid to renew a name", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, "trading_fee_bps": { "description": "Community pool fee for winning bids 0.25% = 25, 0.5% = 50, 1% = 100, 2.5% = 250", "type": "integer", "format": "uint64", "minimum": 0.0 + }, + "valid_bid_query_limit": { + "description": "The number of bids to query to when searching for the highest bid", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "valid_bid_seconds_delta": { + "description": "The number of seconds before the current block time that a bid must have been created in order to be considered valid", + "type": "integer", + "format": "uint64", + "minimum": 0.0 } }, "additionalProperties": false, "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, "Uint128": { "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", "type": "string" @@ -233,6 +267,28 @@ }, "additionalProperties": false }, + { + "description": "Fully renew a name if within the renewal period", + "type": "object", + "required": [ + "renew" + ], + "properties": { + "renew": { + "type": "object", + "required": [ + "token_id" + ], + "properties": { + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Check if expired names have been paid for, and collect fees. If not paid, transfer ownership to the highest bidder.", "type": "object", @@ -243,11 +299,13 @@ "process_renewals": { "type": "object", "required": [ - "time" + "limit" ], "properties": { - "time": { - "$ref": "#/definitions/Timestamp" + "limit": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 } }, "additionalProperties": false @@ -281,21 +339,7 @@ }, "additionalProperties": false } - ], - "definitions": { - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - } - } + ] }, "query": { "$schema": "http://json-schema.org/draft-07/schema#", @@ -405,6 +449,72 @@ }, "additionalProperties": false }, + { + "description": "Get all renewable Asks", + "type": "object", + "required": [ + "asks_by_renew_time" + ], + "properties": { + "asks_by_renew_time": { + "type": "object", + "required": [ + "max_time" + ], + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "max_time": { + "$ref": "#/definitions/Timestamp" + }, + "start_after": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Get the renewal price for a specific name", + "type": "object", + "required": [ + "ask_renew_price" + ], + "properties": { + "ask_renew_price": { + "type": "object", + "required": [ + "current_time", + "token_id" + ], + "properties": { + "current_time": { + "$ref": "#/definitions/Timestamp" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Get data for a specific bid", "type": "object", @@ -862,6 +972,39 @@ }, "additionalProperties": false }, + "ask_renew_price": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Nullable_Coin", + "anyOf": [ + { + "$ref": "#/definitions/Coin" + }, + { + "type": "null" + } + ], + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, "asks": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Array_of_Ask", @@ -923,6 +1066,67 @@ } } }, + "asks_by_renew_time": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_Ask", + "type": "array", + "items": { + "$ref": "#/definitions/Ask" + }, + "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "Ask": { + "description": "Represents an ask on the marketplace", + "type": "object", + "required": [ + "id", + "renewal_fund", + "renewal_time", + "seller", + "token_id" + ], + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "renewal_fund": { + "$ref": "#/definitions/Uint128" + }, + "renewal_time": { + "$ref": "#/definitions/Timestamp" + }, + "seller": { + "$ref": "#/definitions/Addr" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, "asks_by_seller": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Array_of_Ask", @@ -1369,8 +1573,12 @@ "type": "object", "required": [ "ask_interval", + "max_renewals_per_block", "min_price", - "trading_fee_percent" + "renewal_bid_percentage", + "trading_fee_percent", + "valid_bid_query_limit", + "valid_bid_seconds_delta" ], "properties": { "ask_interval": { @@ -1379,6 +1587,12 @@ "format": "uint64", "minimum": 0.0 }, + "max_renewals_per_block": { + "description": "The maximum number of renewals that can be processed in each block", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "min_price": { "description": "Min value for a bid", "allOf": [ @@ -1387,6 +1601,14 @@ } ] }, + "renewal_bid_percentage": { + "description": "The percentage of the winning bid that must be paid to renew a name", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, "trading_fee_percent": { "description": "Fair Burn + Community Pool fee for winning bids", "allOf": [ @@ -1394,6 +1616,18 @@ "$ref": "#/definitions/Decimal" } ] + }, + "valid_bid_query_limit": { + "description": "The number of bids to query to when searching for the highest bid", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "valid_bid_seconds_delta": { + "description": "The number of seconds before the current block time that a bid must have been created in order to be considered valid", + "type": "integer", + "format": "uint64", + "minimum": 0.0 } }, "additionalProperties": false, diff --git a/ts/src/NameMarketplace.client.ts b/ts/src/NameMarketplace.client.ts index 81cbfaf5..58ebb9ce 100644 --- a/ts/src/NameMarketplace.client.ts +++ b/ts/src/NameMarketplace.client.ts @@ -5,8 +5,8 @@ */ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; -import { Coin, StdFee } from "@cosmjs/amino"; -import { Uint128, InstantiateMsg, ExecuteMsg, Timestamp, Uint64, QueryMsg, Addr, BidOffset, NullableAsk, Ask, HooksResponse, ArrayOfAsk, NullableBid, Bid, ArrayOfBid, ConfigResponse, Decimal, SudoParams } from "./NameMarketplace.types"; +import { StdFee } from "@cosmjs/amino"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, NullableCoin, Coin, ArrayOfAsk, NullableBid, Bid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceReadOnlyInterface { contractAddress: string; ask: ({ @@ -31,6 +31,22 @@ export interface NameMarketplaceReadOnlyInterface { seller: string; startAfter?: string; }) => Promise; + asksByRenewTime: ({ + limit, + maxTime, + startAfter + }: { + limit?: number; + maxTime: Timestamp; + startAfter?: Timestamp; + }) => Promise; + askRenewPrice: ({ + currentTime, + tokenId + }: { + currentTime: Timestamp; + tokenId: string; + }) => Promise; bid: ({ bidder, tokenId @@ -106,6 +122,8 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf this.asks = this.asks.bind(this); this.askCount = this.askCount.bind(this); this.asksBySeller = this.asksBySeller.bind(this); + this.asksByRenewTime = this.asksByRenewTime.bind(this); + this.askRenewPrice = this.askRenewPrice.bind(this); this.bid = this.bid.bind(this); this.bidsByBidder = this.bidsByBidder.bind(this); this.bids = this.bids.bind(this); @@ -168,6 +186,37 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf } }); }; + asksByRenewTime = async ({ + limit, + maxTime, + startAfter + }: { + limit?: number; + maxTime: Timestamp; + startAfter?: Timestamp; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + asks_by_renew_time: { + limit, + max_time: maxTime, + start_after: startAfter + } + }); + }; + askRenewPrice = async ({ + currentTime, + tokenId + }: { + currentTime: Timestamp; + tokenId: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + ask_renew_price: { + current_time: currentTime, + token_id: tokenId + } + }); + }; bid = async ({ bidder, tokenId @@ -358,10 +407,15 @@ export interface NameMarketplaceInterface extends NameMarketplaceReadOnlyInterfa }: { tokenId: string; }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; + renew: ({ + tokenId + }: { + tokenId: string; + }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; processRenewals: ({ - time + limit }: { - time: Timestamp; + limit: number; }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; setup: ({ collection, @@ -389,6 +443,7 @@ export class NameMarketplaceClient extends NameMarketplaceQueryClient implements this.acceptBid = this.acceptBid.bind(this); this.fundRenewal = this.fundRenewal.bind(this); this.refundRenewal = this.refundRenewal.bind(this); + this.renew = this.renew.bind(this); this.processRenewals = this.processRenewals.bind(this); this.setup = this.setup.bind(this); } @@ -490,14 +545,25 @@ export class NameMarketplaceClient extends NameMarketplaceQueryClient implements } }, fee, memo, funds); }; + renew = async ({ + tokenId + }: { + tokenId: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + renew: { + token_id: tokenId + } + }, fee, memo, funds); + }; processRenewals = async ({ - time + limit }: { - time: Timestamp; + limit: number; }, fee: number | StdFee | "auto" = "auto", memo?: string, funds?: Coin[]): Promise => { return await this.client.execute(this.sender, this.contractAddress, { process_renewals: { - time + limit } }, fee, memo, funds); }; diff --git a/ts/src/NameMarketplace.message-composer.ts b/ts/src/NameMarketplace.message-composer.ts index f19a1e28..5119813e 100644 --- a/ts/src/NameMarketplace.message-composer.ts +++ b/ts/src/NameMarketplace.message-composer.ts @@ -4,11 +4,10 @@ * and run the @cosmwasm/ts-codegen generate command to regenerate this file. */ -import { Coin } from "@cosmjs/amino"; import { MsgExecuteContractEncodeObject } from "cosmwasm"; import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; import { toUtf8 } from "@cosmjs/encoding"; -import { Uint128, InstantiateMsg, ExecuteMsg, Timestamp, Uint64, QueryMsg, Addr, BidOffset, NullableAsk, Ask, HooksResponse, ArrayOfAsk, NullableBid, Bid, ArrayOfBid, ConfigResponse, Decimal, SudoParams } from "./NameMarketplace.types"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, NullableCoin, Coin, ArrayOfAsk, NullableBid, Bid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceMessage { contractAddress: string; sender: string; @@ -58,10 +57,15 @@ export interface NameMarketplaceMessage { }: { tokenId: string; }, funds?: Coin[]) => MsgExecuteContractEncodeObject; + renew: ({ + tokenId + }: { + tokenId: string; + }, funds?: Coin[]) => MsgExecuteContractEncodeObject; processRenewals: ({ - time + limit }: { - time: Timestamp; + limit: number; }, funds?: Coin[]) => MsgExecuteContractEncodeObject; setup: ({ collection, @@ -86,6 +90,7 @@ export class NameMarketplaceMessageComposer implements NameMarketplaceMessage { this.acceptBid = this.acceptBid.bind(this); this.fundRenewal = this.fundRenewal.bind(this); this.refundRenewal = this.refundRenewal.bind(this); + this.renew = this.renew.bind(this); this.processRenewals = this.processRenewals.bind(this); this.setup = this.setup.bind(this); } @@ -251,10 +256,29 @@ export class NameMarketplaceMessageComposer implements NameMarketplaceMessage { }) }; }; + renew = ({ + tokenId + }: { + tokenId: string; + }, funds?: Coin[]): MsgExecuteContractEncodeObject => { + return { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: this.sender, + contract: this.contractAddress, + msg: toUtf8(JSON.stringify({ + renew: { + token_id: tokenId + } + })), + funds + }) + }; + }; processRenewals = ({ - time + limit }: { - time: Timestamp; + limit: number; }, funds?: Coin[]): MsgExecuteContractEncodeObject => { return { typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", @@ -263,7 +287,7 @@ export class NameMarketplaceMessageComposer implements NameMarketplaceMessage { contract: this.contractAddress, msg: toUtf8(JSON.stringify({ process_renewals: { - time + limit } })), funds diff --git a/ts/src/NameMarketplace.types.ts b/ts/src/NameMarketplace.types.ts index aa44495a..e69d3e29 100644 --- a/ts/src/NameMarketplace.types.ts +++ b/ts/src/NameMarketplace.types.ts @@ -5,10 +5,15 @@ */ export type Uint128 = string; +export type Decimal = string; export interface InstantiateMsg { ask_interval: number; + max_renewals_per_block: number; min_price: Uint128; + renewal_bid_percentage: Decimal; trading_fee_bps: number; + valid_bid_query_limit: number; + valid_bid_seconds_delta: number; } export type ExecuteMsg = { set_ask: { @@ -45,9 +50,13 @@ export type ExecuteMsg = { refund_renewal: { token_id: string; }; +} | { + renew: { + token_id: string; + }; } | { process_renewals: { - time: Timestamp; + limit: number; }; } | { setup: { @@ -55,8 +64,6 @@ export type ExecuteMsg = { minter: string; }; }; -export type Timestamp = Uint64; -export type Uint64 = string; export type QueryMsg = { ask: { token_id: string; @@ -74,6 +81,17 @@ export type QueryMsg = { seller: string; start_after?: string | null; }; +} | { + asks_by_renew_time: { + limit?: number | null; + max_time: Timestamp; + start_after?: Timestamp | null; + }; +} | { + ask_renew_price: { + current_time: Timestamp; + token_id: string; + }; } | { bid: { bidder: string; @@ -126,6 +144,8 @@ export type QueryMsg = { } | { config: {}; }; +export type Timestamp = Uint64; +export type Uint64 = string; export type Addr = string; export interface BidOffset { bidder: Addr; @@ -143,6 +163,12 @@ export interface Ask { export interface HooksResponse { hooks: string[]; } +export type NullableCoin = Coin | null; +export interface Coin { + amount: Uint128; + denom: string; + [k: string]: unknown; +} export type ArrayOfAsk = Ask[]; export type NullableBid = Bid | null; export interface Bid { @@ -156,9 +182,12 @@ export interface ConfigResponse { collection: Addr; minter: Addr; } -export type Decimal = string; export interface SudoParams { ask_interval: number; + max_renewals_per_block: number; min_price: Uint128; + renewal_bid_percentage: Decimal; trading_fee_percent: Decimal; + valid_bid_query_limit: number; + valid_bid_seconds_delta: number; } \ No newline at end of file From 49e765deed5ce05cab76a2d6079899faa867a162 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 19 Dec 2023 11:50:22 -0500 Subject: [PATCH 08/91] Fix CI --- .circleci/config.yml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a1e6652a..fbc2826d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ workflows: jobs: contract_marketplace: docker: - - image: rust:1.68.2 + - image: rust:1.72.1 working_directory: ~/project/contracts/marketplace steps: - checkout: @@ -31,7 +31,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-marketplace-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + - cargocache-marketplace-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -53,11 +53,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-marketplace-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-marketplace-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} contract_name-minter: docker: - - image: rust:1.68.2 + - image: rust:1.72.1 working_directory: ~/project/contracts/name-minter steps: - checkout: @@ -67,7 +67,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-name-minter-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + - cargocache-name-minter-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -89,11 +89,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-name-minter-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-name-minter-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} contract_sg721-name: docker: - - image: rust:1.68.2 + - image: rust:1.72.1 working_directory: ~/project/contracts/sg721-name steps: - checkout: @@ -103,7 +103,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-sg721-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + - cargocache-sg721-name-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -125,11 +125,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-sg721-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-sg721-name-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} package_sg-name: docker: - - image: rust:1.68.2 + - image: rust:1.72.1 working_directory: ~/project/package/sg-name steps: - checkout: @@ -139,7 +139,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-sg-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + - cargocache-sg-name-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -149,11 +149,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-sg-name-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-sg-name-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} lint: docker: - - image: rust:1.68.2 + - image: rust:1.72.1 steps: - checkout - run: @@ -161,7 +161,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-lint-rust:1.68.2-{{ checksum "Cargo.lock" }} + - cargocache-v2-lint-rust:1.72.1-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -180,7 +180,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-lint-rust:1.68.2-{{ checksum "Cargo.lock" }} + key: cargocache-v2-lint-rust:1.72.1-{{ checksum "Cargo.lock" }} # This runs one time on the top level to ensure all contracts compile properly into wasm. # We don't run the wasm build per contract build, and then reuse a lot of the same dependencies, so this speeds up CI time @@ -188,7 +188,7 @@ jobs: # We also sanity-check the resultant wasm files. wasm-build: docker: - - image: rust:1.68.2 + - image: rust:1.72.1 steps: - checkout: path: ~/project @@ -197,7 +197,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-wasm-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + - cargocache-wasm-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown @@ -212,12 +212,12 @@ jobs: - run: name: Install check_contract # Uses --debug for compilation speed - command: cargo install --debug --version 1.1.5 --features iterator --example check_contract -- cosmwasm-vm + command: cargo install --debug --version 1.3.0 --features iterator --example check_contract -- cosmwasm-vm - save_cache: paths: - /usr/local/cargo/registry - target - key: cargocache-wasm-rust:1.68.2-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-wasm-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} - run: name: Check wasm contracts command: | From 36a36bc5e681ccd0ccf19b096caee77aee503b0e Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 12:00:02 -0500 Subject: [PATCH 09/91] Work on PR suggestions --- contracts/marketplace/src/error.rs | 2 +- contracts/marketplace/src/execute.rs | 92 ++++++-------- contracts/marketplace/src/helpers.rs | 120 ++++++++++-------- contracts/marketplace/src/migrate.rs | 6 +- contracts/marketplace/src/msg.rs | 9 +- contracts/marketplace/src/query.rs | 25 ++-- contracts/marketplace/src/state.rs | 4 +- contracts/marketplace/src/unit_tests.rs | 10 +- .../name-minter/src/integration_tests.rs | 25 ++-- 9 files changed, 152 insertions(+), 141 deletions(-) diff --git a/contracts/marketplace/src/error.rs b/contracts/marketplace/src/error.rs index c5b594a8..5cde63dc 100644 --- a/contracts/marketplace/src/error.rs +++ b/contracts/marketplace/src/error.rs @@ -56,7 +56,7 @@ pub enum ContractError { #[error("Cannot remove ask with existing bids")] ExistingBids {}, - #[error("PriceTooSmall: {0}")] + #[error("PriceTooSmall: minimum {0}")] PriceTooSmall(Uint128), #[error("InvalidListingFee: {0}")] diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 4f59efb1..98908c9a 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -1,5 +1,5 @@ use crate::error::ContractError; -use crate::helpers::{find_valid_bid, get_renewal_price, process_renewal}; +use crate::helpers::{get_char_price, get_renewal_price_and_bid, process_renewal, renew_name}; use crate::hooks::{prepare_ask_hook, prepare_bid_hook, prepare_sale_hook}; use crate::msg::{ExecuteMsg, HookAction, InstantiateMsg}; use crate::state::{ @@ -8,8 +8,8 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, coins, ensure, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, Event, - MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, + coin, coins, ensure, ensure_eq, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, + Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721::{Cw721ExecuteMsg, OwnerOfResponse}; @@ -49,8 +49,9 @@ pub fn instantiate( ask_interval: msg.ask_interval, max_renewals_per_block: msg.max_renewals_per_block, valid_bid_query_limit: msg.valid_bid_query_limit, - valid_bid_seconds_delta: msg.valid_bid_seconds_delta, + renew_window: msg.renew_window, renewal_bid_percentage: msg.renewal_bid_percentage, + operator: deps.api.addr_validate(&msg.operator)?, }; SUDO_PARAMS.save(deps.storage, ¶ms)?; @@ -84,7 +85,7 @@ pub fn execute( ExecuteMsg::FundRenewal { token_id } => execute_fund_renewal(deps, info, &token_id), ExecuteMsg::RefundRenewal { token_id } => execute_refund_renewal(deps, info, &token_id), ExecuteMsg::Renew { token_id } => execute_renew(deps, env, info, &token_id), - ExecuteMsg::ProcessRenewals { limit } => execute_process_renewal(deps, env, limit), + ExecuteMsg::ProcessRenewals { limit } => execute_process_renewals(deps, env, info, limit), ExecuteMsg::Setup { minter, collection } => execute_setup( deps, api.addr_validate(&minter)?, @@ -245,15 +246,21 @@ pub fn execute_set_bid( info: MessageInfo, token_id: &str, ) -> Result { - let params = SUDO_PARAMS.load(deps.storage)?; + let name_minter = NAME_MINTER.load(deps.storage)?; + let name_minter_params = deps + .querier + .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; - let ask_key = ask_key(token_id); - asks().load(deps.storage, ask_key)?; + let ask = asks().load(deps.storage, ask_key(token_id))?; + // Ensure bid price is above char price let bid_price = must_pay(&info, NATIVE_DENOM)?; - if bid_price < params.min_price { - return Err(ContractError::PriceTooSmall(bid_price)); - } + let char_price = get_char_price(name_minter_params.base_price.u128(), ask.token_id.len()); + + ensure!( + bid_price >= char_price, + ContractError::PriceTooSmall(char_price) + ); let bidder = info.sender; let mut res = Response::new(); @@ -345,6 +352,7 @@ pub fn execute_accept_bid( bids().remove(deps.storage, bid_key)?; // Update renewal queue + RENEWAL_QUEUE.remove(deps.storage, (ask.renewal_time.seconds(), ask.id)); let renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); RENEWAL_QUEUE.save( deps.storage, @@ -446,7 +454,7 @@ pub fn execute_renew( let mut ask = asks().load(deps.storage, ask_key(token_id))?; let sudo_params = SUDO_PARAMS.load(deps.storage)?; - let ask_renew_start_time = ask.renewal_time.seconds() - sudo_params.valid_bid_seconds_delta; + let ask_renew_start_time = ask.renewal_time.seconds() - sudo_params.renew_window; ensure!( env.block.time.seconds() >= ask_renew_start_time, @@ -458,15 +466,13 @@ pub fn execute_renew( .querier .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; - let valid_bid = find_valid_bid(deps.as_ref(), &env.block.time, &sudo_params) - .map_err(|_| StdError::generic_err("failed to check for valid bids".to_string()))?; - - let renewal_price = get_renewal_price( + let (renewal_price, _valid_bid) = get_renewal_price_and_bid( + deps.as_ref(), + &env.block.time, + &sudo_params, name_minter_params.base_price.u128(), token_id.len(), - valid_bid.as_ref(), - sudo_params.renewal_bid_percentage, - ); + )?; let payment = may_pay(&info, NATIVE_DENOM)?; @@ -482,45 +488,25 @@ pub fn execute_renew( let mut response = Response::new(); - charge_fees( - &mut response, - sudo_params.trading_fee_percent, - renewal_price, - ); - - let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); - RENEWAL_QUEUE.save( - deps.storage, - (next_renewal_time.seconds(), ask.id), - &ask.token_id.to_string(), - )?; - - // Update Ask with new renewal time - let next_renewal_fund = ask.renewal_fund - renewal_price; - let ask = Ask { - token_id: ask.token_id.to_string(), - id: ask.id, - seller: ask.seller, - renewal_time: next_renewal_time, - renewal_fund: next_renewal_fund, - }; - store_ask(deps.storage, &ask)?; - - response = response.add_event( - Event::new("renew") - .add_attribute("token_id", token_id) - .add_attribute("renewal_price", renewal_price), - ); + response = renew_name(deps, &env, &sudo_params, ask, renewal_price, response)?; Ok(response) } -/// Anyone can call this to process renewals for a block and earn a reward -pub fn execute_process_renewal( +pub fn execute_process_renewals( mut deps: DepsMut, env: Env, + info: MessageInfo, limit: u32, ) -> Result { + let sudo_params = SUDO_PARAMS.load(deps.storage)?; + + ensure_eq!( + info.sender, + sudo_params.operator, + ContractError::Unauthorized {} + ); + let renewable_asks = asks() .idx .renewal_time @@ -537,8 +523,6 @@ pub fn execute_process_renewal( .map(|item| item.map(|(_, v)| v)) .collect::>>()?; - let sudo_params = SUDO_PARAMS.load(deps.storage)?; - let name_minter = NAME_MINTER.load(deps.storage)?; let name_minter_params = deps .querier @@ -594,7 +578,9 @@ pub fn finalize_sale( .add_attribute("token_id", ask.token_id.to_string()) .add_attribute("seller", ask.seller.to_string()) .add_attribute("buyer", buyer.to_string()) - .add_attribute("price", price.to_string()); + .add_attribute("price", price.to_string()) + .add_attribute("renewal_time", ask.renewal_time.to_string()); + res.events.push(event); Ok(()) diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 99d97a0a..b5bb9044 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -2,15 +2,14 @@ use std::cmp::max; use crate::{ execute::{finalize_sale, store_ask}, - hooks::prepare_ask_hook, - msg::{ExecuteMsg, HookAction, QueryMsg}, + msg::{ExecuteMsg, QueryMsg}, state::{ask_key, asks, bid_key, bids, Ask, Bid, SudoParams, RENEWAL_QUEUE}, ContractError, }; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - coins, ensure, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Env, Event, Order, - QuerierWrapper, QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, + coins, ensure, to_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, + QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, }; use cw721::Cw721ExecuteMsg; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; @@ -84,13 +83,32 @@ pub fn find_valid_bid( deps: Deps, block_time: &Timestamp, sudo_params: &SudoParams, + _min_price: Option, ) -> Result, ContractError> { - let min_time = block_time.seconds() - sudo_params.valid_bid_seconds_delta; + let min_time = block_time.seconds() - sudo_params.renew_window; let bid = bids() .idx .price - .range(deps.storage, None, None, Order::Descending) + .prefix_range(deps.storage, None, None, Order::Descending) + .take(sudo_params.valid_bid_query_limit as usize) + .filter_map(|item| { + item.map_or(None, |(_, bid)| { + if bid.created_time.seconds() <= min_time { + Some(bid) + } else { + None + } + }) + }) + .next(); + + println!("bid1: {:?}", bid); + + let bid = bids() + .idx + .price + .prefix_range(deps.storage, None, None, Order::Descending) .take(sudo_params.valid_bid_query_limit as usize) .filter_map(|item| { item.map_or(None, |(_, bid)| { @@ -118,73 +136,78 @@ pub fn get_char_price(base_price: u128, name_len: usize) -> Uint128 { } // Renewal price is the max of the char based price and a percentage of highest valid bid -pub fn get_renewal_price( +pub fn get_renewal_price_and_bid( + deps: Deps, + block_time: &Timestamp, + sudo_params: &SudoParams, base_price: u128, name_len: usize, - valid_bid: Option<&Bid>, - renewal_bid_percentage: Decimal, -) -> Uint128 { +) -> Result<(Uint128, Option), ContractError> { let renewal_char_price = get_char_price(base_price, name_len); - let renewal_bid_price = valid_bid - .as_ref() - .map_or(Uint128::zero(), |bid| bid.amount * renewal_bid_percentage); - max(renewal_char_price, renewal_bid_price) + let valid_bid = find_valid_bid(deps, block_time, sudo_params, Some(renewal_char_price))?; + + let renewal_bid_price = valid_bid.as_ref().map_or(Uint128::zero(), |bid| { + bid.amount * sudo_params.renewal_bid_percentage + }); + + let renewal_price = max(renewal_char_price, renewal_bid_price); + + Ok((renewal_price, valid_bid)) } -fn renew_name( +pub fn renew_name( deps: DepsMut, - env: &Env, + _env: &Env, sudo_params: &SudoParams, - ask: Ask, + mut ask: Ask, renewal_price: Uint128, mut response: Response, ) -> Result { // Take renewal payment + ask.renewal_fund = ask.renewal_fund - renewal_price; charge_fees( &mut response, sudo_params.trading_fee_percent, renewal_price, ); - let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); - // Update renewal time + RENEWAL_QUEUE.remove(deps.storage, (ask.renewal_time.seconds(), ask.id)); + ask.renewal_time = ask.renewal_time.plus_seconds(SECONDS_PER_YEAR); RENEWAL_QUEUE.save( deps.storage, - (next_renewal_time.seconds(), ask.id), + (ask.renewal_time.seconds(), ask.id), &ask.token_id, )?; - // Update Ask with new renewal time - let next_renewal_fund = ask.renewal_fund - renewal_price; - let ask = Ask { - token_id: ask.token_id.to_string(), - id: ask.id, - seller: ask.seller, - renewal_time: next_renewal_time, - renewal_fund: next_renewal_fund, - }; store_ask(deps.storage, &ask)?; + response = response.add_event( + Event::new("renew-name") + .add_attribute("token_id", ask.token_id.to_string()) + .add_attribute("renewal_price", renewal_price) + .add_attribute("next_renewal_time", ask.renewal_time.to_string()), + ); + Ok(response) } fn sell_name( deps: DepsMut, env: &Env, - ask: Ask, + mut ask: Ask, bid: Bid, mut response: Response, ) -> Result { // Remove accepted bid bids().remove(deps.storage, bid_key(&ask.token_id, &bid.bidder))?; - let next_renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); - - // Update renewal queue + // Update renewal time + RENEWAL_QUEUE.remove(deps.storage, (ask.renewal_time.seconds(), ask.id)); + ask.renewal_time = env.block.time.plus_seconds(SECONDS_PER_YEAR); RENEWAL_QUEUE.save( deps.storage, - (next_renewal_time.seconds(), ask.id), + (ask.renewal_time.seconds(), ask.id), &ask.token_id, )?; @@ -197,14 +220,6 @@ fn sell_name( &mut response, )?; - // Update Ask with new seller and renewal time - let ask = Ask { - token_id: ask.token_id.to_string(), - id: ask.id, - seller: bid.bidder, - renewal_time: next_renewal_time, - renewal_fund: Uint128::zero(), - }; store_ask(deps.storage, &ask)?; Ok(response) @@ -225,13 +240,9 @@ fn burn_name( }); // Delete ask + RENEWAL_QUEUE.remove(deps.storage, (ask.renewal_time.seconds(), ask.id)); asks().remove(deps.storage, ask_key(&ask.token_id))?; - let hook = prepare_ask_hook(deps.as_ref(), &ask, HookAction::Delete)?; - let event = Event::new("remove-ask").add_attribute("token_id", ask.token_id); - - response = response.add_submessages(hook).add_event(event); - Ok(response) } @@ -241,7 +252,7 @@ pub fn process_renewal( sudo_params: &SudoParams, name_minter_params: &NameMinterParams, collection: &Addr, - ask: Ask, + mut ask: Ask, mut response: Response, ) -> Result { ensure!( @@ -253,15 +264,13 @@ pub fn process_renewal( .add_attribute("token_id", ask.token_id.to_string()) .add_attribute("renewal_time", ask.renewal_time.seconds().to_string()); - let valid_bid = find_valid_bid(deps.as_ref(), &env.block.time, sudo_params)?; - - // Renewal price is the max of the char based price and a percentage of highest valid bid - let renewal_price = get_renewal_price( + let (renewal_price, valid_bid) = get_renewal_price_and_bid( + deps.as_ref(), + &env.block.time, + &sudo_params, name_minter_params.base_price.u128(), ask.token_id.len(), - valid_bid.as_ref(), - sudo_params.renewal_bid_percentage, - ); + )?; // If the renewal fund is sufficient, renew it if ask.renewal_fund >= renewal_price { @@ -277,6 +286,7 @@ pub fn process_renewal( to_address: ask.seller.to_string(), amount: coins(ask.renewal_fund.u128(), NATIVE_DENOM), }); + ask.renewal_fund = Uint128::zero(); } if let Some(bid) = valid_bid { diff --git a/contracts/marketplace/src/migrate.rs b/contracts/marketplace/src/migrate.rs index ccbd61dc..e13460e9 100644 --- a/contracts/marketplace/src/migrate.rs +++ b/contracts/marketplace/src/migrate.rs @@ -28,8 +28,9 @@ pub const SUDO_PARAMS_V1_2: Item = Item::new("sudo-params"); pub struct MigrateMsg { max_renewals_per_block: u32, valid_bid_query_limit: u32, - valid_bid_seconds_delta: u64, + renew_window: u64, renewal_bid_percentage: Decimal, + operator: String, } #[cfg_attr(not(feature = "library"), entry_point)] @@ -55,8 +56,9 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result, }, /// Get the renewal price for a specific name - #[returns(Option)] + #[returns((Option, Option))] AskRenewPrice { current_time: Timestamp, token_id: TokenId, diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 0c3ff72a..8c418afe 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -1,4 +1,4 @@ -use crate::helpers::{find_valid_bid, get_renewal_price}; +use crate::helpers::get_renewal_price_and_bid; use crate::msg::{BidOffset, Bidder, ConfigResponse, QueryMsg}; use crate::state::{ ask_key, asks, bid_key, bids, Ask, AskKey, Bid, BidKey, Id, SudoParams, TokenId, ASK_COUNT, @@ -190,14 +190,14 @@ pub fn query_ask_renew_price( deps: Deps, current_time: Timestamp, token_id: String, -) -> StdResult> { +) -> StdResult<(Option, Option)> { let ask = asks().load(deps.storage, ask_key(&token_id))?; let sudo_params = SUDO_PARAMS.load(deps.storage)?; - let ask_renew_start_time = ask.renewal_time.seconds() - sudo_params.valid_bid_seconds_delta; + let ask_renew_start_time = ask.renewal_time.seconds() - sudo_params.renew_window; if current_time.seconds() < ask_renew_start_time { - return Ok(None); + return Ok((None, None)); } let name_minter = NAME_MINTER.load(deps.storage)?; @@ -205,17 +205,16 @@ pub fn query_ask_renew_price( .querier .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; - let valid_bid = find_valid_bid(deps, ¤t_time, &sudo_params) - .map_err(|_| StdError::generic_err("failed to check for valid bids".to_string()))?; - - let renewal_price = get_renewal_price( + let (renewal_price, valid_bid) = get_renewal_price_and_bid( + deps, + ¤t_time, + &sudo_params, name_minter_params.base_price.u128(), - token_id.len(), - valid_bid.as_ref(), - sudo_params.renewal_bid_percentage, - ); + ask.token_id.len(), + ) + .map_err(|_| StdError::generic_err("failed to fetch renewal price".to_string()))?; - Ok(Some(coin(renewal_price.u128(), NATIVE_DENOM))) + Ok((Some(coin(renewal_price.u128(), NATIVE_DENOM)), valid_bid)) } pub fn query_ask(deps: Deps, token_id: TokenId) -> StdResult> { diff --git a/contracts/marketplace/src/state.rs b/contracts/marketplace/src/state.rs index 37045c0f..f3c21337 100644 --- a/contracts/marketplace/src/state.rs +++ b/contracts/marketplace/src/state.rs @@ -18,9 +18,11 @@ pub struct SudoParams { pub valid_bid_query_limit: u32, /// The number of seconds before the current block time that a /// bid must have been created in order to be considered valid - pub valid_bid_seconds_delta: u64, + pub renew_window: u64, /// The percentage of the winning bid that must be paid to renew a name pub renewal_bid_percentage: Decimal, + /// The address with permission to invoke process_renewals + pub operator: Addr, } pub const SUDO_PARAMS: Item = Item::new("sudo-params"); diff --git a/contracts/marketplace/src/unit_tests.rs b/contracts/marketplace/src/unit_tests.rs index c068ae6c..d4f3c74f 100644 --- a/contracts/marketplace/src/unit_tests.rs +++ b/contracts/marketplace/src/unit_tests.rs @@ -12,6 +12,7 @@ use cosmwasm_std::{coins, Addr, Decimal, DepsMut, Timestamp, Uint128}; use sg_std::NATIVE_DENOM; const CREATOR: &str = "creator"; +const OPERATOR: &str = "operator"; const TOKEN_ID: &str = "name"; const TOKEN_ID_NEXT: &str = "name2"; @@ -95,8 +96,9 @@ fn setup_contract(deps: DepsMut) { ask_interval: 60, max_renewals_per_block: 20, valid_bid_query_limit: 10, - valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renew_window: 60 * 60 * 24 * 30, renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), + operator: OPERATOR.to_string(), }; let info = mock_info(CREATOR, &[]); let res = instantiate(deps, mock_env(), info, msg).unwrap(); @@ -113,8 +115,9 @@ fn proper_initialization() { ask_interval: 60, max_renewals_per_block: 20, valid_bid_query_limit: 10, - valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renew_window: 60 * 60 * 24 * 30, renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), + operator: OPERATOR.to_string(), }; let info = mock_info("creator", &coins(1000, NATIVE_DENOM)); @@ -134,8 +137,9 @@ fn bad_fees_initialization() { ask_interval: 60, max_renewals_per_block: 20, valid_bid_query_limit: 10, - valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renew_window: 60 * 60 * 24 * 30, renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), + operator: OPERATOR.to_string(), }; let info = mock_info("creator", &coins(1000, NATIVE_DENOM)); let res = instantiate(deps.as_mut(), mock_env(), info, msg); diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index a3ffd0a8..a307cf79 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -82,6 +82,7 @@ const ADMIN: &str = "admin"; const ADMIN2: &str = "admin2"; const NAME: &str = "bobo"; const VERIFIER: &str = "verifier"; +const OPERATOR: &str = "operator"; const TRADING_FEE_BPS: u64 = 200; // 2% const BASE_PRICE: u128 = 100_000_000; @@ -132,8 +133,9 @@ fn instantiate_contracts( ask_interval: 60, max_renewals_per_block: 20, valid_bid_query_limit: 10, - valid_bid_seconds_delta: 60 * 60 * 24 * 30, + renew_window: 60 * 60 * 24 * 30, renewal_bid_percentage: Decimal::from_str("0.005").unwrap(), + operator: OPERATOR.to_string(), }; let marketplace = app .instantiate_contract( @@ -1263,7 +1265,7 @@ mod query { update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 30)); - let response = app.wrap().query_wasm_smart::>( + let response = app.wrap().query_wasm_smart::<(Option, Option)>( MKT, &MarketplaceQueryMsg::AskRenewPrice { current_time: app.block_info().time, @@ -1271,7 +1273,7 @@ mod query { }, ); assert!(response.is_ok()); - let renewal_price = response.unwrap().unwrap(); + let renewal_price = response.unwrap().0.unwrap(); let fund_amount = coins(renewal_price.amount.u128() * 100_u128, NATIVE_DENOM); app.sudo(CwSudoMsg::Bank({ @@ -1295,7 +1297,7 @@ mod query { update_block_time(&mut app, 60 * 60 * 24 * 30); let result = app.execute_contract( - Addr::unchecked(USER), + Addr::unchecked(OPERATOR), Addr::unchecked(MKT), &MarketplaceExecuteMsg::ProcessRenewals { limit: 1 }, &[], @@ -1344,7 +1346,7 @@ mod query { update_block_time(&mut app, 60 * 60 * 24 * 31); - let response = app.wrap().query_wasm_smart::>( + let response = app.wrap().query_wasm_smart::<(Option, Option)>( MKT, &MarketplaceQueryMsg::AskRenewPrice { current_time: app.block_info().time, @@ -1352,7 +1354,10 @@ mod query { }, ); assert!(response.is_ok()); - let renewal_price = response.unwrap().unwrap(); + let response = response.unwrap(); + + assert!(response.1.is_some()); + let renewal_price = response.0.unwrap(); let fund_amount = coins(renewal_price.amount.u128() * 100_u128, NATIVE_DENOM); app.sudo(CwSudoMsg::Bank({ @@ -1379,7 +1384,7 @@ mod query { .unwrap(); let result = app.execute_contract( - Addr::unchecked(USER), + Addr::unchecked(OPERATOR), Addr::unchecked(MKT), &MarketplaceExecuteMsg::ProcessRenewals { limit: 1 }, &[], @@ -1427,7 +1432,7 @@ mod query { update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 30)); - let response = app.wrap().query_wasm_smart::>( + let response = app.wrap().query_wasm_smart::<(Option, Option)>( MKT, &MarketplaceQueryMsg::AskRenewPrice { current_time: app.block_info().time, @@ -1435,7 +1440,7 @@ mod query { }, ); assert!(response.is_ok()); - let renewal_price = response.unwrap().unwrap(); + let renewal_price = response.unwrap().0.unwrap(); let fund_amount = coins(renewal_price.amount.u128() * 100_u128, NATIVE_DENOM); app.sudo(CwSudoMsg::Bank({ @@ -1459,7 +1464,7 @@ mod query { update_block_time(&mut app, 60 * 60 * 24 * 30); let result = app.execute_contract( - Addr::unchecked(USER), + Addr::unchecked(OPERATOR), Addr::unchecked(MKT), &MarketplaceExecuteMsg::ProcessRenewals { limit: 1 }, &[], From 3ed0b5ccd7360d2f2efab19ed6c4e9cf8036a6a3 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 12:21:03 -0500 Subject: [PATCH 10/91] Add bid migration message --- contracts/marketplace/src/execute.rs | 38 ++++++++++++++++++++++++++-- contracts/marketplace/src/msg.rs | 2 ++ contracts/marketplace/src/query.rs | 12 ++++----- contracts/marketplace/src/state.rs | 31 ++++++++++++++++++++--- 4 files changed, 72 insertions(+), 11 deletions(-) diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 98908c9a..2cc17c9c 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -3,8 +3,8 @@ use crate::helpers::{get_char_price, get_renewal_price_and_bid, process_renewal, use crate::hooks::{prepare_ask_hook, prepare_bid_hook, prepare_sale_hook}; use crate::msg::{ExecuteMsg, HookAction, InstantiateMsg}; use crate::state::{ - ask_key, asks, bid_key, bids, increment_asks, Ask, Bid, SudoParams, IS_SETUP, NAME_COLLECTION, - NAME_MINTER, RENEWAL_QUEUE, SUDO_PARAMS, + ask_key, asks, bid_key, bids, increment_asks, legacy_bids, Ask, Bid, SudoParams, IS_SETUP, + NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SUDO_PARAMS, }; use cosmwasm_std::{ @@ -82,6 +82,7 @@ pub fn execute( ExecuteMsg::AcceptBid { token_id, bidder } => { execute_accept_bid(deps, env, info, &token_id, api.addr_validate(&bidder)?) } + ExecuteMsg::MigrateBids { limit } => execute_migrate_bids(deps, env, info, limit), ExecuteMsg::FundRenewal { token_id } => execute_fund_renewal(deps, info, &token_id), ExecuteMsg::RefundRenewal { token_id } => execute_refund_renewal(deps, info, &token_id), ExecuteMsg::Renew { token_id } => execute_renew(deps, env, info, &token_id), @@ -398,6 +399,39 @@ pub fn execute_accept_bid( Ok(res.add_event(event)) } +/// Migrates bids from the old index contract to the new index +pub fn execute_migrate_bids( + deps: DepsMut, + _env: Env, + info: MessageInfo, + limit: u32, +) -> Result { + let sudo_params = SUDO_PARAMS.load(deps.storage)?; + + ensure_eq!( + info.sender, + sudo_params.operator, + ContractError::Unauthorized {} + ); + + let bids = legacy_bids() + .range(deps.storage, None, None, Order::Ascending) + .take(limit as usize) + .map(|item| item.map(|(_, b)| b)) + .collect::>>()?; + + let mut event = Event::new("migrate-bids"); + + for bid in bids { + store_bid(deps.storage, &bid)?; + legacy_bids().remove(deps.storage, bid_key(&bid.token_id, &bid.bidder))?; + + event = event.add_attribute("bid_key", format!("{:?}-{:?}", bid.token_id, bid.bidder)); + } + + Ok(Response::new().add_event(event)) +} + pub fn execute_fund_renewal( deps: DepsMut, info: MessageInfo, diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index 009d7797..5283d429 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -43,6 +43,8 @@ pub enum ExecuteMsg { RemoveBid { token_id: TokenId }, /// Accept a bid on an existing ask AcceptBid { token_id: TokenId, bidder: String }, + /// Migrate bids from the old index to the new index + MigrateBids { limit: u32 }, /// Fund renewal of a name FundRenewal { token_id: TokenId }, /// Refund a renewal of a name diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 8c418afe..4dc3f61b 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -1,8 +1,8 @@ use crate::helpers::get_renewal_price_and_bid; use crate::msg::{BidOffset, Bidder, ConfigResponse, QueryMsg}; use crate::state::{ - ask_key, asks, bid_key, bids, Ask, AskKey, Bid, BidKey, Id, SudoParams, TokenId, ASK_COUNT, - ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, SUDO_PARAMS, + ask_key, asks, bid_key, bids, Ask, AskKey, Bid, Id, SudoParams, TokenId, ASK_COUNT, ASK_HOOKS, + BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, SUDO_PARAMS, }; use cosmwasm_std::{ @@ -322,9 +322,9 @@ pub fn query_bids_sorted_by_price( ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; - let start: Option> = start_after.map(|offset| { + let start = start_after.map(|offset| { Bound::exclusive(( - offset.price.u128(), + (offset.token_id.clone(), offset.price.u128()), bid_key(&offset.token_id, &offset.bidder), )) }); @@ -345,9 +345,9 @@ pub fn reverse_query_bids_sorted_by_price( ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; - let end: Option> = start_before.map(|offset| { + let end = start_before.map(|offset| { Bound::exclusive(( - offset.price.u128(), + (offset.token_id.clone(), offset.price.u128()), bid_key(&offset.token_id, &offset.bidder), )) }); diff --git a/contracts/marketplace/src/state.rs b/contracts/marketplace/src/state.rs index f3c21337..0a4a926b 100644 --- a/contracts/marketplace/src/state.rs +++ b/contracts/marketplace/src/state.rs @@ -132,7 +132,7 @@ impl Bid { /// Primary key for bids: (token_id, bidder) pub type BidKey = (TokenId, Addr); -/// Convenience bid key constructor + pub fn bid_key(token_id: &str, bidder: &Addr) -> BidKey { (token_id.to_string(), bidder.clone()) } @@ -140,13 +140,38 @@ pub fn bid_key(token_id: &str, bidder: &Addr) -> BidKey { /// Defines indices for accessing bids #[index_list(Bid)] pub struct BidIndicies<'a> { - pub price: MultiIndex<'a, u128, Bid, BidKey>, pub bidder: MultiIndex<'a, Addr, Bid, BidKey>, - pub created_time: MultiIndex<'a, u64, Bid, BidKey>, + pub price: MultiIndex<'a, (String, u128), Bid, BidKey>, + pub created_time: MultiIndex<'a, (String, u64), Bid, BidKey>, } pub fn bids<'a>() -> IndexedMap<'a, BidKey, Bid, BidIndicies<'a>> { let indexes = BidIndicies { + bidder: MultiIndex::new(|_pk: &[u8], b: &Bid| b.bidder.clone(), "bv2", "bv2__b"), + price: MultiIndex::new( + |_pk: &[u8], b: &Bid| (b.token_id.clone(), b.amount.u128()), + "bv2", + "bv2__cp", + ), + created_time: MultiIndex::new( + |_pk: &[u8], b: &Bid| (b.token_id.clone(), b.created_time.seconds()), + "bv2", + "bv2__ct", + ), + }; + IndexedMap::new("bv2", indexes) +} + +/// Defines indices for accessing bids +#[index_list(Bid)] +pub struct LegacyBidIndices<'a> { + pub price: MultiIndex<'a, u128, Bid, BidKey>, + pub bidder: MultiIndex<'a, Addr, Bid, BidKey>, + pub created_time: MultiIndex<'a, u64, Bid, BidKey>, +} + +pub fn legacy_bids<'a>() -> IndexedMap<'a, BidKey, Bid, LegacyBidIndices<'a>> { + let indexes = LegacyBidIndices { price: MultiIndex::new( |_pk: &[u8], d: &Bid| d.amount.u128(), "bids", From 173d1f471c2d19775bc96f71cc7953205070b770 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 12:24:04 -0500 Subject: [PATCH 11/91] Schema and lint --- .../marketplace/schema/name-marketplace.json | 140 +++++++++++++++--- contracts/marketplace/src/helpers.rs | 4 +- ts/src/NameMarketplace.client.ts | 23 ++- ts/src/NameMarketplace.message-composer.ts | 27 +++- ts/src/NameMarketplace.types.ts | 16 +- 5 files changed, 179 insertions(+), 31 deletions(-) diff --git a/contracts/marketplace/schema/name-marketplace.json b/contracts/marketplace/schema/name-marketplace.json index 1cfeb5d5..3e9a0d0c 100644 --- a/contracts/marketplace/schema/name-marketplace.json +++ b/contracts/marketplace/schema/name-marketplace.json @@ -10,10 +10,11 @@ "ask_interval", "max_renewals_per_block", "min_price", + "operator", + "renew_window", "renewal_bid_percentage", "trading_fee_bps", - "valid_bid_query_limit", - "valid_bid_seconds_delta" + "valid_bid_query_limit" ], "properties": { "ask_interval": { @@ -36,6 +37,16 @@ } ] }, + "operator": { + "description": "The address with permission to invoke process_renewals", + "type": "string" + }, + "renew_window": { + "description": "The number of seconds before the current block time that a bid must have been created in order to be considered valid. Also, the number of seconds before an ask expires where it can be renewed.", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, "renewal_bid_percentage": { "description": "The percentage of the winning bid that must be paid to renew a name", "allOf": [ @@ -55,12 +66,6 @@ "type": "integer", "format": "uint32", "minimum": 0.0 - }, - "valid_bid_seconds_delta": { - "description": "The number of seconds before the current block time that a bid must have been created in order to be considered valid", - "type": "integer", - "format": "uint64", - "minimum": 0.0 } }, "additionalProperties": false, @@ -223,6 +228,30 @@ }, "additionalProperties": false }, + { + "description": "Migrate bids from the old index to the new index", + "type": "object", + "required": [ + "migrate_bids" + ], + "properties": { + "migrate_bids": { + "type": "object", + "required": [ + "limit" + ], + "properties": { + "limit": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Fund renewal of a name", "type": "object", @@ -974,16 +1003,62 @@ }, "ask_renew_price": { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Nullable_Coin", - "anyOf": [ + "title": "Tuple_of_Nullable_Coin_and_Nullable_Bid", + "type": "array", + "items": [ { - "$ref": "#/definitions/Coin" + "anyOf": [ + { + "$ref": "#/definitions/Coin" + }, + { + "type": "null" + } + ] }, { - "type": "null" + "anyOf": [ + { + "$ref": "#/definitions/Bid" + }, + { + "type": "null" + } + ] } ], + "maxItems": 2, + "minItems": 2, "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "Bid": { + "description": "Represents a bid (offer) on the marketplace", + "type": "object", + "required": [ + "amount", + "bidder", + "created_time", + "token_id" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "bidder": { + "$ref": "#/definitions/Addr" + }, + "created_time": { + "$ref": "#/definitions/Timestamp" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + }, "Coin": { "type": "object", "required": [ @@ -999,9 +1074,21 @@ } } }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, "Uint128": { "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" } } }, @@ -1575,10 +1662,11 @@ "ask_interval", "max_renewals_per_block", "min_price", + "operator", + "renew_window", "renewal_bid_percentage", "trading_fee_percent", - "valid_bid_query_limit", - "valid_bid_seconds_delta" + "valid_bid_query_limit" ], "properties": { "ask_interval": { @@ -1601,6 +1689,20 @@ } ] }, + "operator": { + "description": "The address with permission to invoke process_renewals", + "allOf": [ + { + "$ref": "#/definitions/Addr" + } + ] + }, + "renew_window": { + "description": "The number of seconds before the current block time that a bid must have been created in order to be considered valid", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, "renewal_bid_percentage": { "description": "The percentage of the winning bid that must be paid to renew a name", "allOf": [ @@ -1622,16 +1724,14 @@ "type": "integer", "format": "uint32", "minimum": 0.0 - }, - "valid_bid_seconds_delta": { - "description": "The number of seconds before the current block time that a bid must have been created in order to be considered valid", - "type": "integer", - "format": "uint64", - "minimum": 0.0 } }, "additionalProperties": false, "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, "Decimal": { "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", "type": "string" diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index b5bb9044..56ceca6f 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -164,7 +164,7 @@ pub fn renew_name( mut response: Response, ) -> Result { // Take renewal payment - ask.renewal_fund = ask.renewal_fund - renewal_price; + ask.renewal_fund -= renewal_price; charge_fees( &mut response, sudo_params.trading_fee_percent, @@ -267,7 +267,7 @@ pub fn process_renewal( let (renewal_price, valid_bid) = get_renewal_price_and_bid( deps.as_ref(), &env.block.time, - &sudo_params, + sudo_params, name_minter_params.base_price.u128(), ask.token_id.len(), )?; diff --git a/ts/src/NameMarketplace.client.ts b/ts/src/NameMarketplace.client.ts index 58ebb9ce..c1339a87 100644 --- a/ts/src/NameMarketplace.client.ts +++ b/ts/src/NameMarketplace.client.ts @@ -6,7 +6,7 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { StdFee } from "@cosmjs/amino"; -import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, NullableCoin, Coin, ArrayOfAsk, NullableBid, Bid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceReadOnlyInterface { contractAddress: string; ask: ({ @@ -46,7 +46,7 @@ export interface NameMarketplaceReadOnlyInterface { }: { currentTime: Timestamp; tokenId: string; - }) => Promise; + }) => Promise; bid: ({ bidder, tokenId @@ -209,7 +209,7 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf }: { currentTime: Timestamp; tokenId: string; - }): Promise => { + }): Promise => { return this.client.queryContractSmart(this.contractAddress, { ask_renew_price: { current_time: currentTime, @@ -397,6 +397,11 @@ export interface NameMarketplaceInterface extends NameMarketplaceReadOnlyInterfa bidder: string; tokenId: string; }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; + migrateBids: ({ + limit + }: { + limit: number; + }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; fundRenewal: ({ tokenId }: { @@ -441,6 +446,7 @@ export class NameMarketplaceClient extends NameMarketplaceQueryClient implements this.setBid = this.setBid.bind(this); this.removeBid = this.removeBid.bind(this); this.acceptBid = this.acceptBid.bind(this); + this.migrateBids = this.migrateBids.bind(this); this.fundRenewal = this.fundRenewal.bind(this); this.refundRenewal = this.refundRenewal.bind(this); this.renew = this.renew.bind(this); @@ -523,6 +529,17 @@ export class NameMarketplaceClient extends NameMarketplaceQueryClient implements } }, fee, memo, funds); }; + migrateBids = async ({ + limit + }: { + limit: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + migrate_bids: { + limit + } + }, fee, memo, funds); + }; fundRenewal = async ({ tokenId }: { diff --git a/ts/src/NameMarketplace.message-composer.ts b/ts/src/NameMarketplace.message-composer.ts index 5119813e..6e745ec7 100644 --- a/ts/src/NameMarketplace.message-composer.ts +++ b/ts/src/NameMarketplace.message-composer.ts @@ -7,7 +7,7 @@ import { MsgExecuteContractEncodeObject } from "cosmwasm"; import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; import { toUtf8 } from "@cosmjs/encoding"; -import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, NullableCoin, Coin, ArrayOfAsk, NullableBid, Bid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceMessage { contractAddress: string; sender: string; @@ -47,6 +47,11 @@ export interface NameMarketplaceMessage { bidder: string; tokenId: string; }, funds?: Coin[]) => MsgExecuteContractEncodeObject; + migrateBids: ({ + limit + }: { + limit: number; + }, funds?: Coin[]) => MsgExecuteContractEncodeObject; fundRenewal: ({ tokenId }: { @@ -88,6 +93,7 @@ export class NameMarketplaceMessageComposer implements NameMarketplaceMessage { this.setBid = this.setBid.bind(this); this.removeBid = this.removeBid.bind(this); this.acceptBid = this.acceptBid.bind(this); + this.migrateBids = this.migrateBids.bind(this); this.fundRenewal = this.fundRenewal.bind(this); this.refundRenewal = this.refundRenewal.bind(this); this.renew = this.renew.bind(this); @@ -218,6 +224,25 @@ export class NameMarketplaceMessageComposer implements NameMarketplaceMessage { }) }; }; + migrateBids = ({ + limit + }: { + limit: number; + }, funds?: Coin[]): MsgExecuteContractEncodeObject => { + return { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: this.sender, + contract: this.contractAddress, + msg: toUtf8(JSON.stringify({ + migrate_bids: { + limit + } + })), + funds + }) + }; + }; fundRenewal = ({ tokenId }: { diff --git a/ts/src/NameMarketplace.types.ts b/ts/src/NameMarketplace.types.ts index e69d3e29..fb0356c0 100644 --- a/ts/src/NameMarketplace.types.ts +++ b/ts/src/NameMarketplace.types.ts @@ -10,10 +10,11 @@ export interface InstantiateMsg { ask_interval: number; max_renewals_per_block: number; min_price: Uint128; + operator: string; + renew_window: number; renewal_bid_percentage: Decimal; trading_fee_bps: number; valid_bid_query_limit: number; - valid_bid_seconds_delta: number; } export type ExecuteMsg = { set_ask: { @@ -42,6 +43,10 @@ export type ExecuteMsg = { bidder: string; token_id: string; }; +} | { + migrate_bids: { + limit: number; + }; } | { fund_renewal: { token_id: string; @@ -163,20 +168,20 @@ export interface Ask { export interface HooksResponse { hooks: string[]; } -export type NullableCoin = Coin | null; +export type TupleOfNullable_CoinAndNullable_Bid = [Coin | null, Bid | null]; export interface Coin { amount: Uint128; denom: string; [k: string]: unknown; } -export type ArrayOfAsk = Ask[]; -export type NullableBid = Bid | null; export interface Bid { amount: Uint128; bidder: Addr; created_time: Timestamp; token_id: string; } +export type ArrayOfAsk = Ask[]; +export type NullableBid = Bid | null; export type ArrayOfBid = Bid[]; export interface ConfigResponse { collection: Addr; @@ -186,8 +191,9 @@ export interface SudoParams { ask_interval: number; max_renewals_per_block: number; min_price: Uint128; + operator: Addr; + renew_window: number; renewal_bid_percentage: Decimal; trading_fee_percent: Decimal; valid_bid_query_limit: number; - valid_bid_seconds_delta: number; } \ No newline at end of file From 4759a0921da62a75fc33af0604b0c828bf7ec7ad Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 13:12:41 -0500 Subject: [PATCH 12/91] Fix tests --- contracts/marketplace/src/execute.rs | 2 +- contracts/marketplace/src/helpers.rs | 50 ++++++++----------- contracts/marketplace/src/query.rs | 2 +- contracts/marketplace/src/state.rs | 12 ++--- .../name-minter/src/integration_tests.rs | 50 +++++++++++++------ 5 files changed, 63 insertions(+), 53 deletions(-) diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 2cc17c9c..446e11a4 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -504,8 +504,8 @@ pub fn execute_renew( deps.as_ref(), &env.block.time, &sudo_params, + &ask.token_id, name_minter_params.base_price.u128(), - token_id.len(), )?; let payment = may_pay(&info, NATIVE_DENOM)?; diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 56ceca6f..3d3f6c23 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -12,6 +12,7 @@ use cosmwasm_std::{ QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, }; use cw721::Cw721ExecuteMsg; +use cw_storage_plus::Bound; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_name_minter::SudoParams as NameMinterParams; use sg_std::{CosmosMsg, Response, NATIVE_DENOM}; @@ -83,43 +84,34 @@ pub fn find_valid_bid( deps: Deps, block_time: &Timestamp, sudo_params: &SudoParams, - _min_price: Option, + token_id: &str, + min_price: Uint128, ) -> Result, ContractError> { - let min_time = block_time.seconds() - sudo_params.renew_window; + let max_time = block_time.seconds() - sudo_params.renew_window; let bid = bids() .idx .price - .prefix_range(deps.storage, None, None, Order::Descending) + .sub_prefix(token_id.to_string()) + .range( + deps.storage, + Some(Bound::inclusive(( + min_price.u128(), + (token_id.to_string(), Addr::unchecked("")), + ))), + None, + Order::Descending, + ) .take(sudo_params.valid_bid_query_limit as usize) - .filter_map(|item| { + .find_map(|item| { item.map_or(None, |(_, bid)| { - if bid.created_time.seconds() <= min_time { + if bid.created_time.seconds() <= max_time { Some(bid) } else { None } }) - }) - .next(); - - println!("bid1: {:?}", bid); - - let bid = bids() - .idx - .price - .prefix_range(deps.storage, None, None, Order::Descending) - .take(sudo_params.valid_bid_query_limit as usize) - .filter_map(|item| { - item.map_or(None, |(_, bid)| { - if bid.created_time.seconds() <= min_time { - Some(bid) - } else { - None - } - }) - }) - .next(); + }); Ok(bid) } @@ -140,11 +132,11 @@ pub fn get_renewal_price_and_bid( deps: Deps, block_time: &Timestamp, sudo_params: &SudoParams, + token_id: &str, base_price: u128, - name_len: usize, ) -> Result<(Uint128, Option), ContractError> { - let renewal_char_price = get_char_price(base_price, name_len); - let valid_bid = find_valid_bid(deps, block_time, sudo_params, Some(renewal_char_price))?; + let renewal_char_price = get_char_price(base_price, token_id.len()); + let valid_bid = find_valid_bid(deps, block_time, sudo_params, token_id, renewal_char_price)?; let renewal_bid_price = valid_bid.as_ref().map_or(Uint128::zero(), |bid| { bid.amount * sudo_params.renewal_bid_percentage @@ -268,8 +260,8 @@ pub fn process_renewal( deps.as_ref(), &env.block.time, sudo_params, + &ask.token_id, name_minter_params.base_price.u128(), - ask.token_id.len(), )?; // If the renewal fund is sufficient, renew it diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 4dc3f61b..5bd301a7 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -209,8 +209,8 @@ pub fn query_ask_renew_price( deps, ¤t_time, &sudo_params, + &ask.token_id, name_minter_params.base_price.u128(), - ask.token_id.len(), ) .map_err(|_| StdError::generic_err("failed to fetch renewal price".to_string()))?; diff --git a/contracts/marketplace/src/state.rs b/contracts/marketplace/src/state.rs index 0a4a926b..e7ec745a 100644 --- a/contracts/marketplace/src/state.rs +++ b/contracts/marketplace/src/state.rs @@ -147,19 +147,19 @@ pub struct BidIndicies<'a> { pub fn bids<'a>() -> IndexedMap<'a, BidKey, Bid, BidIndicies<'a>> { let indexes = BidIndicies { - bidder: MultiIndex::new(|_pk: &[u8], b: &Bid| b.bidder.clone(), "bv2", "bv2__b"), + bidder: MultiIndex::new(|_pk: &[u8], b: &Bid| b.bidder.clone(), "b2", "b2__b"), price: MultiIndex::new( |_pk: &[u8], b: &Bid| (b.token_id.clone(), b.amount.u128()), - "bv2", - "bv2__cp", + "b2", + "b2__p", ), created_time: MultiIndex::new( |_pk: &[u8], b: &Bid| (b.token_id.clone(), b.created_time.seconds()), - "bv2", - "bv2__ct", + "b2", + "b2__ct", ), }; - IndexedMap::new("bv2", indexes) + IndexedMap::new("b2", indexes) } /// Defines indices for accessing bids diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index a307cf79..e40663bd 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1119,26 +1119,30 @@ mod query { ); assert!(res.is_err()); - let renewal_price = app.wrap().query_wasm_smart::>( + let result = app.wrap().query_wasm_smart::<(Option, Option)>( MKT, &MarketplaceQueryMsg::AskRenewPrice { current_time: app.block_info().time, token_id: NAME.to_string(), }, ); - assert!(renewal_price.is_ok()); - assert!(renewal_price.unwrap().is_none()); + assert!(result.is_ok()); + + let (renewal_price, _renewal_bid) = result.unwrap(); + assert!(renewal_price.is_none()); update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 30)); - let renewal_price = app.wrap().query_wasm_smart::>( + let result = app.wrap().query_wasm_smart::<(Option, Option)>( MKT, &MarketplaceQueryMsg::AskRenewPrice { current_time: app.block_info().time, token_id: NAME.to_string(), }, ); - assert!(renewal_price.is_ok()); + assert!(result.is_ok()); + + let (renewal_price, _renewal_bid) = result.unwrap(); let params: NameMinterParams = app .wrap() @@ -1149,7 +1153,7 @@ mod query { println!("char_price: {}", char_price); - assert_eq!(renewal_price.unwrap().unwrap().amount, char_price); + assert_eq!(renewal_price.unwrap().amount, char_price); } #[test] @@ -1167,14 +1171,16 @@ mod query { update_block_time(&mut app, 60 * 60 * 24 * 31); - let renewal_price = app.wrap().query_wasm_smart::>( + let result = app.wrap().query_wasm_smart::<(Option, Option)>( MKT, &MarketplaceQueryMsg::AskRenewPrice { current_time: app.block_info().time, token_id: NAME.to_string(), }, ); - assert!(renewal_price.is_ok()); + assert!(result.is_ok()); + + let (renewal_price, _renewal_bid) = result.unwrap(); let params: NameMarketplaceParams = app .wrap() @@ -1182,7 +1188,7 @@ mod query { .unwrap(); let expect_price = Uint128::from(bid_amount) * params.renewal_bid_percentage; - assert_eq!(renewal_price.unwrap().unwrap().amount, expect_price); + assert_eq!(renewal_price.unwrap().amount, expect_price); } #[test] @@ -1194,22 +1200,23 @@ mod query { // Amount to make it just above the char price let bid_amount = 1_000_000_000u128 * 201u128; - update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 31)); + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 30)); bid(&mut app, NAME, BIDDER, bid_amount); - update_block_time(&mut app, 60 * 60 * 24 * 10); + update_block_time(&mut app, 1); - let renewal_price = app.wrap().query_wasm_smart::>( + let result = app.wrap().query_wasm_smart::<(Option, Option)>( MKT, &MarketplaceQueryMsg::AskRenewPrice { current_time: app.block_info().time, token_id: NAME.to_string(), }, ); - assert!(renewal_price.is_ok()); + assert!(result.is_ok()); - let renewal_amount = renewal_price.unwrap().unwrap().amount; + let (renewal_price, _renewal_bid) = result.unwrap(); + let renewal_amount = renewal_price.unwrap().amount; let fund_amount = coins(renewal_amount.u128() * 100_u128, NATIVE_DENOM); app.sudo(CwSudoMsg::Bank({ @@ -1221,6 +1228,18 @@ mod query { .map_err(|err| println!("{:?}", err)) .ok(); + let ask = app + .wrap() + .query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::Ask { + token_id: NAME.to_string(), + }, + ) + .unwrap() + .unwrap(); + let expected_renewal_time = ask.renewal_time.plus_seconds(SECONDS_PER_YEAR); + let result = app.execute_contract( Addr::unchecked(USER), Addr::unchecked(MKT), @@ -1241,8 +1260,6 @@ mod query { let ask = result.unwrap().unwrap(); assert_eq!(ask.renewal_fund, Uint128::zero()); - - let expected_renewal_time = app.block_info().time.plus_seconds(SECONDS_PER_YEAR); assert_eq!(ask.renewal_time, expected_renewal_time); let result = app.wrap().query_wasm_smart::>( @@ -1353,6 +1370,7 @@ mod query { token_id: NAME.to_string(), }, ); + println!("xxx {:?}", response); assert!(response.is_ok()); let response = response.unwrap(); From f016aabaac5feb6ce0cb633399b9ea7a405a94d0 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 13:41:07 -0500 Subject: [PATCH 13/91] Fix CI --- .circleci/config.yml | 17 ----------------- contracts/marketplace/Cargo.toml | 5 +++++ contracts/name-minter/Cargo.toml | 5 +++++ contracts/sg721-name/Cargo.toml | 5 +++++ 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fbc2826d..b7ee57ee 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -209,23 +209,6 @@ jobs: echo "Compiling `basename $C`..." (cd $C && cargo build --release --lib --target wasm32-unknown-unknown --locked) done - - run: - name: Install check_contract - # Uses --debug for compilation speed - command: cargo install --debug --version 1.3.0 --features iterator --example check_contract -- cosmwasm-vm - - save_cache: - paths: - - /usr/local/cargo/registry - - target - key: cargocache-wasm-rust:1.72.1-{{ checksum "~/project/Cargo.lock" }} - - run: - name: Check wasm contracts - command: | - for W in ./target/wasm32-unknown-unknown/release/*.wasm - do - echo -n "Checking `basename $W`... " - check_contract --supported-features iterator,staking,stargate,stargaze $W - done # This job roughly follows the instructions from https://circleci.com/blog/publishing-to-github-releases-via-circleci/ build_and_upload_contracts: diff --git a/contracts/marketplace/Cargo.toml b/contracts/marketplace/Cargo.toml index 4d8a0f7c..e64f9b73 100644 --- a/contracts/marketplace/Cargo.toml +++ b/contracts/marketplace/Cargo.toml @@ -19,6 +19,11 @@ exclude = [ [lib] crate-type = ["cdylib", "rlib"] +[[bin]] +name = "schema" +path = "src/bin/schema.rs" +doc = false + [features] # for more explicit tests, cargo test --features=backtraces backtraces = ["cosmwasm-std/backtraces"] diff --git a/contracts/name-minter/Cargo.toml b/contracts/name-minter/Cargo.toml index 5d55d4e3..41982101 100644 --- a/contracts/name-minter/Cargo.toml +++ b/contracts/name-minter/Cargo.toml @@ -17,6 +17,11 @@ exclude = [ [lib] crate-type = ["cdylib", "rlib"] +[[bin]] +name = "schema" +path = "src/bin/schema.rs" +doc = false + [features] # for more explicit tests, cargo test --features=backtraces backtraces = ["cosmwasm-std/backtraces"] diff --git a/contracts/sg721-name/Cargo.toml b/contracts/sg721-name/Cargo.toml index 550671cc..6fe07f13 100644 --- a/contracts/sg721-name/Cargo.toml +++ b/contracts/sg721-name/Cargo.toml @@ -21,6 +21,11 @@ exclude = [ [lib] crate-type = ["cdylib", "rlib"] +[[bin]] +name = "schema" +path = "src/bin/schema.rs" +doc = false + [features] # for more explicit tests, cargo test --features=backtraces backtraces = ["cosmwasm-std/backtraces"] From aa730dddab7b14a65079f99dd599db30d8edb3c9 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 14:46:05 -0500 Subject: [PATCH 14/91] Update version --- Cargo.lock | 18 +++--- Cargo.toml | 57 +++++++++---------- .../marketplace/schema/name-marketplace.json | 2 +- contracts/name-minter/schema/name-minter.json | 2 +- contracts/sg721-name/schema/sg721-name.json | 2 +- 5 files changed, 40 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f91db7bf..aeed1d60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -531,7 +531,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "name-marketplace" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -558,7 +558,7 @@ dependencies = [ [[package]] name = "name-minter" -version = "1.2.6" +version = "2.0.0" dependencies = [ "anyhow", "cosmwasm-schema", @@ -812,7 +812,7 @@ dependencies = [ [[package]] name = "sg-name" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -822,7 +822,7 @@ dependencies = [ [[package]] name = "sg-name-common" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -834,7 +834,7 @@ dependencies = [ [[package]] name = "sg-name-market" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -844,7 +844,7 @@ dependencies = [ [[package]] name = "sg-name-minter" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -870,7 +870,7 @@ dependencies = [ [[package]] name = "sg-whitelist-basic" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -927,7 +927,7 @@ dependencies = [ [[package]] name = "sg721-name" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1131,7 +1131,7 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "whitelist-updatable" -version = "1.2.6" +version = "2.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", diff --git a/Cargo.toml b/Cargo.toml index e6fd2b9e..9765b3c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,42 +3,41 @@ members = ["packages/*", "contracts/*"] resolver = "2" [workspace.package] -version = "1.2.6" +version = "2.0.0" edition = "2021" homepage = "https://stargaze.zone" repository = "https://github.com/public-awesome/names" license = "Apache-2.0" [workspace.dependencies] -cosmwasm-schema = "1.2.1" -cosmwasm-std = "1.2.1" -cw2 = "0.16.0" -cw721 = "0.16.0" -cw721-base = "0.16.0" -cw-controllers = "0.16.0" -cw-multi-test = "0.16.0" +cosmwasm-schema = "1.2.1" +cosmwasm-std = "1.2.1" +cw2 = "0.16.0" +cw721 = "0.16.0" +cw721-base = "0.16.0" +cw-controllers = "0.16.0" +cw-multi-test = "0.16.0" cw-storage-macro = "0.16.0" -cw-storage-plus = "0.16.0" -cw-utils = "0.16.0" -schemars = "0.8.11" -semver = "1" -serde = { version = "1.0.145", default-features = false, features = ["derive"] } -sg1 = "0.22.9" -sg721 = "0.22.9" -sg721-base = "0.22.9" -sg-controllers = "0.22.9" -sg-metadata = "0.22.9" -sg-multi-test = "0.22.9" -sg-std = "0.22.9" -thiserror = "1.0.31" -sg-name-common = { version = "1.2.5", path = "./packages/sg-name-common" } -sg721-name = { version = "1.2.5", path = "./contracts/sg721-name" } -sg-name = { version = "1.2.5", path = "./packages/sg-name" } -sg-name-market = { version = "1.2.5", path = "./packages/sg-name-market" } -sg-name-minter = { version = "1.2.5", path = "./packages/sg-name-minter" } -name-marketplace = { version = "1.2.5", path = "./contracts/marketplace", features = [ - "library", -] } +cw-storage-plus = "0.16.0" +cw-utils = "0.16.0" +schemars = "0.8.11" +semver = "1" +serde = { version = "1.0.145", default-features = false, features = ["derive"] } +sg1 = "0.22.9" +sg721 = "0.22.9" +sg721-base = "0.22.9" +sg-controllers = "0.22.9" +sg-metadata = "0.22.9" +sg-multi-test = "0.22.9" +sg-std = "0.22.9" +thiserror = "1.0.31" +sg-name-common = { path = "./packages/sg-name-common" } +sg-name = { path = "./packages/sg-name" } +sg-name-market = { path = "./packages/sg-name-market" } +sg-name-minter = { path = "./packages/sg-name-minter" } +name-marketplace = { path = "./contracts/marketplace", features = ["library"] } +name-minter = { path = "./contracts/name-minter", features = ["library"] } +sg721-name = { path = "./contracts/sg721-name", features = ["library"] } [profile.release.package.name-minter] codegen-units = 1 diff --git a/contracts/marketplace/schema/name-marketplace.json b/contracts/marketplace/schema/name-marketplace.json index 3e9a0d0c..b092efc0 100644 --- a/contracts/marketplace/schema/name-marketplace.json +++ b/contracts/marketplace/schema/name-marketplace.json @@ -1,6 +1,6 @@ { "contract_name": "name-marketplace", - "contract_version": "1.2.6", + "contract_version": "2.0.0", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/name-minter/schema/name-minter.json b/contracts/name-minter/schema/name-minter.json index 717aba04..ca1fa730 100644 --- a/contracts/name-minter/schema/name-minter.json +++ b/contracts/name-minter/schema/name-minter.json @@ -1,6 +1,6 @@ { "contract_name": "name-minter", - "contract_version": "1.2.6", + "contract_version": "2.0.0", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/sg721-name/schema/sg721-name.json b/contracts/sg721-name/schema/sg721-name.json index ae51a73e..aa9385b5 100644 --- a/contracts/sg721-name/schema/sg721-name.json +++ b/contracts/sg721-name/schema/sg721-name.json @@ -1,6 +1,6 @@ { "contract_name": "sg721-name", - "contract_version": "1.2.6", + "contract_version": "2.0.0", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", From 2996295f67e5a4cb7236db6e709236115fd1189a Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 16:00:46 -0500 Subject: [PATCH 15/91] Add testnet scripts --- scripts/.env.testnet | 12 ++++---- scripts/exec_process_renewals.sh | 14 +++++++++ scripts/migrate_mkt.sh | 15 ++++++++++ scripts/migrate_mkt_bids.sh | 14 +++++++++ scripts/query_ask.sh | 11 +++++++ scripts/query_asks_by_renew_time.sh | 12 ++++++++ scripts/query_bids_sorted_by_price.sh | 41 +++++++++++++++++++++++++++ scripts/query_mkt_params.sh | 9 ++++++ scripts/store_v2.sh | 17 +++++++++++ 9 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 scripts/exec_process_renewals.sh create mode 100644 scripts/migrate_mkt.sh create mode 100644 scripts/migrate_mkt_bids.sh create mode 100644 scripts/query_ask.sh create mode 100755 scripts/query_asks_by_renew_time.sh create mode 100755 scripts/query_bids_sorted_by_price.sh create mode 100755 scripts/query_mkt_params.sh create mode 100644 scripts/store_v2.sh diff --git a/scripts/.env.testnet b/scripts/.env.testnet index 975ca7d9..8fc7ee79 100644 --- a/scripts/.env.testnet +++ b/scripts/.env.testnet @@ -1,8 +1,8 @@ export NODE=https://rpc.elgafar-1.stargaze-apis.com:443/ export CHAIN_ID=elgafar-1 -export KEYRING=os +export KEYRING=test -export USER=stars1tqzzmxsvzu4952mnd5ul800wfusr6p72magyge +export USER=stars19mmkdpvem2xvrddt8nukf5kfpjwfslrsu7ugt5 export GOV=$USER export ADMIN=stars1zmaulflshft579x37acrdad72r57vnn5zsn0ee export BIDDER=$USER @@ -16,7 +16,7 @@ export MKT_CODE_ID=233 export MINTER_CODE_ID=234 export COLLECTION_CODE_ID=235 export WHITELIST_CODE_ID=342 -export MKT=stars1ajtmkgcsmca8gdgy7sphfhw3qp8ygrtv20v0u7xas3sjujnxezqqea7f88 -export COLLECTION=stars186erd88nsw9m07xqgu3tuwzzlfqt4hqzy2tthaux2fq6677jyhxsjkepnw -export MINTER=stars1z6dwct50eqwkly9crtaxas85v970pe9am22n48x8dwdvacg86wtse5mtzn -export WL=stars1pu26xk3ty0msunfsyhlt8wnwkz8ys6tfuf6uqxer4x4ju83uq7zsaq2zl2 +export COLLECTION=stars1rgn9tuxnl3ju9td3mfxdl2vm4t8xuaztcdakgtyx23c4ffm97cus25fvjs +export MKT=stars1ejc9sve7wcvg56acyynz3rn73dtfcg7n49efxpvvragwwy5fu7csskmwr5 +export MINTER=stars1uhe67xuc4l47mlj4gx8mvu6xpczzaxcxar6e0wvwncnaef5vctmqhkl4jk +export WL=stars1rxcjdyr6e5akwxk0tq5qz050nxyhqav68vulpf34ruuj5lkm4vwq3qw0dh diff --git a/scripts/exec_process_renewals.sh b/scripts/exec_process_renewals.sh new file mode 100644 index 00000000..c5d6b301 --- /dev/null +++ b/scripts/exec_process_renewals.sh @@ -0,0 +1,14 @@ +MSG=$(cat < Date: Tue, 2 Jan 2024 16:26:46 -0500 Subject: [PATCH 16/91] Touchup contracts after testnet testing --- .../marketplace/schema/name-marketplace.json | 89 +++++++++++++++++++ contracts/marketplace/src/execute.rs | 34 +++++-- contracts/marketplace/src/msg.rs | 6 ++ contracts/marketplace/src/query.rs | 25 +++++- ts/src/NameMarketplace.client.ts | 22 +++++ ts/src/NameMarketplace.types.ts | 5 ++ 6 files changed, 174 insertions(+), 7 deletions(-) diff --git a/contracts/marketplace/schema/name-marketplace.json b/contracts/marketplace/schema/name-marketplace.json index b092efc0..687dcfca 100644 --- a/contracts/marketplace/schema/name-marketplace.json +++ b/contracts/marketplace/schema/name-marketplace.json @@ -642,6 +642,40 @@ }, "additionalProperties": false }, + { + "description": "Get all legacy bids", + "type": "object", + "required": [ + "legacy_bids" + ], + "properties": { + "legacy_bids": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "anyOf": [ + { + "$ref": "#/definitions/BidOffset" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Get all bids for a collection, sorted by price", "type": "object", @@ -1654,6 +1688,61 @@ } } }, + "legacy_bids": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_Bid", + "type": "array", + "items": { + "$ref": "#/definitions/Bid" + }, + "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "Bid": { + "description": "Represents a bid (offer) on the marketplace", + "type": "object", + "required": [ + "amount", + "bidder", + "created_time", + "token_id" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "bidder": { + "$ref": "#/definitions/Addr" + }, + "created_time": { + "$ref": "#/definitions/Timestamp" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, "params": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "SudoParams", diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 446e11a4..ee024121 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -406,6 +406,8 @@ pub fn execute_migrate_bids( info: MessageInfo, limit: u32, ) -> Result { + nonpayable(&info)?; + let sudo_params = SUDO_PARAMS.load(deps.storage)?; ensure_eq!( @@ -414,22 +416,42 @@ pub fn execute_migrate_bids( ContractError::Unauthorized {} ); - let bids = legacy_bids() + let old_bids = legacy_bids() .range(deps.storage, None, None, Order::Ascending) .take(limit as usize) .map(|item| item.map(|(_, b)| b)) .collect::>>()?; + ensure!( + old_bids.len() > 0, + ContractError::Std(StdError::generic_err("No bids to migrate")) + ); + + let mut response = Response::new(); + let mut event = Event::new("migrate-bids"); - for bid in bids { - store_bid(deps.storage, &bid)?; + for bid in old_bids { + let existing_bid = bids().may_load(deps.storage, bid_key(&bid.token_id, &bid.bidder))?; + legacy_bids().remove(deps.storage, bid_key(&bid.token_id, &bid.bidder))?; - event = event.add_attribute("bid_key", format!("{:?}-{:?}", bid.token_id, bid.bidder)); + if let Some(existing_bid) = existing_bid { + let msg = BankMsg::Send { + to_address: existing_bid.bidder.to_string(), + amount: vec![coin(existing_bid.amount.u128(), NATIVE_DENOM)], + }; + response = response.add_message(msg); + } else { + store_bid(deps.storage, &bid)?; + } + + event = event.add_attribute("bid_key", format!("{}-{}", bid.token_id, bid.bidder)); } - Ok(Response::new().add_event(event)) + response = response.add_event(event); + + Ok(response) } pub fn execute_fund_renewal( @@ -533,6 +555,8 @@ pub fn execute_process_renewals( info: MessageInfo, limit: u32, ) -> Result { + nonpayable(&info)?; + let sudo_params = SUDO_PARAMS.load(deps.storage)?; ensure_eq!( diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index 5283d429..30008069 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -176,6 +176,12 @@ pub enum QueryMsg { start_after: Option, limit: Option, }, + /// Get all legacy bids + #[returns(Vec)] + LegacyBids { + start_after: Option, + limit: Option, + }, /// Get all bids for a collection, sorted by price #[returns(Vec)] BidsSortedByPrice { diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 5bd301a7..448504a9 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -1,8 +1,9 @@ use crate::helpers::get_renewal_price_and_bid; use crate::msg::{BidOffset, Bidder, ConfigResponse, QueryMsg}; use crate::state::{ - ask_key, asks, bid_key, bids, Ask, AskKey, Bid, Id, SudoParams, TokenId, ASK_COUNT, ASK_HOOKS, - BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, SUDO_PARAMS, + ask_key, asks, bid_key, bids, legacy_bids, Ask, AskKey, Bid, Id, SudoParams, TokenId, + ASK_COUNT, ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, + SUDO_PARAMS, }; use cosmwasm_std::{ @@ -59,6 +60,9 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { start_after, limit, } => to_binary(&query_bids(deps, token_id, start_after, limit)?), + QueryMsg::LegacyBids { start_after, limit } => { + to_binary(&query_legacy_bids(deps, start_after, limit)?) + } QueryMsg::BidsByBidder { bidder, start_after, @@ -294,6 +298,23 @@ pub fn query_bids( .collect::>>() } +pub fn query_legacy_bids( + deps: Deps, + start_after: Option, + limit: Option, +) -> StdResult> { + let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; + + let start = + start_after.map(|offset| Bound::exclusive(bid_key(&offset.token_id, &offset.bidder))); + + legacy_bids() + .range(deps.storage, start, None, Order::Ascending) + .take(limit) + .map(|item| item.map(|(_, b)| b)) + .collect::>>() +} + pub fn query_highest_bid(deps: Deps, token_id: TokenId) -> StdResult> { let bid = bids() .idx diff --git a/ts/src/NameMarketplace.client.ts b/ts/src/NameMarketplace.client.ts index c1339a87..951bfe0a 100644 --- a/ts/src/NameMarketplace.client.ts +++ b/ts/src/NameMarketplace.client.ts @@ -72,6 +72,13 @@ export interface NameMarketplaceReadOnlyInterface { startAfter?: string; tokenId: string; }) => Promise; + legacyBids: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: BidOffset; + }) => Promise; bidsSortedByPrice: ({ limit, startAfter @@ -127,6 +134,7 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf this.bid = this.bid.bind(this); this.bidsByBidder = this.bidsByBidder.bind(this); this.bids = this.bids.bind(this); + this.legacyBids = this.legacyBids.bind(this); this.bidsSortedByPrice = this.bidsSortedByPrice.bind(this); this.reverseBidsSortedByPrice = this.reverseBidsSortedByPrice.bind(this); this.bidsForSeller = this.bidsForSeller.bind(this); @@ -265,6 +273,20 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf } }); }; + legacyBids = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: BidOffset; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + legacy_bids: { + limit, + start_after: startAfter + } + }); + }; bidsSortedByPrice = async ({ limit, startAfter diff --git a/ts/src/NameMarketplace.types.ts b/ts/src/NameMarketplace.types.ts index fb0356c0..1145bc90 100644 --- a/ts/src/NameMarketplace.types.ts +++ b/ts/src/NameMarketplace.types.ts @@ -114,6 +114,11 @@ export type QueryMsg = { start_after?: string | null; token_id: string; }; +} | { + legacy_bids: { + limit?: number | null; + start_after?: BidOffset | null; + }; } | { bids_sorted_by_price: { limit?: number | null; From eb4ab0f02273b24b74c244dfcf4bafea2377b114 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 16:38:13 -0500 Subject: [PATCH 17/91] Bump version --- Cargo.lock | 18 +++++++++--------- Cargo.toml | 2 +- .../marketplace/schema/name-marketplace.json | 2 +- contracts/name-minter/schema/name-minter.json | 2 +- contracts/sg721-name/schema/sg721-name.json | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aeed1d60..b4438298 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -531,7 +531,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "name-marketplace" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -558,7 +558,7 @@ dependencies = [ [[package]] name = "name-minter" -version = "2.0.0" +version = "2.1.0" dependencies = [ "anyhow", "cosmwasm-schema", @@ -812,7 +812,7 @@ dependencies = [ [[package]] name = "sg-name" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -822,7 +822,7 @@ dependencies = [ [[package]] name = "sg-name-common" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -834,7 +834,7 @@ dependencies = [ [[package]] name = "sg-name-market" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -844,7 +844,7 @@ dependencies = [ [[package]] name = "sg-name-minter" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -870,7 +870,7 @@ dependencies = [ [[package]] name = "sg-whitelist-basic" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -927,7 +927,7 @@ dependencies = [ [[package]] name = "sg721-name" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1131,7 +1131,7 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "whitelist-updatable" -version = "2.0.0" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", diff --git a/Cargo.toml b/Cargo.toml index 9765b3c8..bb68681b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["packages/*", "contracts/*"] resolver = "2" [workspace.package] -version = "2.0.0" +version = "2.1.0" edition = "2021" homepage = "https://stargaze.zone" repository = "https://github.com/public-awesome/names" diff --git a/contracts/marketplace/schema/name-marketplace.json b/contracts/marketplace/schema/name-marketplace.json index 687dcfca..eab0cf02 100644 --- a/contracts/marketplace/schema/name-marketplace.json +++ b/contracts/marketplace/schema/name-marketplace.json @@ -1,6 +1,6 @@ { "contract_name": "name-marketplace", - "contract_version": "2.0.0", + "contract_version": "2.1.0", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/name-minter/schema/name-minter.json b/contracts/name-minter/schema/name-minter.json index ca1fa730..a7b7ce15 100644 --- a/contracts/name-minter/schema/name-minter.json +++ b/contracts/name-minter/schema/name-minter.json @@ -1,6 +1,6 @@ { "contract_name": "name-minter", - "contract_version": "2.0.0", + "contract_version": "2.1.0", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/sg721-name/schema/sg721-name.json b/contracts/sg721-name/schema/sg721-name.json index aa9385b5..317f0c52 100644 --- a/contracts/sg721-name/schema/sg721-name.json +++ b/contracts/sg721-name/schema/sg721-name.json @@ -1,6 +1,6 @@ { "contract_name": "sg721-name", - "contract_version": "2.0.0", + "contract_version": "2.1.0", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", From 83e2ae6f2a6e6e7757159358eadd866c6a21729d Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 16:41:21 -0500 Subject: [PATCH 18/91] Lint --- contracts/marketplace/src/execute.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index ee024121..45f99259 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -423,7 +423,7 @@ pub fn execute_migrate_bids( .collect::>>()?; ensure!( - old_bids.len() > 0, + !old_bids.is_empty(), ContractError::Std(StdError::generic_err("No bids to migrate")) ); From 753cb3cf4febba989d0d7e528630bf54a7b8a872 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 16:54:46 -0500 Subject: [PATCH 19/91] Add small tests --- contracts/marketplace/src/unit_tests.rs | 32 ++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/contracts/marketplace/src/unit_tests.rs b/contracts/marketplace/src/unit_tests.rs index d4f3c74f..6f2c9547 100644 --- a/contracts/marketplace/src/unit_tests.rs +++ b/contracts/marketplace/src/unit_tests.rs @@ -84,9 +84,24 @@ fn bid_indexed_map() { let res = bids().load(deps.as_ref().storage, key); assert_eq!(res.unwrap(), bid); - let res = query_bids_by_bidder(deps.as_ref(), bidder, None, None).unwrap(); + let res = query_bids_by_bidder(deps.as_ref(), bidder.clone(), None, None).unwrap(); assert_eq!(res.len(), 2); assert_eq!(res[0], bid); + + let remove_bid_msg = ExecuteMsg::RemoveBid { + token_id: TOKEN_ID_NEXT.to_string(), + }; + let res = execute( + deps.as_mut(), + mock_env(), + mock_info(&bidder.to_string(), &[]), + remove_bid_msg, + ); + assert!(res.is_ok()); + + let res = query_bids_by_bidder(deps.as_ref(), bidder, None, None).unwrap(); + assert_eq!(res.len(), 1); + assert_eq!(res[0], bid); } fn setup_contract(deps: DepsMut) { @@ -209,3 +224,18 @@ fn try_query_asks_by_renew_time() { let asks = result.unwrap(); assert_eq!(asks.len(), 7); } + +#[test] +fn try_migrate_bids_fails_with_no_bids() { + let mut deps = mock_dependencies(); + setup_contract(deps.as_mut()); + + let migrate_bids_msg = ExecuteMsg::MigrateBids { limit: 100 }; + let result = execute( + deps.as_mut(), + mock_env(), + mock_info(&OPERATOR.to_string(), &[]), + migrate_bids_msg, + ); + assert!(result.is_err()); +} From bf97257b780c106e8bd579eed1c4a2a1359f5341 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 2 Jan 2024 17:01:30 -0500 Subject: [PATCH 20/91] Lint --- contracts/marketplace/src/unit_tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/marketplace/src/unit_tests.rs b/contracts/marketplace/src/unit_tests.rs index 6f2c9547..cbb93ce7 100644 --- a/contracts/marketplace/src/unit_tests.rs +++ b/contracts/marketplace/src/unit_tests.rs @@ -94,7 +94,7 @@ fn bid_indexed_map() { let res = execute( deps.as_mut(), mock_env(), - mock_info(&bidder.to_string(), &[]), + mock_info(bidder.as_ref(), &[]), remove_bid_msg, ); assert!(res.is_ok()); @@ -234,7 +234,7 @@ fn try_migrate_bids_fails_with_no_bids() { let result = execute( deps.as_mut(), mock_env(), - mock_info(&OPERATOR.to_string(), &[]), + mock_info(OPERATOR, &[]), migrate_bids_msg, ); assert!(result.is_err()); From 82e36c8f4a60d78716c8fdc02d0abbfd9583c7f1 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sat, 13 Jan 2024 00:43:22 -0700 Subject: [PATCH 21/91] add a flat-rate discount whitelist; gitignore all instances of node_modules --- .gitignore | 2 + .../.cargo/config | 4 + .../whitelist-updatable-flatrate/.gitignore | 16 + .../whitelist-updatable-flatrate/Cargo.lock | 738 ++++++++++++++++++ .../whitelist-updatable-flatrate/Cargo.toml | 54 ++ .../whitelist-updatable-flatrate/LICENSE | 201 +++++ .../whitelist-updatable-flatrate/README.md | 9 + .../src/bin/schema.rs | 11 + .../src/contract.rs | 329 ++++++++ .../whitelist-updatable-flatrate/src/error.rs | 26 + .../src/helpers.rs | 60 ++ .../src/integration_tests.rs | 403 ++++++++++ .../whitelist-updatable-flatrate/src/lib.rs | 8 + .../whitelist-updatable-flatrate/src/msg.rs | 54 ++ .../whitelist-updatable-flatrate/src/state.rs | 21 + 15 files changed, 1936 insertions(+) create mode 100644 contracts/whitelist-updatable-flatrate/.cargo/config create mode 100644 contracts/whitelist-updatable-flatrate/.gitignore create mode 100644 contracts/whitelist-updatable-flatrate/Cargo.lock create mode 100644 contracts/whitelist-updatable-flatrate/Cargo.toml create mode 100644 contracts/whitelist-updatable-flatrate/LICENSE create mode 100644 contracts/whitelist-updatable-flatrate/README.md create mode 100644 contracts/whitelist-updatable-flatrate/src/bin/schema.rs create mode 100644 contracts/whitelist-updatable-flatrate/src/contract.rs create mode 100644 contracts/whitelist-updatable-flatrate/src/error.rs create mode 100644 contracts/whitelist-updatable-flatrate/src/helpers.rs create mode 100644 contracts/whitelist-updatable-flatrate/src/integration_tests.rs create mode 100644 contracts/whitelist-updatable-flatrate/src/lib.rs create mode 100644 contracts/whitelist-updatable-flatrate/src/msg.rs create mode 100644 contracts/whitelist-updatable-flatrate/src/state.rs diff --git a/.gitignore b/.gitignore index b57a6875..07a0beb8 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ tarpaulin-report.* *.env *.wasm *.json + +**/node_modules/ \ No newline at end of file diff --git a/contracts/whitelist-updatable-flatrate/.cargo/config b/contracts/whitelist-updatable-flatrate/.cargo/config new file mode 100644 index 00000000..af5698e5 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/.cargo/config @@ -0,0 +1,4 @@ +[alias] +wasm = "build --release --lib --target wasm32-unknown-unknown" +unit-test = "test --lib" +schema = "run --bin schema" diff --git a/contracts/whitelist-updatable-flatrate/.gitignore b/contracts/whitelist-updatable-flatrate/.gitignore new file mode 100644 index 00000000..9095deaa --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/.gitignore @@ -0,0 +1,16 @@ +# Build results +/target +/schema + +# Cargo+Git helper file (https://github.com/rust-lang/cargo/blob/0.44.1/src/cargo/sources/git/utils.rs#L320-L327) +.cargo-ok + +# Text file backups +**/*.rs.bk + +# macOS +.DS_Store + +# IDEs +*.iml +.idea diff --git a/contracts/whitelist-updatable-flatrate/Cargo.lock b/contracts/whitelist-updatable-flatrate/Cargo.lock new file mode 100644 index 00000000..91fb09ff --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/Cargo.lock @@ -0,0 +1,738 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "base64ct" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "cosmwasm-crypto" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb0afef2325df81aadbf9be1233f522ed8f6e91df870c764bc44cca2b1415bd" +dependencies = [ + "digest", + "ed25519-zebra", + "k256", + "rand_core 0.6.3", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b36e527620a2a3e00e46b6e731ab6c9b68d11069c986f7d7be8eba79ef081a4" +dependencies = [ + "syn", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772e80bbad231a47a2068812b723a1ff81dd4a0d56c9391ac748177bea3a61da" +dependencies = [ + "schemars", + "serde_json", +] + +[[package]] +name = "cosmwasm-std" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875994993c2082a6fcd406937bf0fca21c349e4a624f3810253a14fa83a3a195" +dependencies = [ + "base64", + "cosmwasm-crypto", + "cosmwasm-derive", + "forward_ref", + "schemars", + "serde", + "serde-json-wasm", + "thiserror", + "uint", +] + +[[package]] +name = "cosmwasm-storage" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18403b07304d15d304dad11040d45bbcaf78d603b4be3fb5e2685c16f9229b5" +dependencies = [ + "cosmwasm-std", + "serde", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "cw-multi-test" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbea57e5be4a682268a5eca1a57efece57a54ff216bfd87603d5e864aad40e12" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus", + "cw-utils", + "derivative", + "itertools", + "prost", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-storage-plus" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9336ecef1e19d56cf6e3e932475fc6a3dee35eec5a386e07917a1d1ba6bb0e35" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-utils" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "babd2c090f39d07ce5bf2556962305e795daa048ce20a93709eb591476e4a29e" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw2" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993df11574f29574dd443eb0c189484bb91bc0638b6de3e32ab7f9319c92122d" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus", + "schemars", + "serde", +] + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "dyn-clone" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" + +[[package]] +name = "ecdsa" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core 0.6.3", + "serde", + "sha2", + "thiserror", + "zeroize", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "elliptic-curve" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "ff", + "generic-array", + "group", + "rand_core 0.6.3", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" +dependencies = [ + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "group" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" +dependencies = [ + "ff", + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest", +] + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "k256" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sec1", + "sha2", +] + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + +[[package]] +name = "proc-macro2" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.6", +] + +[[package]] +name = "rfc6979" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "schemars" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d21ecb263bf75fc69d5e74b0f2a60b6dd80cfd9fb0eba15c4b9d1104ceffc77" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219b924f5b39f25b7d7c9203873a2698fdac8db2b396aaea6fa099b699cc40e9" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "signature" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +dependencies = [ + "digest", + "rand_core 0.6.3", +] + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "testgen-local" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw-multi-test", + "cw-storage-plus", + "cw2", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "uint" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "zeroize" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" diff --git a/contracts/whitelist-updatable-flatrate/Cargo.toml b/contracts/whitelist-updatable-flatrate/Cargo.toml new file mode 100644 index 00000000..d276c611 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/Cargo.toml @@ -0,0 +1,54 @@ +[package] +name = "whitelist-updatable-flatrate" +authors = ["John Y "] +version = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } + +exclude = [ + # Those files are rust-optimizer artifacts. You might want to commit them for convenience but they should not be part of the source code publication. + "contract.wasm", + "hash.txt", +] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +# use library feature to disable all instantiate/execute/query exports +library = [] + +[package.metadata.scripts] +optimize = """docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer:0.12.6 +""" + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } +cw-controllers = { workspace = true } +cw2 = { workspace = true } +cw-utils = { workspace = true } +schemars = { workspace = true } +semver = { workspace = true } +serde = { workspace = true } +sg-name-minter = { path = "../../packages/sg-name-minter" } +sg-std = { workspace = true } +sg-whitelist-basic = { path = "../../packages/sg-whitelist-basic" } +thiserror = { workspace = true } + +[dev-dependencies] +cw-multi-test = { workspace = true } +name-minter = { path = "../name-minter", features = ["library"] } +sg-name = { path = "../../packages/sg-name" } +sg-multi-test = { workspace = true } +sg721-name = { path = "../sg721-name" } diff --git a/contracts/whitelist-updatable-flatrate/LICENSE b/contracts/whitelist-updatable-flatrate/LICENSE new file mode 100644 index 00000000..f03c52ad --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2022 Public Awesome LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/contracts/whitelist-updatable-flatrate/README.md b/contracts/whitelist-updatable-flatrate/README.md new file mode 100644 index 00000000..9d355cf3 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/README.md @@ -0,0 +1,9 @@ +## Stargaze Whitelist Updatable, Flat-rate + +Admin controlled whitelist contract that: + +- holds a list of addresses. +- allows to add/remove addresses. +- holds a per address limit. +- throws error if per address limit reached. +- **includes an optional flate-rate discount to mint price** diff --git a/contracts/whitelist-updatable-flatrate/src/bin/schema.rs b/contracts/whitelist-updatable-flatrate/src/bin/schema.rs new file mode 100644 index 00000000..fb2d01c0 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/bin/schema.rs @@ -0,0 +1,11 @@ +use cosmwasm_schema::write_api; + +use whitelist_updatable_flatrate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + execute: ExecuteMsg, + query: QueryMsg, + } +} diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs new file mode 100644 index 00000000..b6aa8c73 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -0,0 +1,329 @@ +use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; +use cosmwasm_std::{ + to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + StdError, StdResult, +}; +use cw2::set_contract_version; +use semver::Version; +use sg_name_minter::SgNameMinterQueryMsg; + +use crate::error::ContractError; +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use cw_utils::nonpayable; +use sg_std::Response; + +// version info for migration info +const CONTRACT_NAME: &str = "crates.io:whitelist-updatable-flatrate"; +const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + env: Env, + info: MessageInfo, + mut msg: InstantiateMsg, +) -> Result { + nonpayable(&info)?; + set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + let config = Config { + admin: info.sender, + per_address_limit: msg.per_address_limit, + mint_discount_amount: msg.mint_discount_amount, + }; + + // remove duplicate addresses + msg.addresses.sort_unstable(); + msg.addresses.dedup(); + + let mut count = 0u64; + for address in msg.addresses.into_iter() { + let addr = deps.api.addr_validate(&address.clone())?; + WHITELIST.save(deps.storage, addr, &0u32)?; + count += 1; + } + + TOTAL_ADDRESS_COUNT.save(deps.storage, &count)?; + CONFIG.save(deps.storage, &config)?; + + Ok(Response::default() + .add_attribute("action", "instantiate") + .add_attribute("whitelist_addr", env.contract.address.to_string())) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> Result { + match msg { + ExecuteMsg::UpdateAdmin { new_admin } => execute_update_admin(deps, info, new_admin), + ExecuteMsg::AddAddresses { addresses } => execute_add_addresses(deps, info, addresses), + ExecuteMsg::RemoveAddresses { addresses } => { + execute_remove_addresses(deps, info, addresses) + } + ExecuteMsg::ProcessAddress { address } => execute_process_address(deps, env, info, address), + ExecuteMsg::UpdatePerAddressLimit { limit } => { + execute_update_per_address_limit(deps, info, limit) + } + ExecuteMsg::Purge {} => execute_purge(deps, info), + } +} + +pub fn execute_update_admin( + deps: DepsMut, + info: MessageInfo, + new_admin: String, +) -> Result { + nonpayable(&info)?; + let mut config = CONFIG.load(deps.storage)?; + if config.admin != info.sender { + return Err(ContractError::Unauthorized {}); + } + + config.admin = deps.api.addr_validate(&new_admin)?; + CONFIG.save(deps.storage, &config)?; + let event = Event::new("update-admin") + .add_attribute("new_admin", config.admin) + .add_attribute("sender", info.sender); + Ok(Response::new().add_event(event)) +} + +pub fn execute_add_addresses( + deps: DepsMut, + info: MessageInfo, + mut addresses: Vec, +) -> Result { + let config = CONFIG.load(deps.storage)?; + let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; + if config.admin != info.sender { + return Err(ContractError::Unauthorized {}); + } + + // dedupe + addresses.sort_unstable(); + addresses.dedup(); + + for address in addresses.into_iter() { + let addr = deps.api.addr_validate(&address.clone())?; + if WHITELIST.has(deps.storage, addr.clone()) { + return Err(ContractError::AddressAlreadyExists { + addr: addr.to_string(), + }); + } else { + WHITELIST.save(deps.storage, addr, &0u32)?; + count += 1; + } + } + + TOTAL_ADDRESS_COUNT.save(deps.storage, &count)?; + + let event = Event::new("add-addresses") + .add_attribute("new-count", count.to_string()) + .add_attribute("sender", info.sender); + Ok(Response::new().add_event(event)) +} + +pub fn execute_remove_addresses( + deps: DepsMut, + info: MessageInfo, + mut addresses: Vec, +) -> Result { + nonpayable(&info)?; + let config = CONFIG.load(deps.storage)?; + let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; + if config.admin != info.sender { + return Err(ContractError::Unauthorized {}); + } + + // dedupe + addresses.sort_unstable(); + addresses.dedup(); + + for address in addresses.into_iter() { + let addr = deps.api.addr_validate(&address.clone())?; + if WHITELIST.has(deps.storage, addr.clone()) { + WHITELIST.remove(deps.storage, addr); + count -= 1; + } else { + return Err(ContractError::AddressNotFound { + addr: addr.to_string(), + }); + } + } + + TOTAL_ADDRESS_COUNT.save(deps.storage, &count)?; + let event = Event::new("remove-addresses") + .add_attribute("new-count", count.to_string()) + .add_attribute("sender", info.sender); + Ok(Response::new().add_event(event)) +} + +pub fn execute_process_address( + deps: DepsMut, + env: Env, + info: MessageInfo, + address: String, +) -> Result { + nonpayable(&info)?; + let config = CONFIG.load(deps.storage)?; + let minter = info.sender; + + // query whitelists from minter to see if this one exists... + let whitelists: Vec = deps + .querier + .query_wasm_smart(&minter, &SgNameMinterQueryMsg::Whitelists {})?; + if !whitelists.contains(&env.contract.address) { + return Err(ContractError::Unauthorized {}); + } + + let addr = deps.api.addr_validate(&address)?; + if !WHITELIST.has(deps.storage, addr.clone()) { + return Err(ContractError::AddressNotFound { + addr: addr.to_string(), + }); + } + + if WHITELIST.load(deps.storage, addr.clone())? >= config.per_address_limit { + return Err(ContractError::OverPerAddressLimit {}); + } + + let count = WHITELIST.load(deps.storage, addr.clone())?; + WHITELIST.save(deps.storage, addr, &(count + 1))?; + + let event = Event::new("process-address") + .add_attribute("address", address) + .add_attribute("mint-count", (count + 1).to_string()) + .add_attribute("sender", minter); + Ok(Response::new().add_event(event)) +} + +pub fn execute_update_per_address_limit( + deps: DepsMut, + info: MessageInfo, + limit: u32, +) -> Result { + nonpayable(&info)?; + let mut config = CONFIG.load(deps.storage)?; + if config.admin != info.sender { + return Err(ContractError::Unauthorized {}); + } + + config.per_address_limit = limit; + CONFIG.save(deps.storage, &config)?; + + let event = Event::new("update-per-address-limit") + .add_attribute("new-limit", limit.to_string()) + .add_attribute("sender", info.sender); + Ok(Response::new().add_event(event)) +} + +pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result { + nonpayable(&info)?; + let config = CONFIG.load(deps.storage)?; + if config.admin != info.sender { + return Err(ContractError::Unauthorized {}); + } + + let keys = WHITELIST + .keys(deps.as_ref().storage, None, None, Order::Ascending) + .map(|x| x.unwrap()) + .collect::>(); + + for key in keys { + WHITELIST.remove(deps.storage, key); + } + + TOTAL_ADDRESS_COUNT.save(deps.storage, &0u64)?; + + let event = Event::new("purge").add_attribute("sender", info.sender); + Ok(Response::new().add_event(event)) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::IncludesAddress { address } => to_binary(&query_includes_address(deps, address)?), + QueryMsg::MintCount { address } => to_binary(&query_mint_count(deps, address)?), + QueryMsg::Admin {} => to_binary(&query_admin(deps)?), + QueryMsg::AddressCount {} => to_binary(&query_address_count(deps)?), + QueryMsg::PerAddressLimit {} => to_binary(&query_per_address_limit(deps)?), + QueryMsg::IsProcessable { address } => to_binary(&query_is_processable(deps, address)?), + QueryMsg::MintDiscountAmount {} => to_binary(&query_mint_discount_amount(deps)?), + } +} + +pub fn query_config(deps: Deps) -> StdResult { + CONFIG.load(deps.storage) +} + +pub fn query_includes_address(deps: Deps, address: String) -> StdResult { + Ok(WHITELIST.has(deps.storage, Addr::unchecked(address))) +} + +pub fn query_mint_count(deps: Deps, address: String) -> StdResult { + let addr = deps.api.addr_validate(&address)?; + WHITELIST.load(deps.storage, addr) +} + +pub fn query_admin(deps: Deps) -> StdResult { + let config = CONFIG.load(deps.storage)?; + Ok(config.admin.to_string()) +} + +pub fn query_address_count(deps: Deps) -> StdResult { + TOTAL_ADDRESS_COUNT.load(deps.storage) +} + +pub fn query_per_address_limit(deps: Deps) -> StdResult { + let config = CONFIG.load(deps.storage)?; + Ok(config.per_address_limit) +} + +pub fn query_is_processable(deps: Deps, address: String) -> StdResult { + let addr = deps.api.addr_validate(&address)?; + // address not in whitelist, it's not processable + if !WHITELIST.has(deps.storage, addr.clone()) { + return Ok(false); + } + // compare addr mint count to per address limit + let count = WHITELIST.load(deps.storage, addr)?; + let config = CONFIG.load(deps.storage)?; + Ok(count < config.per_address_limit) +} + +pub fn query_mint_discount_amount(deps: Deps) -> StdResult> { + let config = CONFIG.load(deps.storage)?; + Ok(config.mint_discount_amount) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result { + let current_version = cw2::get_contract_version(deps.storage)?; + if current_version.contract != CONTRACT_NAME { + return Err(StdError::generic_err("Cannot upgrade to a different contract").into()); + } + let version: Version = current_version + .version + .parse() + .map_err(|_| StdError::generic_err("Invalid contract version"))?; + let new_version: Version = CONTRACT_VERSION + .parse() + .map_err(|_| StdError::generic_err("Invalid contract version"))?; + + if version > new_version { + return Err(StdError::generic_err("Cannot upgrade to a previous contract version").into()); + } + // if same version return + if version == new_version { + return Ok(Response::new()); + } + + // set new contract version + set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + Ok(Response::new()) +} diff --git a/contracts/whitelist-updatable-flatrate/src/error.rs b/contracts/whitelist-updatable-flatrate/src/error.rs new file mode 100644 index 00000000..b0c80bfe --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/error.rs @@ -0,0 +1,26 @@ +use cosmwasm_std::StdError; +use cw_utils::PaymentError; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("{0}")] + PaymentError(#[from] PaymentError), + + #[error("Unauthorized")] + Unauthorized {}, + + #[error("AddressNotFound {addr}")] + AddressNotFound { addr: String }, + + #[error("OverPerAddressLimit")] + OverPerAddressLimit {}, + + #[error("AddressAlreadyExists {addr}")] + AddressAlreadyExists { addr: String }, + // Add any other custom errors you like here. + // Look at https://docs.rs/thiserror/1.0.21/thiserror/ for details. +} diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs new file mode 100644 index 00000000..9faf6934 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -0,0 +1,60 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{ + to_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, +}; +use sg_std::CosmosMsg; + +use crate::{ + msg::{ExecuteMsg, QueryMsg}, + state::Config, +}; + +/// WhitelistUpdatableContract is a wrapper around Addr that provides a lot of helpers +#[cw_serde] +pub struct WhitelistUpdatableContract(pub Addr); + +impl WhitelistUpdatableContract { + pub fn addr(&self) -> Addr { + self.0.clone() + } + + pub fn call>(&self, msg: T) -> StdResult { + let msg = to_binary(&msg.into())?; + Ok(WasmMsg::Execute { + contract_addr: self.addr().into(), + msg, + funds: vec![], + } + .into()) + } + + pub fn process_address(&self, address: &str) -> StdResult { + self.call(ExecuteMsg::ProcessAddress { + address: address.to_string(), + }) + } + + pub fn includes(&self, querier: &QuerierWrapper, address: String) -> StdResult { + let includes: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: self.addr().into(), + msg: to_binary(&QueryMsg::IncludesAddress { address })?, + }))?; + Ok(includes) + } + + pub fn config(&self, querier: &QuerierWrapper) -> StdResult { + let res: Config = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: self.addr().into(), + msg: to_binary(&QueryMsg::Config {})?, + }))?; + + Ok(res) + } + + pub fn mint_discount_percent(&self, querier: &QuerierWrapper) -> StdResult> { + querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: self.addr().into(), + msg: to_binary(&QueryMsg::MintDiscountAmount{})?, + })) + } +} diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs new file mode 100644 index 00000000..01cc4b95 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -0,0 +1,403 @@ +#[cfg(test)] +mod tests { + use crate::{msg::*, state::Config}; + + use cosmwasm_std::Addr; + use name_minter::msg::InstantiateMsg as NameMinterInstantiateMsg; + use sg_std::StargazeMsgWrapper; + + use cw_multi_test::{Contract, ContractWrapper, Executor}; + + use sg_multi_test::StargazeApp; + + const CREATOR: &str = "creator"; + const OTHER_ADMIN: &str = "other_admin"; + const PER_ADDRESS_LIMIT: u32 = 10; + + fn custom_mock_app() -> StargazeApp { + StargazeApp::default() + } + + pub fn wl_contract() -> Box> { + let contract = ContractWrapper::new( + crate::contract::execute, + crate::contract::instantiate, + crate::contract::query, + ); + Box::new(contract) + } + + pub fn contract_collection() -> Box> { + let contract = ContractWrapper::new( + sg721_name::entry::execute, + sg721_name::entry::instantiate, + sg721_name::entry::query, + ); + Box::new(contract) + } + + pub fn name_minter_contract() -> Box> { + let contract = ContractWrapper::new( + name_minter::contract::execute, + name_minter::contract::instantiate, + name_minter::query::query, + ) + .with_reply(name_minter::contract::reply) + .with_sudo(name_minter::sudo::sudo); + Box::new(contract) + } + + fn name_minter_init(collection_code_id: u64) -> NameMinterInstantiateMsg { + NameMinterInstantiateMsg { + admin: Some(CREATOR.to_string()), + verifier: None, + collection_code_id, + marketplace_addr: "marketplace".to_string(), + base_price: 100u128.into(), + min_name_length: 3, + max_name_length: 63, + fair_burn_bps: 5000, + whitelists: vec![], + } + } + + #[test] + pub fn init() { + let addrs: Vec = vec![ + "addr0001".to_string(), + "addr0002".to_string(), + "addr0003".to_string(), + "addr0004".to_string(), + "addr0005".to_string(), + ]; + + let msg = InstantiateMsg { + per_address_limit: PER_ADDRESS_LIMIT, + addresses: addrs.clone(), + mint_discount_amount: None, + }; + + let mut app = custom_mock_app(); + let wl_id = app.store_code(wl_contract()); + let sg721_id = app.store_code(contract_collection()); + let minter_id = app.store_code(name_minter_contract()); + + let wl_addr = app + .instantiate_contract( + wl_id, + Addr::unchecked(CREATOR), + &msg, + &[], + "wl-contract".to_string(), + None, + ) + .unwrap(); + + let msg = name_minter_init(sg721_id); + + let minter_addr = app + .instantiate_contract( + minter_id, + Addr::unchecked(CREATOR), + &msg, + &[], + "name-minter-contract".to_string(), + None, + ) + .unwrap(); + + let admin: String = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::Admin {}) + .unwrap(); + assert_eq!(admin, CREATOR.to_string()); + + let count: u64 = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) + .unwrap(); + assert_eq!(count, addrs.len() as u64); + + let includes: bool = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::IncludesAddress { + address: addrs[0].clone(), + }, + ) + .unwrap(); + assert!(includes); + + let count: u32 = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::MintCount { + address: addrs[0].clone(), + }, + ) + .unwrap(); + assert_eq!(count, 0); + + let limit: u32 = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::PerAddressLimit {}) + .unwrap(); + assert_eq!(limit, 10); + + // add wl_addr to minter + let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { + address: wl_addr.to_string(), + }; + let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + + // process_address to increase mint count and check mint count incremented + // execute_process_address + let msg = ExecuteMsg::ProcessAddress { + address: addrs[0].clone(), + }; + let res = app.execute_contract(Addr::unchecked(minter_addr), wl_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + let res: u32 = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::MintCount { + address: addrs[0].clone(), + }, + ) + .unwrap(); + assert_eq!(res, 1); + } + + #[test] + fn exec() { + let addrs: Vec = vec![ + "addr0001".to_string(), + "addr0002".to_string(), + "addr0003".to_string(), + "addr0004".to_string(), + "addr0005".to_string(), + ]; + + let msg = InstantiateMsg { + per_address_limit: 10, + addresses: addrs, + mint_discount_amount: None, + }; + + let mut app = custom_mock_app(); + let wl_id = app.store_code(wl_contract()); + let sg721_id = app.store_code(contract_collection()); + let minter_id = app.store_code(name_minter_contract()); + + let wl_addr = app + .instantiate_contract( + wl_id, + Addr::unchecked(CREATOR), + &msg, + &[], + "wl-contract".to_string(), + None, + ) + .unwrap(); + + let msg = name_minter_init(sg721_id); + + let minter_addr = app + .instantiate_contract( + minter_id, + Addr::unchecked(CREATOR), + &msg, + &[], + "name-minter-contract".to_string(), + None, + ) + .unwrap(); + + let msg = ExecuteMsg::UpdateAdmin { + new_admin: OTHER_ADMIN.to_string(), + }; + let res = app.execute_contract(Addr::unchecked(CREATOR), wl_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + let res: String = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::Admin {}) + .unwrap(); + assert_eq!(res, OTHER_ADMIN.to_string()); + + // add addresses + let msg = ExecuteMsg::AddAddresses { + addresses: vec![ + "addr0001".to_string(), + "addr0002".to_string(), + "addr0003".to_string(), + "addr0004".to_string(), + "addr0006".to_string(), + ], + }; + let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); + assert!(res.is_err()); + let res: bool = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::IncludesAddress { + address: "addr0006".to_string(), + }, + ) + .unwrap(); + assert!(!res); + let res: u64 = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) + .unwrap(); + assert_eq!(res, 5); + let msg = ExecuteMsg::AddAddresses { + addresses: vec!["addr0007".to_string(), "addr0006".to_string()], + }; + let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + let res: bool = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::IncludesAddress { + address: "addr0006".to_string(), + }, + ) + .unwrap(); + assert!(res); + let res: u64 = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) + .unwrap(); + assert_eq!(res, 7); + + // remove addresses + let msg = ExecuteMsg::RemoveAddresses { + addresses: vec![ + "addr0000".to_string(), + "addr0001".to_string(), + "addr0002".to_string(), + "addr0003".to_string(), + "addr0004".to_string(), + "addr0006".to_string(), + ], + }; + let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); + assert!(res.is_err()); + let msg = ExecuteMsg::RemoveAddresses { + addresses: vec![ + "addr0001".to_string(), + "addr0002".to_string(), + "addr0003".to_string(), + "addr0004".to_string(), + "addr0006".to_string(), + ], + }; + let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + let res: bool = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::IncludesAddress { + address: "addr0006".to_string(), + }, + ) + .unwrap(); + assert!(!res); + let res: u64 = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) + .unwrap(); + assert_eq!(res, 2); + + // per address limit + let new_per_address_limit = 1; + let msg = ExecuteMsg::UpdatePerAddressLimit { + limit: new_per_address_limit, + }; + let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + let res: u32 = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::PerAddressLimit {}) + .unwrap(); + assert_eq!(res, 1); + + // surpass limit + let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { + address: wl_addr.to_string(), + }; + let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + let res: bool = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::IsProcessable { + address: "addr0007".to_string(), + }, + ) + .unwrap(); + assert!(res); + let msg = ExecuteMsg::ProcessAddress { + address: "addr0007".to_string(), + }; + let res = app.execute_contract( + Addr::unchecked(minter_addr.clone()), + wl_addr.clone(), + &msg, + &[], + ); + assert!(res.is_ok()); + let res: bool = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::IsProcessable { + address: "addr0007".to_string(), + }, + ) + .unwrap(); + assert!(!res); + let msg = ExecuteMsg::ProcessAddress { + address: "addr0007".to_string(), + }; + let res = app.execute_contract(Addr::unchecked(minter_addr), wl_addr.clone(), &msg, &[]); + assert!(res.is_err()); + + // purge + let msg = ExecuteMsg::Purge {}; + let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + let res: u32 = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) + .unwrap(); + assert_eq!(res, 0); + // does not include addr0007 + let res: bool = app + .wrap() + .query_wasm_smart( + &wl_addr, + &QueryMsg::IncludesAddress { + address: "addr0007".to_string(), + }, + ) + .unwrap(); + assert!(!res); + + // query config + let res: Config = app + .wrap() + .query_wasm_smart(&wl_addr, &QueryMsg::Config {}) + .unwrap(); + assert_eq!(res.admin, Addr::unchecked(OTHER_ADMIN).to_string()); + assert_eq!(res.per_address_limit, new_per_address_limit); + } +} diff --git a/contracts/whitelist-updatable-flatrate/src/lib.rs b/contracts/whitelist-updatable-flatrate/src/lib.rs new file mode 100644 index 00000000..d6185c4e --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/lib.rs @@ -0,0 +1,8 @@ +pub mod contract; +mod error; +pub mod helpers; +pub mod integration_tests; +pub mod msg; +pub mod state; + +pub use crate::error::ContractError; diff --git a/contracts/whitelist-updatable-flatrate/src/msg.rs b/contracts/whitelist-updatable-flatrate/src/msg.rs new file mode 100644 index 00000000..a3ddbba1 --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/msg.rs @@ -0,0 +1,54 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; + +use crate::state::Config; + +#[cw_serde] +pub struct InstantiateMsg { + pub addresses: Vec, + pub per_address_limit: u32, + pub mint_discount_amount: Option, +} + +#[cw_serde] +pub enum ExecuteMsg { + UpdateAdmin { + new_admin: String, + }, + AddAddresses { + addresses: Vec, + }, + RemoveAddresses { + addresses: Vec, + }, + /// Only callable by minter contract. Increment mint count on whitelist map. + ProcessAddress { + address: String, + }, + UpdatePerAddressLimit { + limit: u32, + }, + Purge {}, +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum QueryMsg { + #[returns(Config)] + Config {}, + #[returns(bool)] + IncludesAddress { address: String }, + #[returns(u64)] + MintCount { address: String }, + /// Avoid processing addresses that will fail. Includes address and under per address limit + #[returns(bool)] + IsProcessable { address: String }, + #[returns(cw_controllers::AdminResponse)] + Admin {}, + #[returns(u64)] + AddressCount {}, + #[returns(u64)] + PerAddressLimit {}, + // Mint discount converts bps to decimal percentage + #[returns(u64)] + MintDiscountAmount{}, +} diff --git a/contracts/whitelist-updatable-flatrate/src/state.rs b/contracts/whitelist-updatable-flatrate/src/state.rs new file mode 100644 index 00000000..72c3abda --- /dev/null +++ b/contracts/whitelist-updatable-flatrate/src/state.rs @@ -0,0 +1,21 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{Addr, Decimal, Uint128}; +use cw_storage_plus::{Item, Map}; + +#[cw_serde] +pub struct Config { + pub admin: Addr, + pub per_address_limit: u32, + pub mint_discount_amount: Option, +} + +impl Config { + pub fn mint_discount(&self) -> Option { + self.mint_discount_amount + } +} + +pub const CONFIG: Item = Item::new("config"); +pub const TOTAL_ADDRESS_COUNT: Item = Item::new("total_address_count"); +// Holds all addresses and mint count +pub const WHITELIST: Map = Map::new("wl"); From 2d96ae5782d903b54355fc027646755480b30f51 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 14 Jan 2024 11:52:27 -0700 Subject: [PATCH 22/91] add support for both whitelist types to name-minter state.rs --- Cargo.lock | 25 +++++++++++++++++++ contracts/name-minter/Cargo.toml | 1 + contracts/name-minter/src/state.rs | 8 +++++- .../whitelist-updatable-flatrate/Cargo.toml | 2 +- .../src/helpers.rs | 4 +-- .../whitelist-updatable-flatrate/src/state.rs | 2 +- 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e3b77bd..666289d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -584,6 +584,7 @@ dependencies = [ "sg721-name", "thiserror", "whitelist-updatable", + "whitelist-updatable-flatrate", ] [[package]] @@ -1152,6 +1153,30 @@ dependencies = [ "thiserror", ] +[[package]] +name = "whitelist-updatable-flatrate" +version = "1.2.6" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers", + "cw-multi-test", + "cw-storage-plus", + "cw-utils", + "cw2", + "name-minter", + "schemars", + "semver", + "serde", + "sg-multi-test", + "sg-name", + "sg-name-minter", + "sg-std", + "sg-whitelist-basic", + "sg721-name", + "thiserror", +] + [[package]] name = "zeroize" version = "1.5.5" diff --git a/contracts/name-minter/Cargo.toml b/contracts/name-minter/Cargo.toml index 5a8b0cc4..79cd9e6e 100644 --- a/contracts/name-minter/Cargo.toml +++ b/contracts/name-minter/Cargo.toml @@ -44,6 +44,7 @@ sg-name-common = { path = "../../packages/sg-name-common" } sg-name-minter = { path = "../../packages/sg-name-minter" } sg-std = { workspace = true } thiserror = { workspace = true } +whitelist-updatable-flatrate = { path = "../whitelist-updatable-flatrate", features = ["library"]} whitelist-updatable = { path = "../whitelist-updatable", features = [ "library", ] } diff --git a/contracts/name-minter/src/state.rs b/contracts/name-minter/src/state.rs index 909f69c2..b60899c5 100644 --- a/contracts/name-minter/src/state.rs +++ b/contracts/name-minter/src/state.rs @@ -3,6 +3,12 @@ use cw_controllers::Admin; use cw_storage_plus::Item; use sg_name_minter::{Config, SudoParams}; use whitelist_updatable::helpers::WhitelistUpdatableContract; +use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; + +pub enum WhitelistContract { + Updatable(WhitelistUpdatableContract), + Flatrate(WhitelistUpdatableFlatrateContract), +} pub const SUDO_PARAMS: Item = Item::new("params"); @@ -13,7 +19,7 @@ pub const NAME_MARKETPLACE: Item = Item::new("name-marketplace"); pub const ADMIN: Admin = Admin::new("admin"); /// Can only be updated by admin -pub const WHITELISTS: Item> = Item::new("whitelists"); +pub const WHITELISTS: Item> = Item::new("whitelists"); /// Controls if minting is paused or not by admin pub const PAUSED: Item = Item::new("paused"); diff --git a/contracts/whitelist-updatable-flatrate/Cargo.toml b/contracts/whitelist-updatable-flatrate/Cargo.toml index d276c611..03059dec 100644 --- a/contracts/whitelist-updatable-flatrate/Cargo.toml +++ b/contracts/whitelist-updatable-flatrate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "whitelist-updatable-flatrate" -authors = ["John Y "] +authors = ["John Y ", "jason-c-child "] version = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs index 9faf6934..288accea 100644 --- a/contracts/whitelist-updatable-flatrate/src/helpers.rs +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -11,9 +11,9 @@ use crate::{ /// WhitelistUpdatableContract is a wrapper around Addr that provides a lot of helpers #[cw_serde] -pub struct WhitelistUpdatableContract(pub Addr); +pub struct WhitelistUpdatableFlatrateContract(pub Addr); -impl WhitelistUpdatableContract { +impl WhitelistUpdatableFlatrateContract { pub fn addr(&self) -> Addr { self.0.clone() } diff --git a/contracts/whitelist-updatable-flatrate/src/state.rs b/contracts/whitelist-updatable-flatrate/src/state.rs index 72c3abda..e7bbb1d1 100644 --- a/contracts/whitelist-updatable-flatrate/src/state.rs +++ b/contracts/whitelist-updatable-flatrate/src/state.rs @@ -18,4 +18,4 @@ impl Config { pub const CONFIG: Item = Item::new("config"); pub const TOTAL_ADDRESS_COUNT: Item = Item::new("total_address_count"); // Holds all addresses and mint count -pub const WHITELIST: Map = Map::new("wl"); +pub const WHITELIST: Map = Map::new("wl_fr"); From 6935533ebe15ca4f303a162a6a4d5817e0fa8260 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 14 Jan 2024 22:16:51 -0700 Subject: [PATCH 23/91] add support for both whitelists to name-minter --- contracts/name-minter/src/contract.rs | 83 ++++++++++++++----- .../name-minter/src/integration_tests.rs | 10 ++- contracts/name-minter/src/msg.rs | 6 +- contracts/name-minter/src/query.rs | 7 +- contracts/name-minter/src/state.rs | 2 + .../src/helpers.rs | 4 +- 6 files changed, 86 insertions(+), 26 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 9061aa73..c82dfb45 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -10,7 +10,9 @@ use cw2::set_contract_version; use cw721_base::MintMsg; use cw_utils::{maybe_addr, must_pay, parse_reply_instantiate_data}; use name_marketplace::msg::ExecuteMsg as MarketplaceExecuteMsg; +use schemars::JsonSchema; use semver::Version; +use serde::{Deserialize, Serialize}; use sg721::{CollectionInfo, InstantiateMsg as Sg721InstantiateMsg}; use sg721_name::msg::{ ExecuteMsg as NameCollectionExecuteMsg, InstantiateMsg as NameCollectionInstantiateMsg, @@ -20,11 +22,12 @@ use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_name_minter::{Config, SudoParams, PUBLIC_MINT_START_TIME_IN_SECONDS}; use sg_std::{Response, SubMsg, NATIVE_DENOM}; use whitelist_updatable::helpers::WhitelistUpdatableContract; +use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; use crate::error::ContractError; use crate::msg::{ExecuteMsg, InstantiateMsg}; use crate::state::{ - ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, PAUSED, SUDO_PARAMS, WHITELISTS, + ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, PAUSED, SUDO_PARAMS, WHITELISTS, WhitelistContract, }; // version info for migration info @@ -53,6 +56,7 @@ pub fn instantiate( .iter() .filter_map(|addr| api.addr_validate(addr).ok()) .map(WhitelistUpdatableContract) + .map(WhitelistContract::Updatable) .collect::>(); WHITELISTS.save(deps.storage, &lists)?; @@ -127,8 +131,8 @@ pub fn execute( Ok(ADMIN.execute_update_admin(deps, info, maybe_addr(api, admin)?)?) } ExecuteMsg::Pause { pause } => execute_pause(deps, info, pause), - ExecuteMsg::AddWhitelist { address } => execute_add_whitelist(deps, info, address), - ExecuteMsg::RemoveWhitelist { address } => execute_remove_whitelist(deps, info, address), + ExecuteMsg::AddWhitelist { address, whitelist_type } => execute_add_whitelist(deps, info, address, whitelist_type), + ExecuteMsg::RemoveWhitelist { address, whitelist_type} => execute_remove_whitelist(deps, info, address, whitelist_type), ExecuteMsg::UpdateConfig { config } => execute_update_config(deps, info, env, config), } } @@ -154,10 +158,16 @@ pub fn execute_mint_and_list( // Assumes no duplicate addresses between whitelists // Otherwise there will be edge cases with per addr limit between the whitelists + let list = whitelists.iter().find(|whitelist| { - whitelist - .includes(&deps.querier, sender.to_string()) - .unwrap_or(false) + match whitelist { + WhitelistContract::Updatable(updatable) => { + updatable.includes(&deps.querier, sender.to_string()).unwrap_or(false) + } + WhitelistContract::Flatrate(flatrate) => { + flatrate.includes(&deps.querier, sender.to_string()).unwrap_or(false) + } + } }); // if not on any whitelist, check public mint start time @@ -166,13 +176,20 @@ pub fn execute_mint_and_list( } let discount = list - .map(|list| { - res.messages - .push(SubMsg::new(list.process_address(sender)?)); - list.mint_discount_percent(&deps.querier) - }) - .transpose()? - .unwrap_or(None); + .map(|whitelist| { + match whitelist { + WhitelistContract::Updatable(updatable) => { + res.messages.push(SubMsg::new(updatable.process_address(sender)?)); + updatable.mint_discount_percent(&deps.querier) + } + WhitelistContract::Flatrate(flatrate) => { + res.messages.push(SubMsg::new(flatrate.process_address(sender)?)); + flatrate.mint_discount_amount(&deps.querier) + } + } + }) + .transpose()? + .unwrap_or(None); let price = validate_payment(name.len(), &info, params.base_price.u128(), discount)?; charge_fees(&mut res, params.fair_burn_percent, price.amount); @@ -226,17 +243,32 @@ pub fn execute_pause( Ok(Response::new().add_event(event)) } + +#[derive(PartialEq, Clone, JsonSchema, Deserialize, Debug, Serialize)] +pub enum WhitelistType { + Updatable, + Flatrate, +} + pub fn execute_add_whitelist( deps: DepsMut, info: MessageInfo, address: String, + whitelist_type: Option, ) -> Result { ADMIN.assert_admin(deps.as_ref(), &info.sender)?; - let whitelist = deps - .api - .addr_validate(&address) - .map(WhitelistUpdatableContract)?; + let whitelist_type = whitelist_type.unwrap_or(WhitelistType::Updatable); + + let whitelist = match whitelist_type { + WhitelistType::Updatable => { + WhitelistContract::Updatable(deps.api.addr_validate(&address).map(WhitelistUpdatableContract)?) + } + WhitelistType::Flatrate => { + WhitelistContract::Flatrate(deps.api.addr_validate(&address).map(WhitelistUpdatableFlatrateContract)?) + } + }; + let mut lists = WHITELISTS.load(deps.storage)?; lists.push(whitelist); @@ -250,12 +282,25 @@ pub fn execute_remove_whitelist( deps: DepsMut, info: MessageInfo, address: String, + whitelist_type: Option, ) -> Result { ADMIN.assert_admin(deps.as_ref(), &info.sender)?; - let whitelist = deps.api.addr_validate(&address)?; + let whitelist_type = whitelist_type.unwrap_or(WhitelistType::Updatable); + let whitelist_addr = deps.api.addr_validate(&address)?; + let mut lists = WHITELISTS.load(deps.storage)?; - lists.retain(|addr| addr.addr() != whitelist); + lists.retain(|whitelist| { + let addr_matches = match whitelist { + WhitelistContract::Updatable(updatable) => updatable.addr() == whitelist_addr, + WhitelistContract::Flatrate(flatrate) => flatrate.addr() == whitelist_addr, + }; + let type_matches = match whitelist { + WhitelistContract::Updatable(_) => whitelist_type == WhitelistType::Updatable, + WhitelistContract::Flatrate(_) => whitelist_type == WhitelistType::Flatrate, + }; + !(addr_matches && type_matches) + }); WHITELISTS.save(deps.storage, &lists)?; diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 97e64a27..9a1a1073 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -196,6 +196,7 @@ fn instantiate_contracts( if let Some(admin) = admin { let msg = ExecuteMsg::AddWhitelist { address: wl.to_string(), + whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(admin), Addr::unchecked(minter), &msg, &[]); assert!(res.is_ok()); @@ -1652,7 +1653,7 @@ mod collection { } mod whitelist { - use crate::msg::QueryMsg; + use crate::{msg::QueryMsg, contract::WhitelistType}; use whitelist_updatable::{msg::QueryMsg as WhitelistQueryMsg, state::Config}; use super::*; @@ -1675,6 +1676,7 @@ mod whitelist { let wl_count = whitelists.len(); let msg = ExecuteMsg::AddWhitelist { address: "whitelist".to_string(), + whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); @@ -1686,6 +1688,7 @@ mod whitelist { let msg = ExecuteMsg::RemoveWhitelist { address: "whitelist".to_string(), + whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); @@ -1719,6 +1722,7 @@ mod whitelist { // add wl2 to minter let msg = ExecuteMsg::AddWhitelist { address: wl2.to_string(), + whitelist_type: None, }; let res = app.execute_contract( Addr::unchecked(ADMIN.to_string()), @@ -1795,6 +1799,7 @@ mod whitelist { // add wl2 to minter let msg = ExecuteMsg::AddWhitelist { address: wl2.to_string(), + whitelist_type: None, }; let res = app.execute_contract( Addr::unchecked(ADMIN.to_string()), @@ -1820,6 +1825,7 @@ mod whitelist { let msg = ExecuteMsg::AddWhitelist { address: WHITELIST.to_string(), + whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); @@ -1887,6 +1893,7 @@ mod public_start_time { // remove whitelist(s) let msg = ExecuteMsg::RemoveWhitelist { address: WHITELIST.to_string(), + whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); @@ -1907,6 +1914,7 @@ mod public_start_time { // remove whitelist(s) let msg = ExecuteMsg::RemoveWhitelist { address: WHITELIST.to_string(), + whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); diff --git a/contracts/name-minter/src/msg.rs b/contracts/name-minter/src/msg.rs index a28b9989..eff235be 100644 --- a/contracts/name-minter/src/msg.rs +++ b/contracts/name-minter/src/msg.rs @@ -2,6 +2,8 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{Addr, Uint128}; use sg_name_minter::{Config, SudoParams}; +use crate::contract::WhitelistType; + #[cw_serde] pub struct InstantiateMsg { /// Temporary admin for managing whitelists @@ -27,9 +29,9 @@ pub enum ExecuteMsg { /// Admin can pause minting during whitelist switching Pause { pause: bool }, /// Add a whitelist address - AddWhitelist { address: String }, + AddWhitelist { address: String, whitelist_type: Option }, /// Remove a whitelist address - RemoveWhitelist { address: String }, + RemoveWhitelist { address: String, whitelist_type: Option }, /// Update config, only callable by admin UpdateConfig { config: Config }, } diff --git a/contracts/name-minter/src/query.rs b/contracts/name-minter/src/query.rs index 032f9226..013b9b93 100644 --- a/contracts/name-minter/src/query.rs +++ b/contracts/name-minter/src/query.rs @@ -5,7 +5,7 @@ use sg_name_minter::{Config, SudoParams}; use crate::{ msg::QueryMsg, - state::{ADMIN, CONFIG, NAME_COLLECTION, SUDO_PARAMS, WHITELISTS}, + state::{ADMIN, CONFIG, NAME_COLLECTION, SUDO_PARAMS, WHITELISTS, WhitelistContract}, }; #[cfg_attr(not(feature = "library"), entry_point)] @@ -21,7 +21,10 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { fn query_whitelists(deps: Deps) -> StdResult> { let whitelists = WHITELISTS.load(deps.storage)?; - Ok(whitelists.iter().map(|w| w.addr()).collect()) + Ok(whitelists.iter().map(|w| match w { + WhitelistContract::Updatable(contract) => contract.addr(), + WhitelistContract::Flatrate(contract) => contract.addr(), + }).collect()) } fn query_collection(deps: Deps) -> StdResult { diff --git a/contracts/name-minter/src/state.rs b/contracts/name-minter/src/state.rs index b60899c5..198986b1 100644 --- a/contracts/name-minter/src/state.rs +++ b/contracts/name-minter/src/state.rs @@ -4,7 +4,9 @@ use cw_storage_plus::Item; use sg_name_minter::{Config, SudoParams}; use whitelist_updatable::helpers::WhitelistUpdatableContract; use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; +use serde::{Serialize, Deserialize}; +#[derive(Serialize, Deserialize)] pub enum WhitelistContract { Updatable(WhitelistUpdatableContract), Flatrate(WhitelistUpdatableFlatrateContract), diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs index 288accea..b1b525ca 100644 --- a/contracts/whitelist-updatable-flatrate/src/helpers.rs +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -51,10 +51,10 @@ impl WhitelistUpdatableFlatrateContract { Ok(res) } - pub fn mint_discount_percent(&self, querier: &QuerierWrapper) -> StdResult> { + pub fn mint_discount_amount(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::MintDiscountAmount{})?, + msg: to_binary(&QueryMsg::MintDiscountAmount {})?, })) } } From fd39b7e6d2c9b9bef05ab2647cc63fc484303955 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 14 Jan 2024 22:27:45 -0700 Subject: [PATCH 24/91] fix some linting --- .../name-minter/src/integration_tests.rs | 432 ++++++++---------- .../src/contract.rs | 60 ++- .../whitelist-updatable-flatrate/src/state.rs | 4 +- contracts/whitelist-updatable/src/contract.rs | 64 +-- 4 files changed, 271 insertions(+), 289 deletions(-) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 9a1a1073..24303b40 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1,24 +1,30 @@ -use crate::contract::{execute, instantiate, reply}; -use crate::msg::{ExecuteMsg, InstantiateMsg}; +use crate::contract::{ execute, instantiate, reply }; +use crate::msg::{ ExecuteMsg, InstantiateMsg }; use crate::query::query; use anyhow::Result as AnyResult; -use cosmwasm_std::{coins, Addr, Decimal, Timestamp, Uint128}; -use cw721::{NumTokensResponse, OwnerOfResponse}; +use cosmwasm_std::{ coins, Addr, Decimal, Timestamp, Uint128 }; +use cw721::{ NumTokensResponse, OwnerOfResponse }; use cw_multi_test::{ - AppResponse, BankSudo, Contract, ContractWrapper, Executor, SudoMsg as CwSudoMsg, + AppResponse, + BankSudo, + Contract, + ContractWrapper, + Executor, + SudoMsg as CwSudoMsg, }; use name_marketplace::msg::{ - ExecuteMsg as MarketplaceExecuteMsg, QueryMsg as MarketplaceQueryMsg, + ExecuteMsg as MarketplaceExecuteMsg, + QueryMsg as MarketplaceQueryMsg, SudoMsg as MarketplaceSudoMsg, }; use name_marketplace::state::Bid; use sg721_name::ExecuteMsg as Sg721NameExecuteMsg; use sg_multi_test::StargazeApp; -use sg_name::{SgNameExecuteMsg, SgNameQueryMsg}; +use sg_name::{ SgNameExecuteMsg, SgNameQueryMsg }; use sg_name_common::SECONDS_PER_YEAR; use sg_name_minter::PUBLIC_MINT_START_TIME_IN_SECONDS; -use sg_std::{StargazeMsgWrapper, NATIVE_DENOM}; -use whitelist_updatable::msg::{ExecuteMsg as WhitelistExecuteMsg, QueryMsg as WhitelistQueryMsg}; +use sg_std::{ StargazeMsgWrapper, NATIVE_DENOM }; +use whitelist_updatable::msg::{ ExecuteMsg as WhitelistExecuteMsg, QueryMsg as WhitelistQueryMsg }; pub fn contract_minter() -> Box> { let contract = ContractWrapper::new(execute, instantiate, query).with_reply(reply); @@ -29,9 +35,8 @@ pub fn contract_marketplace() -> Box> { let contract = ContractWrapper::new( name_marketplace::execute::execute, name_marketplace::execute::instantiate, - name_marketplace::query::query, - ) - .with_sudo(name_marketplace::sudo::sudo); + name_marketplace::query::query + ).with_sudo(name_marketplace::sudo::sudo); Box::new(contract) } @@ -39,9 +44,8 @@ pub fn contract_collection() -> Box> { let contract = ContractWrapper::new( sg721_name::entry::execute, sg721_name::entry::instantiate, - sg721_name::entry::query, - ) - .with_sudo(sg721_name::sudo::sudo); + sg721_name::entry::query + ).with_sudo(sg721_name::sudo::sudo); Box::new(contract) } @@ -49,7 +53,7 @@ pub fn contract_whitelist() -> Box> { let contract = ContractWrapper::new( whitelist_updatable::contract::execute, whitelist_updatable::contract::instantiate, - whitelist_updatable::contract::query, + whitelist_updatable::contract::query ); Box::new(contract) } @@ -59,7 +63,7 @@ pub fn contract_nft() -> Box> { let contract = ContractWrapper::new( sg721_base::entry::execute, sg721_base::entry::instantiate, - sg721_base::entry::query, + sg721_base::entry::query ); Box::new(contract) } @@ -109,7 +113,7 @@ pub fn set_block_time(mut app: StargazeApp, time: Timestamp) -> StargazeApp { fn instantiate_contracts( creator: Option, admin: Option, - start_time: Option, + start_time: Option ) -> StargazeApp { let mut app = custom_mock_app(start_time); let mkt_id = app.store_code(contract_marketplace()); @@ -130,7 +134,7 @@ fn instantiate_contracts( &msg, &[], "Name-Marketplace", - admin.clone(), + admin.clone() ) .unwrap(); @@ -153,7 +157,7 @@ fn instantiate_contracts( &msg, &[], "Name-Minter", - None, + None ) .unwrap(); @@ -166,13 +170,13 @@ fn instantiate_contracts( Addr::unchecked(ADMIN.to_string()), marketplace.clone(), &msg, - &[], + &[] ); assert!(res.is_ok()); let res: Addr = app .wrap() - .query_wasm_smart(COLLECTION, &SgNameQueryMsg::NameMarketplace {}) + .query_wasm_smart(COLLECTION, &(SgNameQueryMsg::NameMarketplace {})) .unwrap(); assert_eq!(res, marketplace.to_string()); @@ -184,7 +188,7 @@ fn instantiate_contracts( "addr0002".to_string(), USER.to_string(), USER4.to_string(), - ADMIN2.to_string(), + ADMIN2.to_string() ], mint_discount_bps: None, }; @@ -210,10 +214,10 @@ fn owner_of(app: &StargazeApp, token_id: String) -> String { .wrap() .query_wasm_smart( COLLECTION, - &sg721_base::msg::QueryMsg::OwnerOf { + &(sg721_base::msg::QueryMsg::OwnerOf { token_id, include_expired: None, - }, + }) ) .unwrap(); @@ -230,7 +234,7 @@ fn mint_and_list( app: &mut StargazeApp, name: &str, user: &str, - discount: Option, + discount: Option ) -> AnyResult { // set approval for user, for all tokens // approve_all is needed because we don't know the token_id before-hand @@ -242,43 +246,37 @@ fn mint_and_list( Addr::unchecked(user), Addr::unchecked(COLLECTION), &approve_all_msg, - &[], + &[] ); assert!(res.is_ok()); - let amount: Uint128 = match name.len() { - 0..=2 => BASE_PRICE, - 3 => BASE_PRICE * 100, - 4 => BASE_PRICE * 10, - _ => BASE_PRICE, - } - .into(); + let amount: Uint128 = ( + match name.len() { + 0..=2 => BASE_PRICE, + 3 => BASE_PRICE * 100, + 4 => BASE_PRICE * 10, + _ => BASE_PRICE, + } + ).into(); - let amount = discount - .map(|d| amount * (Decimal::one() - d)) - .unwrap_or(amount); + let amount = discount.map(|d| amount * (Decimal::one() - d)).unwrap_or(amount); // give user some funds let name_fee = coins(amount.into(), NATIVE_DENOM); - app.sudo(CwSudoMsg::Bank({ - BankSudo::Mint { - to_address: user.to_string(), - amount: name_fee.clone(), - } - })) - .map_err(|err| println!("{:?}", err)) - .ok(); + app.sudo( + CwSudoMsg::Bank({ BankSudo::Mint { + to_address: user.to_string(), + amount: name_fee.clone(), + } }) + ) + .map_err(|err| println!("{:?}", err)) + .ok(); let msg = ExecuteMsg::MintAndList { name: name.to_string(), }; - app.execute_contract( - Addr::unchecked(user), - Addr::unchecked(MINTER), - &msg, - &name_fee, - ) + app.execute_contract(Addr::unchecked(user), Addr::unchecked(MINTER), &msg, &name_fee) } fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { @@ -286,14 +284,14 @@ fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { // give bidder some funds let amount = coins(amount, NATIVE_DENOM); - app.sudo(CwSudoMsg::Bank({ - BankSudo::Mint { - to_address: bidder.to_string(), - amount: amount.clone(), - } - })) - .map_err(|err| println!("{:?}", err)) - .ok(); + app.sudo( + CwSudoMsg::Bank({ BankSudo::Mint { + to_address: bidder.to_string(), + amount: amount.clone(), + } }) + ) + .map_err(|err| println!("{:?}", err)) + .ok(); let msg = MarketplaceExecuteMsg::SetBid { token_id: name.to_string(), @@ -306,10 +304,10 @@ fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { .wrap() .query_wasm_smart( MKT, - &MarketplaceQueryMsg::Bid { + &(MarketplaceQueryMsg::Bid { token_id: name.to_string(), bidder: bidder.to_string(), - }, + }) ) .unwrap(); let bid = res.unwrap(); @@ -319,9 +317,9 @@ fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { } mod execute { - use cosmwasm_std::{attr, StdError}; - use cw721::{NftInfoResponse, OperatorsResponse}; - use name_marketplace::state::{Ask, SudoParams}; + use cosmwasm_std::{ attr, StdError }; + use cw721::{ NftInfoResponse, OperatorsResponse }; + use name_marketplace::state::{ Ask, SudoParams }; use sg721_name::msg::QueryMsg as Sg721NameQueryMsg; use sg_name::Metadata; use whitelist_updatable::msg::QueryMsg::IncludesAddress; @@ -342,12 +340,12 @@ mod execute { .wrap() .query_wasm_smart( COLLECTION, - &sg721_base::msg::QueryMsg::AllOperators { + &(sg721_base::msg::QueryMsg::AllOperators { owner: USER.to_string(), include_expired: None, start_after: None, limit: None, - }, + }) ) .unwrap(); assert_eq!(res.operators.len(), 1); @@ -365,9 +363,9 @@ mod execute { .wrap() .query_wasm_smart( MKT, - &MarketplaceQueryMsg::Ask { + &(MarketplaceQueryMsg::Ask { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.unwrap().token_id, NAME); @@ -377,7 +375,7 @@ mod execute { .wrap() .query_wasm_smart( Addr::unchecked(COLLECTION), - &sg721_base::msg::QueryMsg::NumTokens {}, + &(sg721_base::msg::QueryMsg::NumTokens {}) ) .unwrap(); @@ -403,10 +401,7 @@ mod execute { bid(&mut app, NAME, BIDDER, BID_AMOUNT); // user (owner) starts off with 0 internet funny money - let res = app - .wrap() - .query_balance(USER.to_string(), NATIVE_DENOM) - .unwrap(); + let res = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap(); assert_eq!(res.amount, Uint128::new(0)); let msg = MarketplaceExecuteMsg::AcceptBid { @@ -421,10 +416,10 @@ mod execute { .wrap() .query_wasm_smart( MKT, - &MarketplaceQueryMsg::Bid { + &(MarketplaceQueryMsg::Bid { token_id: NAME.to_string(), bidder: BIDDER.to_string(), - }, + }) ) .unwrap(); assert!(res.is_none()); @@ -433,10 +428,7 @@ mod execute { assert_eq!(owner_of(&app, NAME.to_string()), BIDDER.to_string()); // check if user got the bid amount - let res = app - .wrap() - .query_balance(USER.to_string(), NATIVE_DENOM) - .unwrap(); + let res = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap(); let protocol_fee = 20_000_000u128; assert_eq!(res.amount, Uint128::from(BID_AMOUNT - protocol_fee)); @@ -445,9 +437,9 @@ mod execute { .wrap() .query_wasm_smart( MKT, - &MarketplaceQueryMsg::Ask { + &(MarketplaceQueryMsg::Ask { token_id: NAME.to_string(), - }, + }) ) .unwrap(); let ask = res.unwrap(); @@ -484,7 +476,7 @@ mod execute { Addr::unchecked(BIDDER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -508,9 +500,9 @@ mod execute { // when no associated address, query should throw error let res: Result = app.wrap().query_wasm_smart( COLLECTION, - &SgNameQueryMsg::AssociatedAddress { + &(SgNameQueryMsg::AssociatedAddress { name: NAME.to_string(), - }, + }) ); assert!(res.is_err()); @@ -522,7 +514,7 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -531,9 +523,9 @@ mod execute { .wrap() .query_wasm_smart( COLLECTION, - &SgNameQueryMsg::AssociatedAddress { + &(SgNameQueryMsg::AssociatedAddress { name: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res, user.to_string()); @@ -554,7 +546,7 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -562,9 +554,9 @@ mod execute { .wrap() .query_wasm_smart( Addr::unchecked(COLLECTION), - &SgNameQueryMsg::Name { + &(SgNameQueryMsg::Name { address: user.to_string(), - }, + }) ) .unwrap(); assert_eq!(res, name2.to_string()); @@ -574,9 +566,9 @@ mod execute { .wrap() .query_wasm_smart( Addr::unchecked(COLLECTION), - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.token_uri, None); @@ -586,9 +578,9 @@ mod execute { .wrap() .query_wasm_smart( Addr::unchecked(COLLECTION), - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: name2.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.token_uri, Some(user.to_string())); @@ -602,7 +594,7 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -611,9 +603,9 @@ mod execute { .wrap() .query_wasm_smart( Addr::unchecked(COLLECTION), - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.token_uri, None); @@ -627,16 +619,16 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); // confirm removed from reverse names map let res: Result = app.wrap().query_wasm_smart( Addr::unchecked(COLLECTION), - &SgNameQueryMsg::Name { + &(SgNameQueryMsg::Name { address: user.to_string(), - }, + }) ); assert!(res.is_err()); } @@ -656,17 +648,19 @@ mod execute { Addr::unchecked(ADMIN2), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); - res.unwrap().events.iter().for_each(|e| { - if e.ty == "wasm-associate-address" { - assert_eq!(e.attributes[1], attr("name", NAME)); - assert_eq!(e.attributes[2], attr("owner", ADMIN2)); - assert_eq!(e.attributes[3], attr("address", MINTER)); - } - }); + res.unwrap() + .events.iter() + .for_each(|e| { + if e.ty == "wasm-associate-address" { + assert_eq!(e.attributes[1], attr("name", NAME)); + assert_eq!(e.attributes[2], attr("owner", ADMIN2)); + assert_eq!(e.attributes[3], attr("address", MINTER)); + } + }); } #[test] @@ -684,7 +678,7 @@ mod execute { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_err()); } @@ -704,7 +698,7 @@ mod execute { Addr::unchecked(USER2), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_err()); } @@ -716,7 +710,7 @@ mod execute { // verify addr in wl let whitelists: Vec = app .wrap() - .query_wasm_smart(MINTER, &QueryMsg::Whitelists {}) + .query_wasm_smart(MINTER, &(QueryMsg::Whitelists {})) .unwrap(); assert_eq!(whitelists.len(), 1); @@ -726,9 +720,9 @@ mod execute { .wrap() .query_wasm_smart( Addr::unchecked(whitelist.to_string()), - &IncludesAddress { + &(IncludesAddress { address: USER.to_string(), - }, + }) ) .unwrap(); dbg!(included, whitelist); @@ -764,7 +758,7 @@ mod execute { let res: SudoParams = app .wrap() - .query_wasm_smart(Addr::unchecked(MKT), &QueryMsg::Params {}) + .query_wasm_smart(Addr::unchecked(MKT), &(QueryMsg::Params {})) .unwrap(); let params = res; @@ -1017,9 +1011,9 @@ mod query { .wrap() .query_wasm_smart( MKT, - &MarketplaceQueryMsg::RenewalQueue { + &(MarketplaceQueryMsg::RenewalQueue { time: app.block_info().time.plus_seconds(SECONDS_PER_YEAR), - }, + }) ) .unwrap(); assert_eq!(res.len(), 2); @@ -1035,13 +1029,12 @@ mod query { // mint 1000 funds to user let renewal_fee = coins(1000_u128, NATIVE_DENOM); - app.sudo(CwSudoMsg::Bank({ - BankSudo::Mint { - to_address: USER.to_string(), - amount: renewal_fee.clone(), - } - })) - .unwrap(); + app.sudo( + CwSudoMsg::Bank({ BankSudo::Mint { + to_address: USER.to_string(), + amount: renewal_fee.clone(), + } }) + ).unwrap(); // user renew domain name let msg = MarketplaceExecuteMsg::FundRenewal { @@ -1052,15 +1045,11 @@ mod query { Addr::unchecked(USER), Addr::unchecked(MKT), &msg, - &renewal_fee, - ) - .unwrap(); + &renewal_fee + ).unwrap(); // verify user have no money - let res = app - .wrap() - .query_balance(USER.to_string(), NATIVE_DENOM) - .unwrap(); + let res = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap(); assert_eq!(res.amount, Uint128::new(0)); // user sends the nft to bob @@ -1074,16 +1063,11 @@ mod query { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], - ) - .unwrap(); + &[] + ).unwrap(); // the renewal fee should refunded back to user - let user_balance = app - .wrap() - .query_balance(USER.to_string(), NATIVE_DENOM) - .unwrap() - .amount; + let user_balance = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap().amount; assert_eq!(user_balance, renewal_fee[0].amount); let bob_balance = app.wrap().query_balance(bob, NATIVE_DENOM).unwrap().amount; @@ -1100,9 +1084,9 @@ mod query { // fails with "user" string, has to be a bech32 address let res: StdResult = app.wrap().query_wasm_smart( COLLECTION, - &SgNameQueryMsg::Name { + &(SgNameQueryMsg::Name { address: USER.to_string(), - }, + }) ); assert!(res.is_err()); @@ -1120,7 +1104,7 @@ mod query { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1128,9 +1112,9 @@ mod query { .wrap() .query_wasm_smart( COLLECTION, - &SgNameQueryMsg::Name { + &(SgNameQueryMsg::Name { address: cosmos_address.to_string(), - }, + }) ) .unwrap(); assert_eq!(res, "yoyo".to_string()); @@ -1142,24 +1126,22 @@ mod query { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(COLLECTION, &Sg721QueryMsg::CollectionInfo {}) + .query_wasm_smart(COLLECTION, &(Sg721QueryMsg::CollectionInfo {})) .unwrap(); assert_eq!( res.start_trading_time.unwrap(), - app.block_info() - .time - .plus_seconds(TRADING_START_TIME_OFFSET_IN_SECONDS) + app.block_info().time.plus_seconds(TRADING_START_TIME_OFFSET_IN_SECONDS) ); } } mod collection { - use cosmwasm_std::{to_binary, StdResult}; + use cosmwasm_std::{ to_binary, StdResult }; use cw721::NftInfoResponse; use cw_controllers::AdminResponse; use name_marketplace::state::Ask; - use sg721_name::{msg::QueryMsg as Sg721NameQueryMsg, state::SudoParams}; - use sg_name::{Metadata, TextRecord, NFT}; + use sg721_name::{ msg::QueryMsg as Sg721NameQueryMsg, state::SudoParams }; + use sg_name::{ Metadata, TextRecord, NFT }; use super::*; @@ -1172,7 +1154,7 @@ mod collection { Addr::unchecked(from), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1195,7 +1177,7 @@ mod collection { Addr::unchecked(from), Addr::unchecked(COLLECTION), &send_msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1224,7 +1206,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1233,9 +1215,9 @@ mod collection { .wrap() .query_wasm_smart( COLLECTION, - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1250,7 +1232,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); // fails cuz caller is not oracle verifier assert!(res.is_err()); @@ -1259,7 +1241,7 @@ mod collection { Addr::unchecked(VERIFIER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1272,9 +1254,9 @@ mod collection { .wrap() .query_wasm_smart( COLLECTION, - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1299,7 +1281,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1313,7 +1295,7 @@ mod collection { Addr::unchecked(VERIFIER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1322,9 +1304,9 @@ mod collection { .wrap() .query_wasm_smart( COLLECTION, - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1354,7 +1336,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1363,9 +1345,9 @@ mod collection { .wrap() .query_wasm_smart( COLLECTION, - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1384,7 +1366,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1393,9 +1375,9 @@ mod collection { .wrap() .query_wasm_smart( COLLECTION, - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1406,9 +1388,9 @@ mod collection { .wrap() .query_wasm_smart( COLLECTION, - &Sg721NameQueryMsg::NftInfo { + &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }, + }) ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1419,9 +1401,9 @@ mod collection { .wrap() .query_wasm_smart( COLLECTION, - &Sg721NameQueryMsg::ImageNFT { + &(Sg721NameQueryMsg::ImageNFT { name: NAME.to_string(), - }, + }) ) .unwrap(); assert!(res.is_none()); @@ -1468,7 +1450,7 @@ mod collection { Addr::unchecked(USER2), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1498,7 +1480,7 @@ mod collection { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1538,7 +1520,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_err()); @@ -1566,7 +1548,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_err()); @@ -1596,7 +1578,7 @@ mod collection { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1613,7 +1595,7 @@ mod collection { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_err()); @@ -1635,7 +1617,7 @@ mod collection { let mut app = instantiate_contracts(None, None, None); let params: SudoParams = app .wrap() - .query_wasm_smart(COLLECTION, &Sg721NameQueryMsg::Params {}) + .query_wasm_smart(COLLECTION, &(Sg721NameQueryMsg::Params {})) .unwrap(); let max_record_count = params.max_record_count; @@ -1646,15 +1628,15 @@ mod collection { assert!(res.is_ok()); let params: SudoParams = app .wrap() - .query_wasm_smart(COLLECTION, &Sg721NameQueryMsg::Params {}) + .query_wasm_smart(COLLECTION, &(Sg721NameQueryMsg::Params {})) .unwrap(); assert_eq!(params.max_record_count, max_record_count + 1); } } mod whitelist { - use crate::{msg::QueryMsg, contract::WhitelistType}; - use whitelist_updatable::{msg::QueryMsg as WhitelistQueryMsg, state::Config}; + use crate::{ msg::QueryMsg, contract::WhitelistType }; + use whitelist_updatable::{ msg::QueryMsg as WhitelistQueryMsg, state::Config }; use super::*; @@ -1671,7 +1653,7 @@ mod whitelist { let whitelists: Vec = app .wrap() - .query_wasm_smart(MINTER, &QueryMsg::Whitelists {}) + .query_wasm_smart(MINTER, &(QueryMsg::Whitelists {})) .unwrap(); let wl_count = whitelists.len(); let msg = ExecuteMsg::AddWhitelist { @@ -1711,7 +1693,7 @@ mod whitelist { "addr0002".to_string(), USER.to_string(), USER2.to_string(), - ADMIN2.to_string(), + ADMIN2.to_string() ], mint_discount_bps: None, }; @@ -1728,7 +1710,7 @@ mod whitelist { Addr::unchecked(ADMIN.to_string()), Addr::unchecked(MINTER.to_string()), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1742,9 +1724,9 @@ mod whitelist { .wrap() .query_wasm_smart( WHITELIST, - &WhitelistQueryMsg::MintCount { + &(WhitelistQueryMsg::MintCount { address: USER.to_string(), - }, + }) ) .unwrap(); assert_eq!(res, 1); @@ -1754,9 +1736,9 @@ mod whitelist { .wrap() .query_wasm_smart( WHITELIST2, - &WhitelistQueryMsg::MintCount { + &(WhitelistQueryMsg::MintCount { address: USER.to_string(), - }, + }) ) .unwrap(); assert_eq!(res, 0); @@ -1787,7 +1769,7 @@ mod whitelist { "addr0002".to_string(), USER.to_string(), USER2.to_string(), - ADMIN2.to_string(), + ADMIN2.to_string() ], mint_discount_bps: Some(3500), }; @@ -1805,7 +1787,7 @@ mod whitelist { Addr::unchecked(ADMIN.to_string()), Addr::unchecked(MINTER.to_string()), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1813,7 +1795,7 @@ mod whitelist { // query discount, pass to mint_and_list let discount: Decimal = app .wrap() - .query_wasm_smart(wl2, &WhitelistQueryMsg::MintDiscountPercent {}) + .query_wasm_smart(wl2, &(WhitelistQueryMsg::MintDiscountPercent {})) .unwrap(); let res = mint_and_list(&mut app, NAME, USER2, Some(discount)); assert!(res.is_ok()); @@ -1845,7 +1827,7 @@ mod whitelist { Addr::unchecked(ADMIN2), Addr::unchecked(WHITELIST), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -1880,7 +1862,7 @@ mod public_start_time { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) ); // try pub mint with whitelists before start time @@ -1908,7 +1890,7 @@ mod public_start_time { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) ); // remove whitelist(s) @@ -1922,10 +1904,7 @@ mod public_start_time { // default start time is PUBLIC_MINT_START_TIME_IN_SECONDS let msg = QueryMsg::Config {}; let res: Config = app.wrap().query_wasm_smart(MINTER, &msg).unwrap(); - assert_eq!( - res.public_mint_start_time, - PUBLIC_MINT_START_TIME_IN_SECONDS - ); + assert_eq!(res.public_mint_start_time, PUBLIC_MINT_START_TIME_IN_SECONDS); // update start time to PUBLIC_MINT_START_TIME_IN_SECONDS - 1 let msg = ExecuteMsg::UpdateConfig { @@ -1939,10 +1918,7 @@ mod public_start_time { // check start time let msg = QueryMsg::Config {}; let res: Config = app.wrap().query_wasm_smart(MINTER, &msg).unwrap(); - assert_eq!( - res.public_mint_start_time, - PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1) - ); + assert_eq!(res.public_mint_start_time, PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)); // mint succeeds w new mint start time let res = mint_and_list(&mut app, NAME, USER, None); @@ -1954,7 +1930,7 @@ mod public_start_time { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.plus_seconds(1)), + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.plus_seconds(1)) ); // mint succeeds w new mint start time @@ -1968,14 +1944,14 @@ mod associate_address { use collection::transfer; - use sg721::{CollectionInfo, InstantiateMsg as Sg721InstantiateMsg}; + use sg721::{ CollectionInfo, InstantiateMsg as Sg721InstantiateMsg }; #[test] fn transfer_to_eoa() { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) ); let nft_id = app.store_code(contract_nft()); @@ -2001,7 +1977,7 @@ mod associate_address { &init_msg, &[], "NFT", - Some(ADMIN.to_string()), + Some(ADMIN.to_string()) ) .unwrap(); @@ -2020,7 +1996,7 @@ mod associate_address { Addr::unchecked(nft_addr.clone()), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); @@ -2035,7 +2011,7 @@ mod associate_address { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) ); let nft_id = app.store_code(contract_nft()); @@ -2066,7 +2042,7 @@ mod associate_address { &creator_init_msg, &[], "NFT", - Some(USER.to_string()), + Some(USER.to_string()) ) .unwrap(); @@ -2102,7 +2078,7 @@ mod associate_address { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[], + &[] ); assert!(res.is_ok()); } @@ -2111,7 +2087,7 @@ mod associate_address { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) ); let nft_id = app.store_code(contract_nft()); @@ -2142,7 +2118,7 @@ mod associate_address { &creator_init_msg, &[], "NFT", - Some(USER.to_string()), + Some(USER.to_string()) ) .unwrap(); @@ -2175,18 +2151,10 @@ mod associate_address { address: Some(collection_with_no_admin_addr.to_string()), }; let res = app - .execute_contract( - Addr::unchecked(USER4), - Addr::unchecked(COLLECTION), - &msg, - &[], - ) + .execute_contract(Addr::unchecked(USER4), Addr::unchecked(COLLECTION), &msg, &[]) .map_err(|e| e.downcast::().unwrap()) .unwrap_err(); - assert!(matches!( - res, - sg721_name::ContractError::UnauthorizedCreatorOrAdmin {} - )) + assert!(matches!(res, sg721_name::ContractError::UnauthorizedCreatorOrAdmin {})) } #[test] @@ -2194,7 +2162,7 @@ mod associate_address { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) ); let nft_id = app.store_code(contract_nft()); @@ -2221,7 +2189,7 @@ mod associate_address { &creator_init_msg, &[], "NFT", - Some(USER.to_string()), + Some(USER.to_string()) ) .unwrap(); @@ -2234,17 +2202,9 @@ mod associate_address { address: Some(contract_with_an_admin.to_string()), }; let res = app - .execute_contract( - Addr::unchecked(USER4), - Addr::unchecked(COLLECTION), - &msg, - &[], - ) + .execute_contract(Addr::unchecked(USER4), Addr::unchecked(COLLECTION), &msg, &[]) .map_err(|e| e.downcast::().unwrap()) .unwrap_err(); - assert!(matches!( - res, - sg721_name::ContractError::UnauthorizedCreatorOrAdmin {} - )) + assert!(matches!(res, sg721_name::ContractError::UnauthorizedCreatorOrAdmin {})) } } diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index b6aa8c73..75b2be2a 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -1,16 +1,27 @@ -use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; +use crate::state::{ Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST }; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, - StdError, StdResult, + to_binary, + Addr, + Binary, + Decimal, + Deps, + DepsMut, + Empty, + Env, + Event, + MessageInfo, + Order, + StdError, + StdResult, }; use cw2::set_contract_version; use semver::Version; use sg_name_minter::SgNameMinterQueryMsg; use crate::error::ContractError; -use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use crate::msg::{ ExecuteMsg, InstantiateMsg, QueryMsg }; use cw_utils::nonpayable; use sg_std::Response; @@ -23,7 +34,7 @@ pub fn instantiate( deps: DepsMut, env: Env, info: MessageInfo, - mut msg: InstantiateMsg, + mut msg: InstantiateMsg ) -> Result { nonpayable(&info)?; set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; @@ -47,9 +58,11 @@ pub fn instantiate( TOTAL_ADDRESS_COUNT.save(deps.storage, &count)?; CONFIG.save(deps.storage, &config)?; - Ok(Response::default() - .add_attribute("action", "instantiate") - .add_attribute("whitelist_addr", env.contract.address.to_string())) + Ok( + Response::default() + .add_attribute("action", "instantiate") + .add_attribute("whitelist_addr", env.contract.address.to_string()) + ) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -57,7 +70,7 @@ pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg ) -> Result { match msg { ExecuteMsg::UpdateAdmin { new_admin } => execute_update_admin(deps, info, new_admin), @@ -76,7 +89,7 @@ pub fn execute( pub fn execute_update_admin( deps: DepsMut, info: MessageInfo, - new_admin: String, + new_admin: String ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -95,7 +108,7 @@ pub fn execute_update_admin( pub fn execute_add_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec, + mut addresses: Vec ) -> Result { let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; @@ -130,7 +143,7 @@ pub fn execute_add_addresses( pub fn execute_remove_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec, + mut addresses: Vec ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; @@ -166,16 +179,17 @@ pub fn execute_process_address( deps: DepsMut, env: Env, info: MessageInfo, - address: String, + address: String ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; let minter = info.sender; // query whitelists from minter to see if this one exists... - let whitelists: Vec = deps - .querier - .query_wasm_smart(&minter, &SgNameMinterQueryMsg::Whitelists {})?; + let whitelists: Vec = deps.querier.query_wasm_smart( + &minter, + &(SgNameMinterQueryMsg::Whitelists {}) + )?; if !whitelists.contains(&env.contract.address) { return Err(ContractError::Unauthorized {}); } @@ -204,7 +218,7 @@ pub fn execute_process_address( pub fn execute_update_per_address_limit( deps: DepsMut, info: MessageInfo, - limit: u32, + limit: u32 ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -228,8 +242,7 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result>(); @@ -307,13 +320,12 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result new_version { return Err(StdError::generic_err("Cannot upgrade to a previous contract version").into()); diff --git a/contracts/whitelist-updatable-flatrate/src/state.rs b/contracts/whitelist-updatable-flatrate/src/state.rs index e7bbb1d1..1233d44f 100644 --- a/contracts/whitelist-updatable-flatrate/src/state.rs +++ b/contracts/whitelist-updatable-flatrate/src/state.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Decimal, Uint128}; -use cw_storage_plus::{Item, Map}; +use cosmwasm_std::{ Addr, Decimal, Uint128 }; +use cw_storage_plus::{ Item, Map }; #[cw_serde] pub struct Config { diff --git a/contracts/whitelist-updatable/src/contract.rs b/contracts/whitelist-updatable/src/contract.rs index 2e055b0e..3f69db3d 100644 --- a/contracts/whitelist-updatable/src/contract.rs +++ b/contracts/whitelist-updatable/src/contract.rs @@ -1,16 +1,27 @@ -use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; +use crate::state::{ Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST }; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, - StdError, StdResult, + to_binary, + Addr, + Binary, + Decimal, + Deps, + DepsMut, + Empty, + Env, + Event, + MessageInfo, + Order, + StdError, + StdResult, }; use cw2::set_contract_version; use semver::Version; use sg_name_minter::SgNameMinterQueryMsg; use crate::error::ContractError; -use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use crate::msg::{ ExecuteMsg, InstantiateMsg, QueryMsg }; use cw_utils::nonpayable; use sg_std::Response; @@ -23,7 +34,7 @@ pub fn instantiate( deps: DepsMut, env: Env, info: MessageInfo, - mut msg: InstantiateMsg, + mut msg: InstantiateMsg ) -> Result { nonpayable(&info)?; set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; @@ -48,9 +59,11 @@ pub fn instantiate( TOTAL_ADDRESS_COUNT.save(deps.storage, &count)?; CONFIG.save(deps.storage, &config)?; - Ok(Response::default() - .add_attribute("action", "instantiate") - .add_attribute("whitelist_addr", env.contract.address.to_string())) + Ok( + Response::default() + .add_attribute("action", "instantiate") + .add_attribute("whitelist_addr", env.contract.address.to_string()) + ) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -58,7 +71,7 @@ pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg ) -> Result { match msg { ExecuteMsg::UpdateAdmin { new_admin } => execute_update_admin(deps, info, new_admin), @@ -77,7 +90,7 @@ pub fn execute( pub fn execute_update_admin( deps: DepsMut, info: MessageInfo, - new_admin: String, + new_admin: String ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -96,7 +109,7 @@ pub fn execute_update_admin( pub fn execute_add_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec, + mut addresses: Vec ) -> Result { let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; @@ -131,7 +144,7 @@ pub fn execute_add_addresses( pub fn execute_remove_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec, + mut addresses: Vec ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; @@ -167,16 +180,17 @@ pub fn execute_process_address( deps: DepsMut, env: Env, info: MessageInfo, - address: String, + address: String ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; let minter = info.sender; // query whitelists from minter to see if this one exists... - let whitelists: Vec = deps - .querier - .query_wasm_smart(&minter, &SgNameMinterQueryMsg::Whitelists {})?; + let whitelists: Vec = deps.querier.query_wasm_smart( + &minter, + &(SgNameMinterQueryMsg::Whitelists {}) + )?; if !whitelists.contains(&env.contract.address) { return Err(ContractError::Unauthorized {}); } @@ -205,7 +219,7 @@ pub fn execute_process_address( pub fn execute_update_per_address_limit( deps: DepsMut, info: MessageInfo, - limit: u32, + limit: u32 ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -229,8 +243,7 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result>(); @@ -299,9 +312,7 @@ pub fn query_is_processable(deps: Deps, address: String) -> StdResult { pub fn query_mint_discount_percent(deps: Deps) -> StdResult> { let config = CONFIG.load(deps.storage)?; - Ok(config - .mint_discount_bps - .map(|x| Decimal::from_ratio(x, 10_000u128))) + Ok(config.mint_discount_bps.map(|x| Decimal::from_ratio(x, 10_000u128))) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -310,13 +321,12 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result new_version { return Err(StdError::generic_err("Cannot upgrade to a previous contract version").into()); From 2948c9127596495d889a95d8b5997e3c3b87b49a Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 14 Jan 2024 22:32:47 -0700 Subject: [PATCH 25/91] more lint --- .../whitelist-updatable-flatrate/src/msg.rs | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/msg.rs b/contracts/whitelist-updatable-flatrate/src/msg.rs index a3ddbba1..4f11a6b5 100644 --- a/contracts/whitelist-updatable-flatrate/src/msg.rs +++ b/contracts/whitelist-updatable-flatrate/src/msg.rs @@ -1,4 +1,4 @@ -use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_schema::{ cw_serde, QueryResponses }; use crate::state::Config; @@ -33,22 +33,21 @@ pub enum ExecuteMsg { #[cw_serde] #[derive(QueryResponses)] pub enum QueryMsg { - #[returns(Config)] - Config {}, - #[returns(bool)] - IncludesAddress { address: String }, - #[returns(u64)] - MintCount { address: String }, + #[returns(Config)] Config {}, + #[returns(bool)] IncludesAddress { + address: String, + }, + #[returns(u64)] MintCount { + address: String, + }, /// Avoid processing addresses that will fail. Includes address and under per address limit #[returns(bool)] - IsProcessable { address: String }, - #[returns(cw_controllers::AdminResponse)] - Admin {}, - #[returns(u64)] - AddressCount {}, - #[returns(u64)] - PerAddressLimit {}, + IsProcessable { + address: String, + }, + #[returns(cw_controllers::AdminResponse)] Admin {}, + #[returns(u64)] AddressCount {}, + #[returns(u64)] PerAddressLimit {}, // Mint discount converts bps to decimal percentage - #[returns(u64)] - MintDiscountAmount{}, + #[returns(u64)] MintDiscountAmount {}, } From 02aee3694a9ef34cc6303dd04b7883ce45819474 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 14 Jan 2024 22:40:43 -0700 Subject: [PATCH 26/91] even more linting (now that i got cargo +nightly fmt working) --- contracts/name-minter/src/contract.rs | 86 +++-- .../name-minter/src/integration_tests.rs | 364 ++++++++++-------- contracts/name-minter/src/msg.rs | 10 +- contracts/name-minter/src/query.rs | 13 +- contracts/name-minter/src/state.rs | 2 +- .../src/contract.rs | 60 ++- .../whitelist-updatable-flatrate/src/msg.rs | 31 +- .../whitelist-updatable-flatrate/src/state.rs | 4 +- contracts/whitelist-updatable/src/contract.rs | 64 ++- 9 files changed, 337 insertions(+), 297 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index c82dfb45..b15e4fd6 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -27,7 +27,8 @@ use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; use crate::error::ContractError; use crate::msg::{ExecuteMsg, InstantiateMsg}; use crate::state::{ - ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, PAUSED, SUDO_PARAMS, WHITELISTS, WhitelistContract, + WhitelistContract, ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, PAUSED, SUDO_PARAMS, + WHITELISTS, }; // version info for migration info @@ -131,8 +132,14 @@ pub fn execute( Ok(ADMIN.execute_update_admin(deps, info, maybe_addr(api, admin)?)?) } ExecuteMsg::Pause { pause } => execute_pause(deps, info, pause), - ExecuteMsg::AddWhitelist { address, whitelist_type } => execute_add_whitelist(deps, info, address, whitelist_type), - ExecuteMsg::RemoveWhitelist { address, whitelist_type} => execute_remove_whitelist(deps, info, address, whitelist_type), + ExecuteMsg::AddWhitelist { + address, + whitelist_type, + } => execute_add_whitelist(deps, info, address, whitelist_type), + ExecuteMsg::RemoveWhitelist { + address, + whitelist_type, + } => execute_remove_whitelist(deps, info, address, whitelist_type), ExecuteMsg::UpdateConfig { config } => execute_update_config(deps, info, env, config), } } @@ -159,15 +166,13 @@ pub fn execute_mint_and_list( // Assumes no duplicate addresses between whitelists // Otherwise there will be edge cases with per addr limit between the whitelists - let list = whitelists.iter().find(|whitelist| { - match whitelist { - WhitelistContract::Updatable(updatable) => { - updatable.includes(&deps.querier, sender.to_string()).unwrap_or(false) - } - WhitelistContract::Flatrate(flatrate) => { - flatrate.includes(&deps.querier, sender.to_string()).unwrap_or(false) - } - } + let list = whitelists.iter().find(|whitelist| match whitelist { + WhitelistContract::Updatable(updatable) => updatable + .includes(&deps.querier, sender.to_string()) + .unwrap_or(false), + WhitelistContract::Flatrate(flatrate) => flatrate + .includes(&deps.querier, sender.to_string()) + .unwrap_or(false), }); // if not on any whitelist, check public mint start time @@ -176,20 +181,20 @@ pub fn execute_mint_and_list( } let discount = list - .map(|whitelist| { - match whitelist { + .map(|whitelist| match whitelist { WhitelistContract::Updatable(updatable) => { - res.messages.push(SubMsg::new(updatable.process_address(sender)?)); + res.messages + .push(SubMsg::new(updatable.process_address(sender)?)); updatable.mint_discount_percent(&deps.querier) } WhitelistContract::Flatrate(flatrate) => { - res.messages.push(SubMsg::new(flatrate.process_address(sender)?)); + res.messages + .push(SubMsg::new(flatrate.process_address(sender)?)); flatrate.mint_discount_amount(&deps.querier) } - } - }) - .transpose()? - .unwrap_or(None); + }) + .transpose()? + .unwrap_or(None); let price = validate_payment(name.len(), &info, params.base_price.u128(), discount)?; charge_fees(&mut res, params.fair_burn_percent, price.amount); @@ -243,7 +248,6 @@ pub fn execute_pause( Ok(Response::new().add_event(event)) } - #[derive(PartialEq, Clone, JsonSchema, Deserialize, Debug, Serialize)] pub enum WhitelistType { Updatable, @@ -261,12 +265,16 @@ pub fn execute_add_whitelist( let whitelist_type = whitelist_type.unwrap_or(WhitelistType::Updatable); let whitelist = match whitelist_type { - WhitelistType::Updatable => { - WhitelistContract::Updatable(deps.api.addr_validate(&address).map(WhitelistUpdatableContract)?) - } - WhitelistType::Flatrate => { - WhitelistContract::Flatrate(deps.api.addr_validate(&address).map(WhitelistUpdatableFlatrateContract)?) - } + WhitelistType::Updatable => WhitelistContract::Updatable( + deps.api + .addr_validate(&address) + .map(WhitelistUpdatableContract)?, + ), + WhitelistType::Flatrate => WhitelistContract::Flatrate( + deps.api + .addr_validate(&address) + .map(WhitelistUpdatableFlatrateContract)?, + ), }; let mut lists = WHITELISTS.load(deps.storage)?; @@ -282,7 +290,7 @@ pub fn execute_remove_whitelist( deps: DepsMut, info: MessageInfo, address: String, - whitelist_type: Option, + whitelist_type: Option, ) -> Result { ADMIN.assert_admin(deps.as_ref(), &info.sender)?; @@ -343,11 +351,11 @@ fn validate_name(name: &str, min: u32, max: u32) -> Result<(), ContractError> { name.find(invalid_char) .map_or(Ok(()), |_| Err(ContractError::InvalidName {}))?; - if name.starts_with('-') || name.ends_with('-') { + (if name.starts_with('-') || name.ends_with('-') { Err(ContractError::InvalidName {}) } else { Ok(()) - }?; + })?; if len > 4 && name[2..4].contains("--") { return Err(ContractError::InvalidName {}); @@ -363,12 +371,14 @@ fn validate_payment( discount: Option, ) -> Result { // Because we know we are left with ASCII chars, a simple byte count is enough - let amount: Uint128 = match name_len { - 0..=2 => return Err(ContractError::NameTooShort {}), + let amount: Uint128 = (match name_len { + 0..=2 => { + return Err(ContractError::NameTooShort {}); + } 3 => base_price * 100, 4 => base_price * 10, _ => base_price, - } + }) .into(); let amount = discount @@ -387,7 +397,7 @@ fn validate_payment( } fn invalid_char(c: char) -> bool { - let is_valid = c.is_ascii_digit() || c.is_ascii_lowercase() || (c == '-'); + let is_valid = c.is_ascii_digit() || c.is_ascii_lowercase() || c == '-'; !is_valid } @@ -407,9 +417,11 @@ pub fn reply(deps: DepsMut, _env: Env, msg: Reply) -> Result Box> { let contract = ContractWrapper::new(execute, instantiate, query).with_reply(reply); @@ -35,8 +29,9 @@ pub fn contract_marketplace() -> Box> { let contract = ContractWrapper::new( name_marketplace::execute::execute, name_marketplace::execute::instantiate, - name_marketplace::query::query - ).with_sudo(name_marketplace::sudo::sudo); + name_marketplace::query::query, + ) + .with_sudo(name_marketplace::sudo::sudo); Box::new(contract) } @@ -44,8 +39,9 @@ pub fn contract_collection() -> Box> { let contract = ContractWrapper::new( sg721_name::entry::execute, sg721_name::entry::instantiate, - sg721_name::entry::query - ).with_sudo(sg721_name::sudo::sudo); + sg721_name::entry::query, + ) + .with_sudo(sg721_name::sudo::sudo); Box::new(contract) } @@ -53,7 +49,7 @@ pub fn contract_whitelist() -> Box> { let contract = ContractWrapper::new( whitelist_updatable::contract::execute, whitelist_updatable::contract::instantiate, - whitelist_updatable::contract::query + whitelist_updatable::contract::query, ); Box::new(contract) } @@ -63,7 +59,7 @@ pub fn contract_nft() -> Box> { let contract = ContractWrapper::new( sg721_base::entry::execute, sg721_base::entry::instantiate, - sg721_base::entry::query + sg721_base::entry::query, ); Box::new(contract) } @@ -113,7 +109,7 @@ pub fn set_block_time(mut app: StargazeApp, time: Timestamp) -> StargazeApp { fn instantiate_contracts( creator: Option, admin: Option, - start_time: Option + start_time: Option, ) -> StargazeApp { let mut app = custom_mock_app(start_time); let mkt_id = app.store_code(contract_marketplace()); @@ -134,7 +130,7 @@ fn instantiate_contracts( &msg, &[], "Name-Marketplace", - admin.clone() + admin.clone(), ) .unwrap(); @@ -157,7 +153,7 @@ fn instantiate_contracts( &msg, &[], "Name-Minter", - None + None, ) .unwrap(); @@ -170,7 +166,7 @@ fn instantiate_contracts( Addr::unchecked(ADMIN.to_string()), marketplace.clone(), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -188,7 +184,7 @@ fn instantiate_contracts( "addr0002".to_string(), USER.to_string(), USER4.to_string(), - ADMIN2.to_string() + ADMIN2.to_string(), ], mint_discount_bps: None, }; @@ -217,7 +213,7 @@ fn owner_of(app: &StargazeApp, token_id: String) -> String { &(sg721_base::msg::QueryMsg::OwnerOf { token_id, include_expired: None, - }) + }), ) .unwrap(); @@ -234,7 +230,7 @@ fn mint_and_list( app: &mut StargazeApp, name: &str, user: &str, - discount: Option + discount: Option, ) -> AnyResult { // set approval for user, for all tokens // approve_all is needed because we don't know the token_id before-hand @@ -246,37 +242,43 @@ fn mint_and_list( Addr::unchecked(user), Addr::unchecked(COLLECTION), &approve_all_msg, - &[] + &[], ); assert!(res.is_ok()); - let amount: Uint128 = ( - match name.len() { - 0..=2 => BASE_PRICE, - 3 => BASE_PRICE * 100, - 4 => BASE_PRICE * 10, - _ => BASE_PRICE, - } - ).into(); + let amount: Uint128 = (match name.len() { + 0..=2 => BASE_PRICE, + 3 => BASE_PRICE * 100, + 4 => BASE_PRICE * 10, + _ => BASE_PRICE, + }) + .into(); - let amount = discount.map(|d| amount * (Decimal::one() - d)).unwrap_or(amount); + let amount = discount + .map(|d| amount * (Decimal::one() - d)) + .unwrap_or(amount); // give user some funds let name_fee = coins(amount.into(), NATIVE_DENOM); - app.sudo( - CwSudoMsg::Bank({ BankSudo::Mint { - to_address: user.to_string(), - amount: name_fee.clone(), - } }) - ) - .map_err(|err| println!("{:?}", err)) - .ok(); + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: user.to_string(), + amount: name_fee.clone(), + } + })) + .map_err(|err| println!("{:?}", err)) + .ok(); let msg = ExecuteMsg::MintAndList { name: name.to_string(), }; - app.execute_contract(Addr::unchecked(user), Addr::unchecked(MINTER), &msg, &name_fee) + app.execute_contract( + Addr::unchecked(user), + Addr::unchecked(MINTER), + &msg, + &name_fee, + ) } fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { @@ -284,14 +286,14 @@ fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { // give bidder some funds let amount = coins(amount, NATIVE_DENOM); - app.sudo( - CwSudoMsg::Bank({ BankSudo::Mint { - to_address: bidder.to_string(), - amount: amount.clone(), - } }) - ) - .map_err(|err| println!("{:?}", err)) - .ok(); + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: bidder.to_string(), + amount: amount.clone(), + } + })) + .map_err(|err| println!("{:?}", err)) + .ok(); let msg = MarketplaceExecuteMsg::SetBid { token_id: name.to_string(), @@ -307,7 +309,7 @@ fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { &(MarketplaceQueryMsg::Bid { token_id: name.to_string(), bidder: bidder.to_string(), - }) + }), ) .unwrap(); let bid = res.unwrap(); @@ -317,9 +319,9 @@ fn bid(app: &mut StargazeApp, name: &str, bidder: &str, amount: u128) { } mod execute { - use cosmwasm_std::{ attr, StdError }; - use cw721::{ NftInfoResponse, OperatorsResponse }; - use name_marketplace::state::{ Ask, SudoParams }; + use cosmwasm_std::{attr, StdError}; + use cw721::{NftInfoResponse, OperatorsResponse}; + use name_marketplace::state::{Ask, SudoParams}; use sg721_name::msg::QueryMsg as Sg721NameQueryMsg; use sg_name::Metadata; use whitelist_updatable::msg::QueryMsg::IncludesAddress; @@ -345,7 +347,7 @@ mod execute { include_expired: None, start_after: None, limit: None, - }) + }), ) .unwrap(); assert_eq!(res.operators.len(), 1); @@ -365,7 +367,7 @@ mod execute { MKT, &(MarketplaceQueryMsg::Ask { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.unwrap().token_id, NAME); @@ -375,7 +377,7 @@ mod execute { .wrap() .query_wasm_smart( Addr::unchecked(COLLECTION), - &(sg721_base::msg::QueryMsg::NumTokens {}) + &(sg721_base::msg::QueryMsg::NumTokens {}), ) .unwrap(); @@ -401,7 +403,10 @@ mod execute { bid(&mut app, NAME, BIDDER, BID_AMOUNT); // user (owner) starts off with 0 internet funny money - let res = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap(); + let res = app + .wrap() + .query_balance(USER.to_string(), NATIVE_DENOM) + .unwrap(); assert_eq!(res.amount, Uint128::new(0)); let msg = MarketplaceExecuteMsg::AcceptBid { @@ -419,7 +424,7 @@ mod execute { &(MarketplaceQueryMsg::Bid { token_id: NAME.to_string(), bidder: BIDDER.to_string(), - }) + }), ) .unwrap(); assert!(res.is_none()); @@ -428,7 +433,10 @@ mod execute { assert_eq!(owner_of(&app, NAME.to_string()), BIDDER.to_string()); // check if user got the bid amount - let res = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap(); + let res = app + .wrap() + .query_balance(USER.to_string(), NATIVE_DENOM) + .unwrap(); let protocol_fee = 20_000_000u128; assert_eq!(res.amount, Uint128::from(BID_AMOUNT - protocol_fee)); @@ -439,7 +447,7 @@ mod execute { MKT, &(MarketplaceQueryMsg::Ask { token_id: NAME.to_string(), - }) + }), ) .unwrap(); let ask = res.unwrap(); @@ -476,7 +484,7 @@ mod execute { Addr::unchecked(BIDDER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -502,7 +510,7 @@ mod execute { COLLECTION, &(SgNameQueryMsg::AssociatedAddress { name: NAME.to_string(), - }) + }), ); assert!(res.is_err()); @@ -514,7 +522,7 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -525,7 +533,7 @@ mod execute { COLLECTION, &(SgNameQueryMsg::AssociatedAddress { name: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res, user.to_string()); @@ -546,7 +554,7 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -556,7 +564,7 @@ mod execute { Addr::unchecked(COLLECTION), &(SgNameQueryMsg::Name { address: user.to_string(), - }) + }), ) .unwrap(); assert_eq!(res, name2.to_string()); @@ -568,7 +576,7 @@ mod execute { Addr::unchecked(COLLECTION), &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.token_uri, None); @@ -580,7 +588,7 @@ mod execute { Addr::unchecked(COLLECTION), &(Sg721NameQueryMsg::NftInfo { token_id: name2.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.token_uri, Some(user.to_string())); @@ -594,7 +602,7 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -605,7 +613,7 @@ mod execute { Addr::unchecked(COLLECTION), &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.token_uri, None); @@ -619,7 +627,7 @@ mod execute { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -628,7 +636,7 @@ mod execute { Addr::unchecked(COLLECTION), &(SgNameQueryMsg::Name { address: user.to_string(), - }) + }), ); assert!(res.is_err()); } @@ -648,19 +656,17 @@ mod execute { Addr::unchecked(ADMIN2), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); - res.unwrap() - .events.iter() - .for_each(|e| { - if e.ty == "wasm-associate-address" { - assert_eq!(e.attributes[1], attr("name", NAME)); - assert_eq!(e.attributes[2], attr("owner", ADMIN2)); - assert_eq!(e.attributes[3], attr("address", MINTER)); - } - }); + res.unwrap().events.iter().for_each(|e| { + if e.ty == "wasm-associate-address" { + assert_eq!(e.attributes[1], attr("name", NAME)); + assert_eq!(e.attributes[2], attr("owner", ADMIN2)); + assert_eq!(e.attributes[3], attr("address", MINTER)); + } + }); } #[test] @@ -678,7 +684,7 @@ mod execute { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_err()); } @@ -698,7 +704,7 @@ mod execute { Addr::unchecked(USER2), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_err()); } @@ -722,7 +728,7 @@ mod execute { Addr::unchecked(whitelist.to_string()), &(IncludesAddress { address: USER.to_string(), - }) + }), ) .unwrap(); dbg!(included, whitelist); @@ -1013,7 +1019,7 @@ mod query { MKT, &(MarketplaceQueryMsg::RenewalQueue { time: app.block_info().time.plus_seconds(SECONDS_PER_YEAR), - }) + }), ) .unwrap(); assert_eq!(res.len(), 2); @@ -1029,12 +1035,13 @@ mod query { // mint 1000 funds to user let renewal_fee = coins(1000_u128, NATIVE_DENOM); - app.sudo( - CwSudoMsg::Bank({ BankSudo::Mint { - to_address: USER.to_string(), - amount: renewal_fee.clone(), - } }) - ).unwrap(); + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: USER.to_string(), + amount: renewal_fee.clone(), + } + })) + .unwrap(); // user renew domain name let msg = MarketplaceExecuteMsg::FundRenewal { @@ -1045,11 +1052,15 @@ mod query { Addr::unchecked(USER), Addr::unchecked(MKT), &msg, - &renewal_fee - ).unwrap(); + &renewal_fee, + ) + .unwrap(); // verify user have no money - let res = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap(); + let res = app + .wrap() + .query_balance(USER.to_string(), NATIVE_DENOM) + .unwrap(); assert_eq!(res.amount, Uint128::new(0)); // user sends the nft to bob @@ -1063,11 +1074,16 @@ mod query { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] - ).unwrap(); + &[], + ) + .unwrap(); // the renewal fee should refunded back to user - let user_balance = app.wrap().query_balance(USER.to_string(), NATIVE_DENOM).unwrap().amount; + let user_balance = app + .wrap() + .query_balance(USER.to_string(), NATIVE_DENOM) + .unwrap() + .amount; assert_eq!(user_balance, renewal_fee[0].amount); let bob_balance = app.wrap().query_balance(bob, NATIVE_DENOM).unwrap().amount; @@ -1086,7 +1102,7 @@ mod query { COLLECTION, &(SgNameQueryMsg::Name { address: USER.to_string(), - }) + }), ); assert!(res.is_err()); @@ -1104,7 +1120,7 @@ mod query { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1114,7 +1130,7 @@ mod query { COLLECTION, &(SgNameQueryMsg::Name { address: cosmos_address.to_string(), - }) + }), ) .unwrap(); assert_eq!(res, "yoyo".to_string()); @@ -1130,18 +1146,20 @@ mod query { .unwrap(); assert_eq!( res.start_trading_time.unwrap(), - app.block_info().time.plus_seconds(TRADING_START_TIME_OFFSET_IN_SECONDS) + app.block_info() + .time + .plus_seconds(TRADING_START_TIME_OFFSET_IN_SECONDS) ); } } mod collection { - use cosmwasm_std::{ to_binary, StdResult }; + use cosmwasm_std::{to_binary, StdResult}; use cw721::NftInfoResponse; use cw_controllers::AdminResponse; use name_marketplace::state::Ask; - use sg721_name::{ msg::QueryMsg as Sg721NameQueryMsg, state::SudoParams }; - use sg_name::{ Metadata, TextRecord, NFT }; + use sg721_name::{msg::QueryMsg as Sg721NameQueryMsg, state::SudoParams}; + use sg_name::{Metadata, TextRecord, NFT}; use super::*; @@ -1154,7 +1172,7 @@ mod collection { Addr::unchecked(from), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1177,7 +1195,7 @@ mod collection { Addr::unchecked(from), Addr::unchecked(COLLECTION), &send_msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1206,7 +1224,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1217,7 +1235,7 @@ mod collection { COLLECTION, &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1232,7 +1250,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); // fails cuz caller is not oracle verifier assert!(res.is_err()); @@ -1241,7 +1259,7 @@ mod collection { Addr::unchecked(VERIFIER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1256,7 +1274,7 @@ mod collection { COLLECTION, &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1281,7 +1299,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1295,7 +1313,7 @@ mod collection { Addr::unchecked(VERIFIER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1306,7 +1324,7 @@ mod collection { COLLECTION, &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1336,7 +1354,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1347,7 +1365,7 @@ mod collection { COLLECTION, &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1366,7 +1384,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1377,7 +1395,7 @@ mod collection { COLLECTION, &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1390,7 +1408,7 @@ mod collection { COLLECTION, &(Sg721NameQueryMsg::NftInfo { token_id: NAME.to_string(), - }) + }), ) .unwrap(); assert_eq!(res.extension.records[0].name, name.to_string()); @@ -1403,7 +1421,7 @@ mod collection { COLLECTION, &(Sg721NameQueryMsg::ImageNFT { name: NAME.to_string(), - }) + }), ) .unwrap(); assert!(res.is_none()); @@ -1450,7 +1468,7 @@ mod collection { Addr::unchecked(USER2), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1480,7 +1498,7 @@ mod collection { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1520,7 +1538,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_err()); @@ -1548,7 +1566,7 @@ mod collection { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_err()); @@ -1578,7 +1596,7 @@ mod collection { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1595,7 +1613,7 @@ mod collection { Addr::unchecked(user), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_err()); @@ -1635,8 +1653,8 @@ mod collection { } mod whitelist { - use crate::{ msg::QueryMsg, contract::WhitelistType }; - use whitelist_updatable::{ msg::QueryMsg as WhitelistQueryMsg, state::Config }; + use crate::{contract::WhitelistType, msg::QueryMsg}; + use whitelist_updatable::{msg::QueryMsg as WhitelistQueryMsg, state::Config}; use super::*; @@ -1693,7 +1711,7 @@ mod whitelist { "addr0002".to_string(), USER.to_string(), USER2.to_string(), - ADMIN2.to_string() + ADMIN2.to_string(), ], mint_discount_bps: None, }; @@ -1710,7 +1728,7 @@ mod whitelist { Addr::unchecked(ADMIN.to_string()), Addr::unchecked(MINTER.to_string()), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1726,7 +1744,7 @@ mod whitelist { WHITELIST, &(WhitelistQueryMsg::MintCount { address: USER.to_string(), - }) + }), ) .unwrap(); assert_eq!(res, 1); @@ -1738,7 +1756,7 @@ mod whitelist { WHITELIST2, &(WhitelistQueryMsg::MintCount { address: USER.to_string(), - }) + }), ) .unwrap(); assert_eq!(res, 0); @@ -1769,7 +1787,7 @@ mod whitelist { "addr0002".to_string(), USER.to_string(), USER2.to_string(), - ADMIN2.to_string() + ADMIN2.to_string(), ], mint_discount_bps: Some(3500), }; @@ -1787,7 +1805,7 @@ mod whitelist { Addr::unchecked(ADMIN.to_string()), Addr::unchecked(MINTER.to_string()), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1827,7 +1845,7 @@ mod whitelist { Addr::unchecked(ADMIN2), Addr::unchecked(WHITELIST), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -1862,7 +1880,7 @@ mod public_start_time { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), ); // try pub mint with whitelists before start time @@ -1890,7 +1908,7 @@ mod public_start_time { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), ); // remove whitelist(s) @@ -1904,7 +1922,10 @@ mod public_start_time { // default start time is PUBLIC_MINT_START_TIME_IN_SECONDS let msg = QueryMsg::Config {}; let res: Config = app.wrap().query_wasm_smart(MINTER, &msg).unwrap(); - assert_eq!(res.public_mint_start_time, PUBLIC_MINT_START_TIME_IN_SECONDS); + assert_eq!( + res.public_mint_start_time, + PUBLIC_MINT_START_TIME_IN_SECONDS + ); // update start time to PUBLIC_MINT_START_TIME_IN_SECONDS - 1 let msg = ExecuteMsg::UpdateConfig { @@ -1918,7 +1939,10 @@ mod public_start_time { // check start time let msg = QueryMsg::Config {}; let res: Config = app.wrap().query_wasm_smart(MINTER, &msg).unwrap(); - assert_eq!(res.public_mint_start_time, PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)); + assert_eq!( + res.public_mint_start_time, + PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1) + ); // mint succeeds w new mint start time let res = mint_and_list(&mut app, NAME, USER, None); @@ -1930,7 +1954,7 @@ mod public_start_time { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.plus_seconds(1)) + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.plus_seconds(1)), ); // mint succeeds w new mint start time @@ -1944,14 +1968,14 @@ mod associate_address { use collection::transfer; - use sg721::{ CollectionInfo, InstantiateMsg as Sg721InstantiateMsg }; + use sg721::{CollectionInfo, InstantiateMsg as Sg721InstantiateMsg}; #[test] fn transfer_to_eoa() { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), ); let nft_id = app.store_code(contract_nft()); @@ -1977,7 +2001,7 @@ mod associate_address { &init_msg, &[], "NFT", - Some(ADMIN.to_string()) + Some(ADMIN.to_string()), ) .unwrap(); @@ -1996,7 +2020,7 @@ mod associate_address { Addr::unchecked(nft_addr.clone()), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); @@ -2011,7 +2035,7 @@ mod associate_address { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), ); let nft_id = app.store_code(contract_nft()); @@ -2042,7 +2066,7 @@ mod associate_address { &creator_init_msg, &[], "NFT", - Some(USER.to_string()) + Some(USER.to_string()), ) .unwrap(); @@ -2078,7 +2102,7 @@ mod associate_address { Addr::unchecked(USER), Addr::unchecked(COLLECTION), &msg, - &[] + &[], ); assert!(res.is_ok()); } @@ -2087,7 +2111,7 @@ mod associate_address { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), ); let nft_id = app.store_code(contract_nft()); @@ -2118,7 +2142,7 @@ mod associate_address { &creator_init_msg, &[], "NFT", - Some(USER.to_string()) + Some(USER.to_string()), ) .unwrap(); @@ -2151,10 +2175,18 @@ mod associate_address { address: Some(collection_with_no_admin_addr.to_string()), }; let res = app - .execute_contract(Addr::unchecked(USER4), Addr::unchecked(COLLECTION), &msg, &[]) + .execute_contract( + Addr::unchecked(USER4), + Addr::unchecked(COLLECTION), + &msg, + &[], + ) .map_err(|e| e.downcast::().unwrap()) .unwrap_err(); - assert!(matches!(res, sg721_name::ContractError::UnauthorizedCreatorOrAdmin {})) + assert!(matches!( + res, + sg721_name::ContractError::UnauthorizedCreatorOrAdmin {} + )) } #[test] @@ -2162,7 +2194,7 @@ mod associate_address { let mut app = instantiate_contracts( None, Some(ADMIN.to_string()), - Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)) + Some(PUBLIC_MINT_START_TIME_IN_SECONDS.minus_seconds(1)), ); let nft_id = app.store_code(contract_nft()); @@ -2189,7 +2221,7 @@ mod associate_address { &creator_init_msg, &[], "NFT", - Some(USER.to_string()) + Some(USER.to_string()), ) .unwrap(); @@ -2202,9 +2234,17 @@ mod associate_address { address: Some(contract_with_an_admin.to_string()), }; let res = app - .execute_contract(Addr::unchecked(USER4), Addr::unchecked(COLLECTION), &msg, &[]) + .execute_contract( + Addr::unchecked(USER4), + Addr::unchecked(COLLECTION), + &msg, + &[], + ) .map_err(|e| e.downcast::().unwrap()) .unwrap_err(); - assert!(matches!(res, sg721_name::ContractError::UnauthorizedCreatorOrAdmin {})) + assert!(matches!( + res, + sg721_name::ContractError::UnauthorizedCreatorOrAdmin {} + )) } } diff --git a/contracts/name-minter/src/msg.rs b/contracts/name-minter/src/msg.rs index eff235be..1d25a176 100644 --- a/contracts/name-minter/src/msg.rs +++ b/contracts/name-minter/src/msg.rs @@ -29,9 +29,15 @@ pub enum ExecuteMsg { /// Admin can pause minting during whitelist switching Pause { pause: bool }, /// Add a whitelist address - AddWhitelist { address: String, whitelist_type: Option }, + AddWhitelist { + address: String, + whitelist_type: Option, + }, /// Remove a whitelist address - RemoveWhitelist { address: String, whitelist_type: Option }, + RemoveWhitelist { + address: String, + whitelist_type: Option, + }, /// Update config, only callable by admin UpdateConfig { config: Config }, } diff --git a/contracts/name-minter/src/query.rs b/contracts/name-minter/src/query.rs index 013b9b93..34510a7d 100644 --- a/contracts/name-minter/src/query.rs +++ b/contracts/name-minter/src/query.rs @@ -5,7 +5,7 @@ use sg_name_minter::{Config, SudoParams}; use crate::{ msg::QueryMsg, - state::{ADMIN, CONFIG, NAME_COLLECTION, SUDO_PARAMS, WHITELISTS, WhitelistContract}, + state::{WhitelistContract, ADMIN, CONFIG, NAME_COLLECTION, SUDO_PARAMS, WHITELISTS}, }; #[cfg_attr(not(feature = "library"), entry_point)] @@ -21,10 +21,13 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { fn query_whitelists(deps: Deps) -> StdResult> { let whitelists = WHITELISTS.load(deps.storage)?; - Ok(whitelists.iter().map(|w| match w { - WhitelistContract::Updatable(contract) => contract.addr(), - WhitelistContract::Flatrate(contract) => contract.addr(), - }).collect()) + Ok(whitelists + .iter() + .map(|w| match w { + WhitelistContract::Updatable(contract) => contract.addr(), + WhitelistContract::Flatrate(contract) => contract.addr(), + }) + .collect()) } fn query_collection(deps: Deps) -> StdResult { diff --git a/contracts/name-minter/src/state.rs b/contracts/name-minter/src/state.rs index 198986b1..1d49ffd1 100644 --- a/contracts/name-minter/src/state.rs +++ b/contracts/name-minter/src/state.rs @@ -1,10 +1,10 @@ use cosmwasm_std::Addr; use cw_controllers::Admin; use cw_storage_plus::Item; +use serde::{Deserialize, Serialize}; use sg_name_minter::{Config, SudoParams}; use whitelist_updatable::helpers::WhitelistUpdatableContract; use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; -use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize)] pub enum WhitelistContract { diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index 75b2be2a..c1af46ef 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -1,27 +1,16 @@ -use crate::state::{ Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST }; +use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, - Addr, - Binary, - Decimal, - Deps, - DepsMut, - Empty, - Env, - Event, - MessageInfo, - Order, - StdError, - StdResult, + to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + StdError, StdResult, }; use cw2::set_contract_version; use semver::Version; use sg_name_minter::SgNameMinterQueryMsg; use crate::error::ContractError; -use crate::msg::{ ExecuteMsg, InstantiateMsg, QueryMsg }; +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; use cw_utils::nonpayable; use sg_std::Response; @@ -34,7 +23,7 @@ pub fn instantiate( deps: DepsMut, env: Env, info: MessageInfo, - mut msg: InstantiateMsg + mut msg: InstantiateMsg, ) -> Result { nonpayable(&info)?; set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; @@ -58,11 +47,9 @@ pub fn instantiate( TOTAL_ADDRESS_COUNT.save(deps.storage, &count)?; CONFIG.save(deps.storage, &config)?; - Ok( - Response::default() - .add_attribute("action", "instantiate") - .add_attribute("whitelist_addr", env.contract.address.to_string()) - ) + Ok(Response::default() + .add_attribute("action", "instantiate") + .add_attribute("whitelist_addr", env.contract.address.to_string())) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -70,7 +57,7 @@ pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg + msg: ExecuteMsg, ) -> Result { match msg { ExecuteMsg::UpdateAdmin { new_admin } => execute_update_admin(deps, info, new_admin), @@ -89,7 +76,7 @@ pub fn execute( pub fn execute_update_admin( deps: DepsMut, info: MessageInfo, - new_admin: String + new_admin: String, ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -108,7 +95,7 @@ pub fn execute_update_admin( pub fn execute_add_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec + mut addresses: Vec, ) -> Result { let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; @@ -143,7 +130,7 @@ pub fn execute_add_addresses( pub fn execute_remove_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec + mut addresses: Vec, ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; @@ -179,17 +166,16 @@ pub fn execute_process_address( deps: DepsMut, env: Env, info: MessageInfo, - address: String + address: String, ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; let minter = info.sender; // query whitelists from minter to see if this one exists... - let whitelists: Vec = deps.querier.query_wasm_smart( - &minter, - &(SgNameMinterQueryMsg::Whitelists {}) - )?; + let whitelists: Vec = deps + .querier + .query_wasm_smart(&minter, &(SgNameMinterQueryMsg::Whitelists {}))?; if !whitelists.contains(&env.contract.address) { return Err(ContractError::Unauthorized {}); } @@ -218,7 +204,7 @@ pub fn execute_process_address( pub fn execute_update_per_address_limit( deps: DepsMut, info: MessageInfo, - limit: u32 + limit: u32, ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -242,7 +228,8 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result>(); @@ -320,12 +307,13 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result new_version { return Err(StdError::generic_err("Cannot upgrade to a previous contract version").into()); diff --git a/contracts/whitelist-updatable-flatrate/src/msg.rs b/contracts/whitelist-updatable-flatrate/src/msg.rs index 4f11a6b5..e7d5d366 100644 --- a/contracts/whitelist-updatable-flatrate/src/msg.rs +++ b/contracts/whitelist-updatable-flatrate/src/msg.rs @@ -1,4 +1,4 @@ -use cosmwasm_schema::{ cw_serde, QueryResponses }; +use cosmwasm_schema::{cw_serde, QueryResponses}; use crate::state::Config; @@ -33,21 +33,22 @@ pub enum ExecuteMsg { #[cw_serde] #[derive(QueryResponses)] pub enum QueryMsg { - #[returns(Config)] Config {}, - #[returns(bool)] IncludesAddress { - address: String, - }, - #[returns(u64)] MintCount { - address: String, - }, + #[returns(Config)] + Config {}, + #[returns(bool)] + IncludesAddress { address: String }, + #[returns(u64)] + MintCount { address: String }, /// Avoid processing addresses that will fail. Includes address and under per address limit #[returns(bool)] - IsProcessable { - address: String, - }, - #[returns(cw_controllers::AdminResponse)] Admin {}, - #[returns(u64)] AddressCount {}, - #[returns(u64)] PerAddressLimit {}, + IsProcessable { address: String }, + #[returns(cw_controllers::AdminResponse)] + Admin {}, + #[returns(u64)] + AddressCount {}, + #[returns(u64)] + PerAddressLimit {}, // Mint discount converts bps to decimal percentage - #[returns(u64)] MintDiscountAmount {}, + #[returns(u64)] + MintDiscountAmount {}, } diff --git a/contracts/whitelist-updatable-flatrate/src/state.rs b/contracts/whitelist-updatable-flatrate/src/state.rs index 1233d44f..e7bbb1d1 100644 --- a/contracts/whitelist-updatable-flatrate/src/state.rs +++ b/contracts/whitelist-updatable-flatrate/src/state.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; -use cosmwasm_std::{ Addr, Decimal, Uint128 }; -use cw_storage_plus::{ Item, Map }; +use cosmwasm_std::{Addr, Decimal, Uint128}; +use cw_storage_plus::{Item, Map}; #[cw_serde] pub struct Config { diff --git a/contracts/whitelist-updatable/src/contract.rs b/contracts/whitelist-updatable/src/contract.rs index 3f69db3d..138d80d3 100644 --- a/contracts/whitelist-updatable/src/contract.rs +++ b/contracts/whitelist-updatable/src/contract.rs @@ -1,27 +1,16 @@ -use crate::state::{ Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST }; +use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, - Addr, - Binary, - Decimal, - Deps, - DepsMut, - Empty, - Env, - Event, - MessageInfo, - Order, - StdError, - StdResult, + to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + StdError, StdResult, }; use cw2::set_contract_version; use semver::Version; use sg_name_minter::SgNameMinterQueryMsg; use crate::error::ContractError; -use crate::msg::{ ExecuteMsg, InstantiateMsg, QueryMsg }; +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; use cw_utils::nonpayable; use sg_std::Response; @@ -34,7 +23,7 @@ pub fn instantiate( deps: DepsMut, env: Env, info: MessageInfo, - mut msg: InstantiateMsg + mut msg: InstantiateMsg, ) -> Result { nonpayable(&info)?; set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; @@ -59,11 +48,9 @@ pub fn instantiate( TOTAL_ADDRESS_COUNT.save(deps.storage, &count)?; CONFIG.save(deps.storage, &config)?; - Ok( - Response::default() - .add_attribute("action", "instantiate") - .add_attribute("whitelist_addr", env.contract.address.to_string()) - ) + Ok(Response::default() + .add_attribute("action", "instantiate") + .add_attribute("whitelist_addr", env.contract.address.to_string())) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -71,7 +58,7 @@ pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg + msg: ExecuteMsg, ) -> Result { match msg { ExecuteMsg::UpdateAdmin { new_admin } => execute_update_admin(deps, info, new_admin), @@ -90,7 +77,7 @@ pub fn execute( pub fn execute_update_admin( deps: DepsMut, info: MessageInfo, - new_admin: String + new_admin: String, ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -109,7 +96,7 @@ pub fn execute_update_admin( pub fn execute_add_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec + mut addresses: Vec, ) -> Result { let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; @@ -144,7 +131,7 @@ pub fn execute_add_addresses( pub fn execute_remove_addresses( deps: DepsMut, info: MessageInfo, - mut addresses: Vec + mut addresses: Vec, ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; @@ -180,17 +167,16 @@ pub fn execute_process_address( deps: DepsMut, env: Env, info: MessageInfo, - address: String + address: String, ) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; let minter = info.sender; // query whitelists from minter to see if this one exists... - let whitelists: Vec = deps.querier.query_wasm_smart( - &minter, - &(SgNameMinterQueryMsg::Whitelists {}) - )?; + let whitelists: Vec = deps + .querier + .query_wasm_smart(&minter, &(SgNameMinterQueryMsg::Whitelists {}))?; if !whitelists.contains(&env.contract.address) { return Err(ContractError::Unauthorized {}); } @@ -219,7 +205,7 @@ pub fn execute_process_address( pub fn execute_update_per_address_limit( deps: DepsMut, info: MessageInfo, - limit: u32 + limit: u32, ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; @@ -243,7 +229,8 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result>(); @@ -312,7 +299,9 @@ pub fn query_is_processable(deps: Deps, address: String) -> StdResult { pub fn query_mint_discount_percent(deps: Deps) -> StdResult> { let config = CONFIG.load(deps.storage)?; - Ok(config.mint_discount_bps.map(|x| Decimal::from_ratio(x, 10_000u128))) + Ok(config + .mint_discount_bps + .map(|x| Decimal::from_ratio(x, 10_000u128))) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -321,12 +310,13 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result new_version { return Err(StdError::generic_err("Cannot upgrade to a previous contract version").into()); From b30624e3d748935446f8201225d570e2f36da2f3 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 14 Jan 2024 22:45:45 -0700 Subject: [PATCH 27/91] remove unused imports --- contracts/whitelist-updatable-flatrate/src/contract.rs | 4 ++-- contracts/whitelist-updatable-flatrate/src/state.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index c1af46ef..3365f704 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -2,8 +2,8 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, - StdError, StdResult, + to_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, + StdResult, }; use cw2::set_contract_version; use semver::Version; diff --git a/contracts/whitelist-updatable-flatrate/src/state.rs b/contracts/whitelist-updatable-flatrate/src/state.rs index e7bbb1d1..d28dbb08 100644 --- a/contracts/whitelist-updatable-flatrate/src/state.rs +++ b/contracts/whitelist-updatable-flatrate/src/state.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Decimal, Uint128}; +use cosmwasm_std::Addr; use cw_storage_plus::{Item, Map}; #[cw_serde] From 9b2fd7553acb0d8872c20fc9b1e7b05c150b86be Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 14 Jan 2024 22:53:29 -0700 Subject: [PATCH 28/91] remove unused imports, derive Eq too --- contracts/name-minter/src/contract.rs | 2 +- contracts/name-minter/src/integration_tests.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index b15e4fd6..5f6c20e9 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -248,7 +248,7 @@ pub fn execute_pause( Ok(Response::new().add_event(event)) } -#[derive(PartialEq, Clone, JsonSchema, Deserialize, Debug, Serialize)] +#[derive(Eq, PartialEq, Clone, JsonSchema, Deserialize, Debug, Serialize)] pub enum WhitelistType { Updatable, Flatrate, diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index a53ff9f6..dc40834d 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1653,7 +1653,7 @@ mod collection { } mod whitelist { - use crate::{contract::WhitelistType, msg::QueryMsg}; + use crate::msg::QueryMsg; use whitelist_updatable::{msg::QueryMsg as WhitelistQueryMsg, state::Config}; use super::*; From 79411999d9075d9d0dfa1d99a3375bb0643d3914 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 15 Jan 2024 19:39:47 -0700 Subject: [PATCH 29/91] regenerate schema --- contracts/name-minter/schema/name-minter.json | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/contracts/name-minter/schema/name-minter.json b/contracts/name-minter/schema/name-minter.json index 717aba04..cd02e268 100644 --- a/contracts/name-minter/schema/name-minter.json +++ b/contracts/name-minter/schema/name-minter.json @@ -156,6 +156,16 @@ "properties": { "address": { "type": "string" + }, + "whitelist_type": { + "anyOf": [ + { + "$ref": "#/definitions/WhitelistType" + }, + { + "type": "null" + } + ] } }, "additionalProperties": false @@ -178,6 +188,16 @@ "properties": { "address": { "type": "string" + }, + "whitelist_type": { + "anyOf": [ + { + "$ref": "#/definitions/WhitelistType" + }, + { + "type": "null" + } + ] } }, "additionalProperties": false @@ -232,6 +252,13 @@ "Uint64": { "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", "type": "string" + }, + "WhitelistType": { + "type": "string", + "enum": [ + "Updatable", + "Flatrate" + ] } } }, From a8cbd618b8aed9f14deba77397734f3b7055078b Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 15 Jan 2024 20:15:34 -0700 Subject: [PATCH 30/91] try updating the rust version in CI --- .circleci/config.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 494146f5..b6f316c2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ workflows: jobs: contract_marketplace: docker: - - image: rust:1.65.0 + - image: rust:1.70.0 working_directory: ~/project/contracts/marketplace steps: - checkout: @@ -31,7 +31,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-marketplace-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-marketplace-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -53,11 +53,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-marketplace-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-marketplace-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} contract_name-minter: docker: - - image: rust:1.65.0 + - image: rust:1.70.0 working_directory: ~/project/contracts/name-minter steps: - checkout: @@ -67,7 +67,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-name-minter-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-name-minter-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -89,11 +89,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-name-minter-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-name-minter-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} contract_sg721-name: docker: - - image: rust:1.65.0 + - image: rust:1.70.0 working_directory: ~/project/contracts/sg721-name steps: - checkout: @@ -103,7 +103,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-sg721-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-sg721-name-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -125,11 +125,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-sg721-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-sg721-name-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} package_sg-name: docker: - - image: rust:1.65.0 + - image: rust:1.70.0 working_directory: ~/project/package/sg-name steps: - checkout: @@ -139,7 +139,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-sg-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-sg-name-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} - run: name: Unit Tests environment: @@ -149,11 +149,11 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-sg-name-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-sg-name-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} lint: docker: - - image: rust:1.65.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -161,7 +161,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-lint-rust:1.65.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-lint-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -180,7 +180,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-lint-rust:1.65.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-lint-rust:1.70.0-{{ checksum "Cargo.lock" }} # This runs one time on the top level to ensure all contracts compile properly into wasm. # We don't run the wasm build per contract build, and then reuse a lot of the same dependencies, so this speeds up CI time @@ -188,7 +188,7 @@ jobs: # We also sanity-check the resultant wasm files. wasm-build: docker: - - image: rust:1.65.0 + - image: rust:1.70.0 steps: - checkout: path: ~/project @@ -197,7 +197,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-wasm-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + - cargocache-wasm-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown @@ -217,7 +217,7 @@ jobs: paths: - /usr/local/cargo/registry - target - key: cargocache-wasm-rust:1.65.0-{{ checksum "~/project/Cargo.lock" }} + key: cargocache-wasm-rust:1.70.0-{{ checksum "~/project/Cargo.lock" }} - run: name: Check wasm contracts command: | From eed1a4b0712c59d571542b9be95340629755f97d Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 15 Jan 2024 20:19:44 -0700 Subject: [PATCH 31/91] remove one of the --lib flags per the CI error --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b6f316c2..43738ade 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -207,7 +207,7 @@ jobs: for C in ./contracts/*/ do echo "Compiling `basename $C`..." - (cd $C && cargo build --release --lib --target wasm32-unknown-unknown --locked --lib) + (cd $C && cargo build --release --lib --target wasm32-unknown-unknown --locked) done - run: name: Install check_contract From ec35eef2f8deae7ccb7b820a8cc4e65ff343efd0 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 17 Jan 2024 06:22:18 -0700 Subject: [PATCH 32/91] update lock --- Cargo.lock | 685 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 442 insertions(+), 243 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fb36e233..6fdaee34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,11 +2,22 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ahash" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "anyhow" -version = "1.0.58" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "base16ct" @@ -14,17 +25,29 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" -version = "0.13.0" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdca834647821e0b13d9539a8634eb62d3501b6b6c2cec1722786ee6671b851" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "block-buffer" @@ -37,24 +60,30 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab9008b6bb9fc80b5277f2fe481c09e828743d9151203e804583eb4c9e15b31d" + [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cfg-if" @@ -64,37 +93,38 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecd74d3a0041114110d1260f77fcb644c5d2403549b37096c44f0e643a5177" +checksum = "8ed6aa9f904de106fa16443ad14ec2abe75e94ba003bb61c681c0e43d4c58d2a" dependencies = [ - "digest 0.10.5", + "digest 0.10.7", + "ecdsa 0.16.9", "ed25519-zebra", - "k256", - "rand_core 0.6.3", + "k256 0.13.3", + "rand_core 0.6.4", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5abeeb891e6d0098402e4d3d042f90451db52651d2fe14b170e69a1dd3e4115" +checksum = "40abec852f3d4abec6d44ead9a58b78325021a1ead1e7229c3471414e57b2e49" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9118e36843df6648fd0a626c46438f87038f296ec750cef3832cafc483c483f9" +checksum = "b166215fbfe93dc5575bae062aa57ae7bb41121cffe53bac33b033257949d2a9" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -105,22 +135,24 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78d6fc9854ac14e46cb69b0f396547893f93d2847aef975950ebbe73342324f3" +checksum = "8bf12f8e20bb29d1db66b7ca590bc2f670b548d21e9be92499bc0f9022a994a8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5034c772c1369b160731aa00bb81f93733ab2884928edd8d588733d607ac5af4" +checksum = "ad011ae7447188e26e4a7dbca2fcd0fc186aa21ae5c86df0503ea44c78f9e469" dependencies = [ "base64", + "bech32", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", @@ -129,34 +161,40 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.6", + "sha2 0.10.8", + "static_assertions", "thiserror", - "uint", ] [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] -name = "crunchy" -version = "0.2.2" +name = "crypto-bigint" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -192,8 +230,8 @@ checksum = "24bd6738c3fd59c87d2f84911c1cad1e4f2d1c58ecaa6e52549b4f78f4ed6f07" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus", - "cw-utils", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", "schemars", "serde", "thiserror", @@ -201,16 +239,17 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.16.0" +version = "0.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7192aec80d0c01a0e5941392eea7e2b7e212ee74ca7f430bfdc899420c055ef6" +checksum = "127c7bb95853b8e828bdab97065c81cb5ddc20f7339180b61b2300565aaa99d1" dependencies = [ "anyhow", "cosmwasm-std", - "cw-storage-plus", - "cw-utils", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", "derivative", "itertools", + "k256 0.11.6", "prost", "schemars", "serde", @@ -223,7 +262,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a3de01064d249a0e7028b63f8168470dac4bcd0c5dc3710d17486f843d1a8" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -237,6 +276,17 @@ dependencies = [ "serde", ] +[[package]] +name = "cw-storage-plus" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + [[package]] name = "cw-utils" version = "0.16.0" @@ -245,7 +295,22 @@ checksum = "d6a84c6c1c0acc3616398eba50783934bd6c964bad6974241eaee3460c8f5b26" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw2", + "cw2 0.16.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", "schemars", "semver", "serde", @@ -260,11 +325,26 @@ checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus", + "cw-storage-plus 0.16.0", "schemars", "serde", ] +[[package]] +name = "cw2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "semver", + "serde", + "thiserror", +] + [[package]] name = "cw721" version = "0.16.0" @@ -273,7 +353,7 @@ checksum = "94a1ea6e6277bdd6dfc043a9b1380697fe29d6e24b072597439523658d21d791" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-utils", + "cw-utils 0.16.0", "schemars", "serde", ] @@ -286,9 +366,9 @@ checksum = "77518e27431d43214cff4cdfbd788a7508f68d9b1f32389e6fce513e7eaccbef" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "cw2", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", "cw721", "schemars", "serde", @@ -297,9 +377,19 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", @@ -313,7 +403,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -327,20 +417,21 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.5" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.3", + "block-buffer 0.10.4", + "const-oid", "crypto-common", "subtle", ] [[package]] name = "dyn-clone" -version = "1.0.6" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140206b78fb2bc3edbcfc9b5ccbd0b30699cfe8d348b8b31b330e47df5291a5a" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" @@ -348,32 +439,46 @@ version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ - "der", - "elliptic-curve", - "rfc6979", - "signature", + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.8", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] name = "ed25519-zebra" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek", + "hashbrown", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.9", - "thiserror", "zeroize", ] [[package]] name = "either" -version = "1.6.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" @@ -381,37 +486,65 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ - "base16ct", - "crypto-bigint", - "der", - "digest 0.10.5", - "ff", + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.5", + "digest 0.10.7", + "ff 0.13.0", "generic-array", - "group", - "pkcs8", - "rand_core 0.6.3", - "sec1", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", "subtle", "zeroize", ] [[package]] name = "ff" -version = "0.12.0" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "matches", "percent-encoding", ] @@ -423,47 +556,57 @@ checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] name = "getrandom" -version = "0.1.16" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", - "wasi 0.9.0+wasi-snapshot-preview1", + "wasi", ] [[package]] -name = "getrandom" -version = "0.2.7" +name = "group" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", ] [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", - "rand_core 0.6.3", + "ff 0.13.0", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + [[package]] name = "hex" version = "0.4.3" @@ -476,34 +619,33 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.5", + "digest 0.10.7", ] [[package]] name = "idna" -version = "0.2.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "k256" @@ -512,22 +654,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" dependencies = [ "cfg-if", - "ecdsa", - "elliptic-curve", - "sha2 0.10.6", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", ] [[package]] -name = "libc" -version = "0.2.126" +name = "k256" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", + "sha2 0.10.8", + "signature 2.2.0", +] [[package]] -name = "matches" -version = "0.1.9" +name = "libc" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "name-marketplace" @@ -537,9 +687,9 @@ dependencies = [ "cosmwasm-std", "cw-multi-test", "cw-storage-macro", - "cw-storage-plus", - "cw-utils", - "cw2", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", "cw721", "cw721-base", "schemars", @@ -566,9 +716,9 @@ dependencies = [ "cw-controllers", "cw-multi-test", "cw-storage-macro", - "cw-storage-plus", - "cw-utils", - "cw2", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", "cw721", "cw721-base", "name-marketplace", @@ -588,6 +738,12 @@ dependencies = [ "whitelist-updatable-flatrate", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + [[package]] name = "opaque-debug" version = "0.3.0" @@ -596,9 +752,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pkcs8" @@ -606,15 +762,25 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" dependencies = [ - "der", - "spki", + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.8", + "spki 0.7.3", ] [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] @@ -639,14 +805,14 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.20" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -656,41 +822,48 @@ name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.7", + "getrandom", ] [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ - "crypto-bigint", + "crypto-bigint 0.4.9", "hmac", "zeroize", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "schemars" -version = "0.8.11" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5fb6c61f29e723026dc8e923d94c694313212abbecbbe5f55a7748eec5b307" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "dyn-clone", "schemars_derive", @@ -700,14 +873,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.11" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f188d036977451159430f3b8dc82ec76364a42b7e289c2b18a9a18f4470058e9" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -716,47 +889,61 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ - "base16ct", - "der", + "base16ct 0.1.1", + "der 0.6.1", "generic-array", - "pkcs8", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.8", + "generic-array", + "pkcs8 0.10.2", "subtle", "zeroize", ] [[package]] name = "semver" -version = "1.0.13" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.145" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.145" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.48", ] [[package]] @@ -767,14 +954,14 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "itoa", "ryu", @@ -783,14 +970,14 @@ dependencies = [ [[package]] name = "sg-controllers" -version = "0.22.9" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65a127edcada99ad543582a31b04998b1d6758b6b7cb12830ce98f150ea11a63" +checksum = "073a918d575f4513901c19a311a5fbaf3a7806594500fb7a3b77690720d3fc9e" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus", - "cw-utils", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", "schemars", "serde", "sg-std", @@ -799,9 +986,9 @@ dependencies = [ [[package]] name = "sg-multi-test" -version = "0.22.9" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4954fddfcd9faaa9ffc9fd5c28b26890dfa5b6f85482ef603a9ae313a17dc3" +checksum = "7704c3607bcac9db6c2fc7810d4647268f29c7ea4368648846cbe6bef2bec2be" dependencies = [ "anyhow", "cosmwasm-std", @@ -856,13 +1043,13 @@ dependencies = [ [[package]] name = "sg-std" -version = "0.22.9" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fc0a91b72ca7490db1cbccafee08d3a4d633d565077a894d5954550d5d86747" +checksum = "bd076abea035a2da34a770eb7a239a4fbffa59d3a193ab91e07fb81583937c5c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-utils", + "cw-utils 0.16.0", "cw721", "schemars", "serde", @@ -881,12 +1068,12 @@ dependencies = [ [[package]] name = "sg1" -version = "0.22.9" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e73daf8b8679a082bc79a6e80769ccbacf3ca82282e96e5d218a0903435b6f8" +checksum = "8405692379911d16534d515f6848a52b85920f401de6414a57ef7a108bd5d67b" dependencies = [ "cosmwasm-std", - "cw-utils", + "cw-utils 0.16.0", "serde", "sg-std", "thiserror", @@ -894,13 +1081,13 @@ dependencies = [ [[package]] name = "sg721" -version = "0.22.9" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ad3311ed3fddb24ea3f4af6be935d7bc4273044136a5f1b39e665a151eeb4c" +checksum = "4a8c0cb5748e59d506cb7cf375d1f03769f1e3586a1542be8a199730721c6102" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-utils", + "cw-utils 0.16.0", "cw721-base", "serde", "thiserror", @@ -908,15 +1095,15 @@ dependencies = [ [[package]] name = "sg721-base" -version = "0.22.9" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a132e2bfd490e3d115d0fa7d4e181634e2deebdc4cde38e84118fcfc290c3014" +checksum = "a6c3ba2af031105758e21f94e8a1488bf810b33914b7e49d7ef5efcf1936cf96" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "cw2", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", "cw721", "cw721-base", "serde", @@ -933,9 +1120,9 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-controllers", - "cw-storage-plus", - "cw-utils", - "cw2", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", "cw721", "cw721-base", "schemars", @@ -965,23 +1152,33 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.5", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.6.3" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb766570a2825fa972bceff0d195727876a9cdf2460ab2e52d455dc2de47fd9" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest 0.10.5", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -991,7 +1188,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" dependencies = [ "base64ct", - "der", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.8", ] [[package]] @@ -1002,9 +1209,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subtle-encoding" @@ -1017,9 +1224,20 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.98" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -1028,22 +1246,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.48", ] [[package]] @@ -1057,58 +1275,45 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "typenum" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" - -[[package]] -name = "uint" -version = "0.9.3" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "url" -version = "2.2.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] @@ -1118,12 +1323,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1138,9 +1337,9 @@ dependencies = [ "cosmwasm-std", "cw-controllers", "cw-multi-test", - "cw-storage-plus", - "cw-utils", - "cw2", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", "name-minter", "schemars", "semver", @@ -1156,15 +1355,15 @@ dependencies = [ [[package]] name = "whitelist-updatable-flatrate" -version = "1.2.6" +version = "2.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-controllers", "cw-multi-test", - "cw-storage-plus", - "cw-utils", - "cw2", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", "name-minter", "schemars", "semver", @@ -1180,6 +1379,6 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.5.5" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" From fd4d5c014a8d899973886a12f9c9c3d0f823c82a Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 17 Jan 2024 06:38:54 -0700 Subject: [PATCH 33/91] use to_json_vec per CI feedback --- packages/sg-name/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sg-name/src/lib.rs b/packages/sg-name/src/lib.rs index 3276b7f2..7774f61a 100644 --- a/packages/sg-name/src/lib.rs +++ b/packages/sg-name/src/lib.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_vec, Addr}; +use cosmwasm_std::{Addr, to_json_vec}; pub const MAX_TEXT_LENGTH: u32 = 512; @@ -13,7 +13,7 @@ pub struct NFT { impl NFT { pub fn into_json_string(self: &NFT) -> String { - String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() } } @@ -34,7 +34,7 @@ impl TextRecord { } pub fn into_json_string(self: &TextRecord) -> String { - String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() } } @@ -53,7 +53,7 @@ impl Metadata { // and represent it as a type. Note that we have to use the CosmWasm fork // of serde_json to avoid floats. pub fn into_json_string(self: &Metadata) -> String { - String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() } } From e34d2f1dbd3b10cbdd478cac4b647f1ffbc845a6 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 17 Jan 2024 06:43:30 -0700 Subject: [PATCH 34/91] moar linterrrr --- packages/sg-name/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sg-name/src/lib.rs b/packages/sg-name/src/lib.rs index 7774f61a..dee4d3eb 100644 --- a/packages/sg-name/src/lib.rs +++ b/packages/sg-name/src/lib.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{Addr, to_json_vec}; +use cosmwasm_std::{to_json_vec, Addr}; pub const MAX_TEXT_LENGTH: u32 = 512; From 48097b89859bdc1f9bd855a5383f64bea126adc9 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 17 Jan 2024 06:49:56 -0700 Subject: [PATCH 35/91] even.more.linting. --- contracts/whitelist-updatable-flatrate/src/helpers.rs | 10 +++++----- contracts/whitelist-updatable/src/helpers.rs | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs index b1b525ca..732e409c 100644 --- a/contracts/whitelist-updatable-flatrate/src/helpers.rs +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, + to_json_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, }; use sg_std::CosmosMsg; @@ -19,7 +19,7 @@ impl WhitelistUpdatableFlatrateContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -37,7 +37,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn includes(&self, querier: &QuerierWrapper, address: String) -> StdResult { let includes: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::IncludesAddress { address })?, + msg: to_json_binary(&QueryMsg::IncludesAddress { address })?, }))?; Ok(includes) } @@ -45,7 +45,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn config(&self, querier: &QuerierWrapper) -> StdResult { let res: Config = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Config {})?, + msg: to_json_binary(&QueryMsg::Config {})?, }))?; Ok(res) @@ -54,7 +54,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn mint_discount_amount(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::MintDiscountAmount {})?, + msg: to_json_binary(&QueryMsg::MintDiscountAmount {})?, })) } } diff --git a/contracts/whitelist-updatable/src/helpers.rs b/contracts/whitelist-updatable/src/helpers.rs index 459b9ea5..9df785c0 100644 --- a/contracts/whitelist-updatable/src/helpers.rs +++ b/contracts/whitelist-updatable/src/helpers.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, + to_json_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, }; use sg_std::CosmosMsg; @@ -19,7 +19,7 @@ impl WhitelistUpdatableContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -37,7 +37,7 @@ impl WhitelistUpdatableContract { pub fn includes(&self, querier: &QuerierWrapper, address: String) -> StdResult { let includes: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::IncludesAddress { address })?, + msg: to_json_binary(&QueryMsg::IncludesAddress { address })?, }))?; Ok(includes) } @@ -45,7 +45,7 @@ impl WhitelistUpdatableContract { pub fn config(&self, querier: &QuerierWrapper) -> StdResult { let res: Config = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Config {})?, + msg: to_json_binary(&QueryMsg::Config {})?, }))?; Ok(res) @@ -54,7 +54,7 @@ impl WhitelistUpdatableContract { pub fn mint_discount_percent(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::MintDiscountPercent {})?, + msg: to_json_binary(&QueryMsg::MintDiscountPercent {})?, })) } } From 01185e827e83e734930e6c3e238f1ff073056308 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 17 Jan 2024 06:59:13 -0700 Subject: [PATCH 36/91] lots more linter --- contracts/marketplace/src/execute.rs | 6 +-- contracts/marketplace/src/helpers.rs | 8 ++-- contracts/marketplace/src/hooks.rs | 6 +-- contracts/marketplace/src/msg.rs | 14 +++--- contracts/marketplace/src/query.rs | 44 ++++++++++--------- contracts/name-minter/src/contract.rs | 12 ++--- contracts/name-minter/src/helpers.rs | 8 ++-- .../name-minter/src/integration_tests.rs | 4 +- contracts/name-minter/src/query.rs | 12 ++--- contracts/sg721-name/src/contract.rs | 10 ++--- contracts/sg721-name/src/helpers.rs | 10 ++--- contracts/sg721-name/src/lib.rs | 18 ++++---- contracts/sg721-name/src/unit_tests.rs | 15 +++---- .../src/contract.rs | 22 ++++++---- contracts/whitelist-updatable/src/contract.rs | 24 +++++----- 15 files changed, 112 insertions(+), 101 deletions(-) diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 45f99259..e5a1251f 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -8,8 +8,8 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, coins, ensure, ensure_eq, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, - Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, + coin, coins, ensure, ensure_eq, to_json_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, + Env, Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721::{Cw721ExecuteMsg, OwnerOfResponse}; @@ -624,7 +624,7 @@ pub fn finalize_sale( let exec_cw721_transfer = WasmMsg::Execute { contract_addr: collection.to_string(), - msg: to_binary(&cw721_transfer_msg)?, + msg: to_json_binary(&cw721_transfer_msg)?, funds: vec![], }; res.messages.push(SubMsg::new(exec_cw721_transfer)); diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 3d3f6c23..7c04667d 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -8,7 +8,7 @@ use crate::{ }; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - coins, ensure, to_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, + coins, ensure, to_json_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, }; use cw721::Cw721ExecuteMsg; @@ -27,7 +27,7 @@ impl NameMarketplaceContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -45,7 +45,7 @@ impl NameMarketplaceContract { pub fn highest_bid(&self, querier: &QuerierWrapper, token_id: &str) -> StdResult> { let res: Option = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::HighestBid { + msg: to_json_binary(&QueryMsg::HighestBid { token_id: token_id.to_string(), })?, }))?; @@ -225,7 +225,7 @@ fn burn_name( ) -> Result { response = response.add_message(WasmMsg::Execute { contract_addr: collection.to_string(), - msg: to_binary(&Cw721ExecuteMsg::Burn { + msg: to_json_binary(&Cw721ExecuteMsg::Burn { token_id: ask.token_id.to_string(), })?, funds: vec![], diff --git a/contracts/marketplace/src/hooks.rs b/contracts/marketplace/src/hooks.rs index eab632e6..2a899ed4 100644 --- a/contracts/marketplace/src/hooks.rs +++ b/contracts/marketplace/src/hooks.rs @@ -55,7 +55,7 @@ pub fn prepare_ask_hook(deps: Deps, ask: &Ask, action: HookAction) -> StdResult< let msg = AskHookMsg { ask: ask.clone() }; let execute = WasmMsg::Execute { contract_addr: h.to_string(), - msg: msg.into_binary(action.clone())?, + msg: msg.into_json_binary(action.clone())?, funds: vec![], }; Ok(SubMsg::reply_on_error(execute, HookReply::Ask as u64)) @@ -73,7 +73,7 @@ pub fn prepare_sale_hook(deps: Deps, ask: &Ask, buyer: Addr) -> StdResult StdResult< let msg = BidHookMsg { bid: bid.clone() }; let execute = WasmMsg::Execute { contract_addr: h.to_string(), - msg: msg.into_binary(action.clone())?, + msg: msg.into_json_binary(action.clone())?, funds: vec![], }; Ok(SubMsg::reply_on_error(execute, HookReply::Bid as u64)) diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index 30008069..ee43c695 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -1,6 +1,6 @@ use crate::state::{Ask, Bid, Id, SudoParams, TokenId}; use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_binary, Addr, Binary, Coin, Decimal, StdResult, Timestamp, Uint128}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Decimal, StdResult, Timestamp, Uint128}; use sg_controllers::HooksResponse; #[cw_serde] @@ -247,9 +247,9 @@ impl SaleHookMsg { } /// serializes the message - pub fn into_binary(self) -> StdResult { + pub fn into_json_binary(self) -> StdResult { let msg = SaleExecuteMsg::SaleHook(self); - to_binary(&msg) + to_json_binary(&msg) } } @@ -277,13 +277,13 @@ impl AskHookMsg { } /// serializes the message - pub fn into_binary(self, action: HookAction) -> StdResult { + pub fn into_json_binary(self, action: HookAction) -> StdResult { let msg = match action { HookAction::Create => AskHookExecuteMsg::AskCreatedHook(self), HookAction::Update => AskHookExecuteMsg::AskUpdatedHook(self), HookAction::Delete => AskHookExecuteMsg::AskDeletedHook(self), }; - to_binary(&msg) + to_json_binary(&msg) } } @@ -306,13 +306,13 @@ impl BidHookMsg { } /// serializes the message - pub fn into_binary(self, action: HookAction) -> StdResult { + pub fn into_json_binary(self, action: HookAction) -> StdResult { let msg = match action { HookAction::Create => BidExecuteMsg::BidCreatedHook(self), HookAction::Update => BidExecuteMsg::BidUpdatedHook(self), HookAction::Delete => BidExecuteMsg::BidDeletedHook(self), }; - to_binary(&msg) + to_json_binary(&msg) } } diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 448504a9..d405af29 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -7,7 +7,7 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, + coin, to_json_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, }; use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; @@ -25,13 +25,15 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { let api = deps.api; match msg { - QueryMsg::Ask { token_id } => to_binary(&query_ask(deps, token_id)?), - QueryMsg::Asks { start_after, limit } => to_binary(&query_asks(deps, start_after, limit)?), + QueryMsg::Ask { token_id } => to_json_binary(&query_ask(deps, token_id)?), + QueryMsg::Asks { start_after, limit } => { + to_json_binary(&query_asks(deps, start_after, limit)?) + } QueryMsg::AsksBySeller { seller, start_after, limit, - } => to_binary(&query_asks_by_seller( + } => to_json_binary(&query_asks_by_seller( deps, api.addr_validate(&seller)?, start_after, @@ -41,7 +43,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { max_time, start_after, limit, - } => to_binary(&query_asks_by_renew_time( + } => to_json_binary(&query_asks_by_renew_time( deps, max_time, start_after, @@ -50,36 +52,36 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { QueryMsg::AskRenewPrice { current_time, token_id, - } => to_binary(&query_ask_renew_price(deps, current_time, token_id)?), - QueryMsg::AskCount {} => to_binary(&query_ask_count(deps)?), + } => to_json_binary(&query_ask_renew_price(deps, current_time, token_id)?), + QueryMsg::AskCount {} => to_json_binary(&query_ask_count(deps)?), QueryMsg::Bid { token_id, bidder } => { - to_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) + to_json_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) } QueryMsg::Bids { token_id, start_after, limit, - } => to_binary(&query_bids(deps, token_id, start_after, limit)?), + } => to_json_binary(&query_bids(deps, token_id, start_after, limit)?), QueryMsg::LegacyBids { start_after, limit } => { - to_binary(&query_legacy_bids(deps, start_after, limit)?) + to_json_binary(&query_legacy_bids(deps, start_after, limit)?) } QueryMsg::BidsByBidder { bidder, start_after, limit, - } => to_binary(&query_bids_by_bidder( + } => to_json_binary(&query_bids_by_bidder( deps, api.addr_validate(&bidder)?, start_after, limit, )?), QueryMsg::BidsSortedByPrice { start_after, limit } => { - to_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) + to_json_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) } QueryMsg::ReverseBidsSortedByPrice { start_before, limit, - } => to_binary(&reverse_query_bids_sorted_by_price( + } => to_json_binary(&reverse_query_bids_sorted_by_price( deps, start_before, limit, @@ -88,19 +90,19 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { seller, start_after, limit, - } => to_binary(&query_bids_for_seller( + } => to_json_binary(&query_bids_for_seller( deps, api.addr_validate(&seller)?, start_after, limit, )?), - QueryMsg::HighestBid { token_id } => to_binary(&query_highest_bid(deps, token_id)?), - QueryMsg::Params {} => to_binary(&query_params(deps)?), - QueryMsg::AskHooks {} => to_binary(&ASK_HOOKS.query_hooks(deps)?), - QueryMsg::BidHooks {} => to_binary(&BID_HOOKS.query_hooks(deps)?), - QueryMsg::SaleHooks {} => to_binary(&SALE_HOOKS.query_hooks(deps)?), - QueryMsg::RenewalQueue { time } => to_binary(&query_renewal_queue(deps, time)?), - QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::HighestBid { token_id } => to_json_binary(&query_highest_bid(deps, token_id)?), + QueryMsg::Params {} => to_json_binary(&query_params(deps)?), + QueryMsg::AskHooks {} => to_json_binary(&ASK_HOOKS.query_hooks(deps)?), + QueryMsg::BidHooks {} => to_json_binary(&BID_HOOKS.query_hooks(deps)?), + QueryMsg::SaleHooks {} => to_json_binary(&SALE_HOOKS.query_hooks(deps)?), + QueryMsg::RenewalQueue { time } => to_json_binary(&query_renewal_queue(deps, time)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), } } diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 5f6c20e9..d582432e 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -3,8 +3,8 @@ use std::vec; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - coin, to_binary, Addr, Coin, Decimal, DepsMut, Empty, Env, Event, MessageInfo, Reply, StdError, - Uint128, WasmMsg, + coin, to_json_binary, Addr, Coin, Decimal, DepsMut, Empty, Env, Event, MessageInfo, Reply, + StdError, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721_base::MintMsg; @@ -104,7 +104,7 @@ pub fn instantiate( }; let wasm_msg = WasmMsg::Instantiate { code_id: msg.collection_code_id, - msg: to_binary(&name_collection_init_msg)?, + msg: to_json_binary(&name_collection_init_msg)?, funds: info.funds, admin: Some(info.sender.to_string()), label: "Name Collection".to_string(), @@ -210,7 +210,7 @@ pub fn execute_mint_and_list( }); let mint_msg_exec = WasmMsg::Execute { contract_addr: collection.to_string(), - msg: to_binary(&mint_msg)?, + msg: to_json_binary(&mint_msg)?, funds: vec![], }; @@ -220,7 +220,7 @@ pub fn execute_mint_and_list( }; let list_msg_exec = WasmMsg::Execute { contract_addr: marketplace.to_string(), - msg: to_binary(&ask_msg)?, + msg: to_json_binary(&ask_msg)?, funds: vec![], }; @@ -417,7 +417,7 @@ pub fn reply(deps: DepsMut, _env: Env, msg: Reply) -> Result>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -27,7 +29,7 @@ impl NameMinterContract { pub fn params(&self, querier: &QuerierWrapper) -> StdResult { let res: SudoParams = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Params {})?, + msg: to_json_binary(&QueryMsg::Params {})?, }))?; Ok(res) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 40c7d213..050baf20 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1564,7 +1564,7 @@ mod query { } mod collection { - use cosmwasm_std::{to_binary, StdResult}; + use cosmwasm_std::{to_json_binary, StdResult}; use cw721::NftInfoResponse; use cw_controllers::AdminResponse; use name_marketplace::state::Ask; @@ -1594,7 +1594,7 @@ mod collection { } fn send(app: &mut StargazeApp, from: &str, to: &str) { - let msg = to_binary("You now have the melting power").unwrap(); + let msg = to_json_binary("You now have the melting power").unwrap(); let target = to.to_string(); let send_msg = Sg721NameExecuteMsg::SendNft { contract: target, diff --git a/contracts/name-minter/src/query.rs b/contracts/name-minter/src/query.rs index 34510a7d..435bf25a 100644 --- a/contracts/name-minter/src/query.rs +++ b/contracts/name-minter/src/query.rs @@ -1,6 +1,6 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{to_binary, Addr, Binary, Deps, Env, StdResult}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Deps, Env, StdResult}; use sg_name_minter::{Config, SudoParams}; use crate::{ @@ -11,11 +11,11 @@ use crate::{ #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Admin {} => to_binary(&ADMIN.query_admin(deps)?), - QueryMsg::Collection {} => to_binary(&query_collection(deps)?), - QueryMsg::Params {} => to_binary(&query_params(deps)?), - QueryMsg::Whitelists {} => to_binary(&query_whitelists(deps)?), - QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::Admin {} => to_json_binary(&ADMIN.query_admin(deps)?), + QueryMsg::Collection {} => to_json_binary(&query_collection(deps)?), + QueryMsg::Params {} => to_json_binary(&query_params(deps)?), + QueryMsg::Whitelists {} => to_json_binary(&query_whitelists(deps)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), } } diff --git a/contracts/sg721-name/src/contract.rs b/contracts/sg721-name/src/contract.rs index 952b3763..c2b177e9 100644 --- a/contracts/sg721-name/src/contract.rs +++ b/contracts/sg721-name/src/contract.rs @@ -4,8 +4,8 @@ use crate::{ }; use cosmwasm_std::{ - ensure, to_binary, Addr, Binary, ContractInfoResponse, Deps, DepsMut, Env, Event, MessageInfo, - StdError, StdResult, WasmMsg, + ensure, to_json_binary, Addr, Binary, ContractInfoResponse, Deps, DepsMut, Env, Event, + MessageInfo, StdError, StdResult, WasmMsg, }; use cw721_base::{state::TokenInfo, MintMsg}; @@ -195,7 +195,7 @@ fn update_ask_on_marketplace( let update_ask_msg = WasmMsg::Execute { contract_addr: NAME_MARKETPLACE.load(deps.storage)?.to_string(), funds: vec![], - msg: to_binary(&msg)?, + msg: to_json_binary(&msg)?, }; Ok(update_ask_msg) } @@ -511,7 +511,7 @@ fn only_owner(deps: Deps, sender: &Addr, token_id: &str) -> Result StdResult { fn validate_address(deps: Deps, sender: &Addr, addr: Addr) -> Result { // we have an EOA registration - if sender == &addr { + if sender == addr { return Ok(addr); } diff --git a/contracts/sg721-name/src/helpers.rs b/contracts/sg721-name/src/helpers.rs index 1559bd76..cdfd370b 100644 --- a/contracts/sg721-name/src/helpers.rs +++ b/contracts/sg721-name/src/helpers.rs @@ -1,6 +1,6 @@ use crate::msg::QueryMsg; use cosmwasm_schema::cw_serde; -use cosmwasm_std::{to_binary, Addr, QuerierWrapper, QueryRequest, StdResult, WasmQuery}; +use cosmwasm_std::{to_json_binary, Addr, QuerierWrapper, QueryRequest, StdResult, WasmQuery}; use sg_name::{TextRecord, NFT}; /// NameCollectionContract is a wrapper around Addr that provides a lot of helpers @@ -15,7 +15,7 @@ impl NameCollectionContract { pub fn name(&self, querier: &QuerierWrapper, address: &str) -> StdResult { let res: String = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Name { + msg: to_json_binary(&QueryMsg::Name { address: address.to_string(), })?, }))?; @@ -26,7 +26,7 @@ impl NameCollectionContract { pub fn image_nft(&self, querier: &QuerierWrapper, name: &str) -> StdResult> { let res: Option = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::ImageNFT { + msg: to_json_binary(&QueryMsg::ImageNFT { name: name.to_string(), })?, }))?; @@ -37,7 +37,7 @@ impl NameCollectionContract { pub fn text_records(&self, querier: &QuerierWrapper, name: &str) -> StdResult> { let res: Vec = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::TextRecords { + msg: to_json_binary(&QueryMsg::TextRecords { name: name.to_string(), })?, }))?; @@ -48,7 +48,7 @@ impl NameCollectionContract { pub fn is_twitter_verified(&self, querier: &QuerierWrapper, name: &str) -> StdResult { let res: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::IsTwitterVerified { + msg: to_json_binary(&QueryMsg::IsTwitterVerified { name: name.to_string(), })?, }))?; diff --git a/contracts/sg721-name/src/lib.rs b/contracts/sg721-name/src/lib.rs index 50d29846..ac52d955 100644 --- a/contracts/sg721-name/src/lib.rs +++ b/contracts/sg721-name/src/lib.rs @@ -43,7 +43,7 @@ pub mod entry { query_associated_address, query_name, query_name_marketplace, query_params, }; use cosmwasm_std::{ - to_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, StdError, StdResult, + to_json_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, StdError, StdResult, }; use cw2::set_contract_version; use cw_utils::maybe_addr; @@ -134,17 +134,17 @@ pub mod entry { #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Params {} => to_binary(&query_params(deps)?), - QueryMsg::NameMarketplace {} => to_binary(&query_name_marketplace(deps)?), - QueryMsg::Name { address } => to_binary(&query_name(deps, address)?), - QueryMsg::Verifier {} => to_binary(&VERIFIER.query_admin(deps)?), + QueryMsg::Params {} => to_json_binary(&query_params(deps)?), + QueryMsg::NameMarketplace {} => to_json_binary(&query_name_marketplace(deps)?), + QueryMsg::Name { address } => to_json_binary(&query_name(deps, address)?), + QueryMsg::Verifier {} => to_json_binary(&VERIFIER.query_admin(deps)?), QueryMsg::AssociatedAddress { name } => { - to_binary(&query_associated_address(deps, &name)?) + to_json_binary(&query_associated_address(deps, &name)?) } - QueryMsg::ImageNFT { name } => to_binary(&query_image_nft(deps, &name)?), - QueryMsg::TextRecords { name } => to_binary(&query_text_records(deps, &name)?), + QueryMsg::ImageNFT { name } => to_json_binary(&query_image_nft(deps, &name)?), + QueryMsg::TextRecords { name } => to_json_binary(&query_text_records(deps, &name)?), QueryMsg::IsTwitterVerified { name } => { - to_binary(&query_is_twitter_verified(deps, &name)?) + to_json_binary(&query_is_twitter_verified(deps, &name)?) } _ => Sg721NameContract::default().query(deps, env, msg.into()), } diff --git a/contracts/sg721-name/src/unit_tests.rs b/contracts/sg721-name/src/unit_tests.rs index e0bd3066..86e03b68 100644 --- a/contracts/sg721-name/src/unit_tests.rs +++ b/contracts/sg721-name/src/unit_tests.rs @@ -1,8 +1,7 @@ use cosmwasm_std::testing::{mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{ - from_binary, from_slice, to_binary, Addr, ContractInfoResponse, ContractResult, Empty, - OwnedDeps, Querier, QuerierResult, QueryRequest, StdError, SystemError, SystemResult, - WasmQuery, + from_json, to_json_binary, Addr, ContractInfoResponse, ContractResult, Empty, OwnedDeps, + Querier, QuerierResult, QueryRequest, StdError, SystemError, SystemResult, WasmQuery, }; use cw721::Cw721Query; use cw721_base::MintMsg; @@ -35,7 +34,7 @@ pub struct CustomMockQuerier { impl Querier for CustomMockQuerier { fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { - let request: QueryRequest = match from_slice(bin_request) { + let request: QueryRequest = match from_json(bin_request) { Ok(v) => v, Err(e) => { return SystemResult::Err(SystemError::InvalidRequest { @@ -56,7 +55,7 @@ impl CustomMockQuerier { let mut response = ContractInfoResponse::default(); response.code_id = 1; response.creator = CREATOR.to_string(); - SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_json_binary(&response).unwrap())) } _ => self.base.handle_query(request), } @@ -109,7 +108,7 @@ fn mint_and_update() { // retrieve max record count let params: SudoParams = - from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); + from_json(query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); let max_record_count = params.max_record_count; // mint token @@ -145,7 +144,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_image_msg).unwrap(); let nft_value = res.events[0].attributes[2].value.clone().into_bytes(); - let nft: NFT = from_slice(&nft_value).unwrap(); + let nft: NFT = from_json(nft_value).unwrap(); assert_eq!(nft, new_nft); // add text record @@ -160,7 +159,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_record_msg).unwrap(); let record_value = res.events[0].attributes[2].value.clone().into_bytes(); - let record: TextRecord = from_slice(&record_value).unwrap(); + let record: TextRecord = from_json(record_value).unwrap(); assert_eq!(record, new_record); let records = query_text_records(deps.as_ref(), token_id).unwrap(); diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index 3365f704..c5e9ec27 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -2,7 +2,7 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, + to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, }; use cw2::set_contract_version; @@ -246,14 +246,18 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result StdResult { match msg { - QueryMsg::Config {} => to_binary(&query_config(deps)?), - QueryMsg::IncludesAddress { address } => to_binary(&query_includes_address(deps, address)?), - QueryMsg::MintCount { address } => to_binary(&query_mint_count(deps, address)?), - QueryMsg::Admin {} => to_binary(&query_admin(deps)?), - QueryMsg::AddressCount {} => to_binary(&query_address_count(deps)?), - QueryMsg::PerAddressLimit {} => to_binary(&query_per_address_limit(deps)?), - QueryMsg::IsProcessable { address } => to_binary(&query_is_processable(deps, address)?), - QueryMsg::MintDiscountAmount {} => to_binary(&query_mint_discount_amount(deps)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), + QueryMsg::IncludesAddress { address } => { + to_json_binary(&query_includes_address(deps, address)?) + } + QueryMsg::MintCount { address } => to_json_binary(&query_mint_count(deps, address)?), + QueryMsg::Admin {} => to_json_binary(&query_admin(deps)?), + QueryMsg::AddressCount {} => to_json_binary(&query_address_count(deps)?), + QueryMsg::PerAddressLimit {} => to_json_binary(&query_per_address_limit(deps)?), + QueryMsg::IsProcessable { address } => { + to_json_binary(&query_is_processable(deps, address)?) + } + QueryMsg::MintDiscountAmount {} => to_json_binary(&query_mint_discount_amount(deps)?), } } diff --git a/contracts/whitelist-updatable/src/contract.rs b/contracts/whitelist-updatable/src/contract.rs index 138d80d3..ca0e157f 100644 --- a/contracts/whitelist-updatable/src/contract.rs +++ b/contracts/whitelist-updatable/src/contract.rs @@ -2,7 +2,7 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + to_json_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, }; use cw2::set_contract_version; @@ -30,7 +30,7 @@ pub fn instantiate( let config = Config { admin: info.sender, per_address_limit: msg.per_address_limit, - /// 1% = 100, 50% = 5000 + // 1% = 100, 50% = 5000 mint_discount_bps: msg.mint_discount_bps, }; @@ -247,14 +247,18 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result StdResult { match msg { - QueryMsg::Config {} => to_binary(&query_config(deps)?), - QueryMsg::IncludesAddress { address } => to_binary(&query_includes_address(deps, address)?), - QueryMsg::MintCount { address } => to_binary(&query_mint_count(deps, address)?), - QueryMsg::Admin {} => to_binary(&query_admin(deps)?), - QueryMsg::AddressCount {} => to_binary(&query_address_count(deps)?), - QueryMsg::PerAddressLimit {} => to_binary(&query_per_address_limit(deps)?), - QueryMsg::IsProcessable { address } => to_binary(&query_is_processable(deps, address)?), - QueryMsg::MintDiscountPercent {} => to_binary(&query_mint_discount_percent(deps)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), + QueryMsg::IncludesAddress { address } => { + to_json_binary(&query_includes_address(deps, address)?) + } + QueryMsg::MintCount { address } => to_json_binary(&query_mint_count(deps, address)?), + QueryMsg::Admin {} => to_json_binary(&query_admin(deps)?), + QueryMsg::AddressCount {} => to_json_binary(&query_address_count(deps)?), + QueryMsg::PerAddressLimit {} => to_json_binary(&query_per_address_limit(deps)?), + QueryMsg::IsProcessable { address } => { + to_json_binary(&query_is_processable(deps, address)?) + } + QueryMsg::MintDiscountPercent {} => to_json_binary(&query_mint_discount_percent(deps)?), } } From 0d18873d6f4d5301216ac6024a254f9d18400e89 Mon Sep 17 00:00:00 2001 From: Tasio Victoria Date: Tue, 23 Jan 2024 13:12:53 -0500 Subject: [PATCH 37/91] Adjust renewal logic --- contracts/marketplace/src/execute.rs | 3 - contracts/marketplace/src/helpers.rs | 90 +++++++------------ contracts/marketplace/src/sudo.rs | 3 - .../name-minter/src/integration_tests.rs | 6 +- scripts/migrate_mkt.sh | 2 +- scripts/store_v2.sh | 12 ++- 6 files changed, 43 insertions(+), 73 deletions(-) mode change 100644 => 100755 scripts/migrate_mkt.sh mode change 100644 => 100755 scripts/store_v2.sh diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 45f99259..c76e23d1 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -586,8 +586,6 @@ pub fn execute_process_renewals( .querier .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; - let name_collection = NAME_COLLECTION.load(deps.storage)?; - let mut response = Response::new(); for renewable_ask in renewable_asks { @@ -596,7 +594,6 @@ pub fn execute_process_renewals( &env, &sudo_params, &name_minter_params, - &name_collection, renewable_ask, response, )?; diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 3d3f6c23..b1808908 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -3,7 +3,7 @@ use std::cmp::max; use crate::{ execute::{finalize_sale, store_ask}, msg::{ExecuteMsg, QueryMsg}, - state::{ask_key, asks, bid_key, bids, Ask, Bid, SudoParams, RENEWAL_QUEUE}, + state::{bid_key, bids, Ask, Bid, SudoParams, RENEWAL_QUEUE}, ContractError, }; use cosmwasm_schema::cw_serde; @@ -11,7 +11,6 @@ use cosmwasm_std::{ coins, ensure, to_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, }; -use cw721::Cw721ExecuteMsg; use cw_storage_plus::Bound; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_name_minter::SudoParams as NameMinterParams; @@ -155,13 +154,15 @@ pub fn renew_name( renewal_price: Uint128, mut response: Response, ) -> Result { - // Take renewal payment - ask.renewal_fund -= renewal_price; - charge_fees( - &mut response, - sudo_params.trading_fee_percent, - renewal_price, - ); + if !renewal_price.is_zero() { + // Take renewal payment + ask.renewal_fund -= renewal_price; + charge_fees( + &mut response, + sudo_params.trading_fee_percent, + renewal_price, + ); + } // Update renewal time RENEWAL_QUEUE.remove(deps.storage, (ask.renewal_time.seconds(), ask.id)); @@ -217,33 +218,11 @@ fn sell_name( Ok(response) } -fn burn_name( - deps: DepsMut, - collection: &Addr, - ask: Ask, - mut response: Response, -) -> Result { - response = response.add_message(WasmMsg::Execute { - contract_addr: collection.to_string(), - msg: to_binary(&Cw721ExecuteMsg::Burn { - token_id: ask.token_id.to_string(), - })?, - funds: vec![], - }); - - // Delete ask - RENEWAL_QUEUE.remove(deps.storage, (ask.renewal_time.seconds(), ask.id)); - asks().remove(deps.storage, ask_key(&ask.token_id))?; - - Ok(response) -} - pub fn process_renewal( deps: DepsMut, env: &Env, sudo_params: &SudoParams, name_minter_params: &NameMinterParams, - collection: &Addr, mut ask: Ask, mut response: Response, ) -> Result { @@ -264,34 +243,33 @@ pub fn process_renewal( name_minter_params.base_price.u128(), )?; - // If the renewal fund is sufficient, renew it - if ask.renewal_fund >= renewal_price { - process_renewal_event = process_renewal_event.add_attribute("action", "renew"); - response = response.add_event(process_renewal_event); - - return renew_name(deps, env, sudo_params, ask, renewal_price, response); - } - - // Renewal fund is insufficient, send it back to the owner - if !ask.renewal_fund.is_zero() { - response = response.add_message(BankMsg::Send { - to_address: ask.seller.to_string(), - amount: coins(ask.renewal_fund.u128(), NATIVE_DENOM), - }); - ask.renewal_fund = Uint128::zero(); - } - if let Some(bid) = valid_bid { - // The renewal fund is insufficient, sell to the highest bidder - process_renewal_event = process_renewal_event.add_attribute("action", "sell"); - response = response.add_event(process_renewal_event); - - sell_name(deps, env, ask, bid, response) + // If the renewal fund is sufficient, renew it + if ask.renewal_fund >= renewal_price { + process_renewal_event = process_renewal_event.add_attribute("action", "renew"); + response = response.add_event(process_renewal_event); + + renew_name(deps, env, sudo_params, ask, renewal_price, response) + } else { + // Renewal fund is insufficient, send it back to the owner + if !ask.renewal_fund.is_zero() { + response = response.add_message(BankMsg::Send { + to_address: ask.seller.to_string(), + amount: coins(ask.renewal_fund.u128(), NATIVE_DENOM), + }); + ask.renewal_fund = Uint128::zero(); + } + + // The renewal fund is insufficient, sell to the highest bidder + process_renewal_event = process_renewal_event.add_attribute("action", "sell"); + response = response.add_event(process_renewal_event); + + sell_name(deps, env, ask, bid, response) + } } else { - // The renewal fund is insufficient, and there is no valid bid, burn it - process_renewal_event = process_renewal_event.add_attribute("action", "burn"); + process_renewal_event = process_renewal_event.add_attribute("action", "renew"); response = response.add_event(process_renewal_event); - burn_name(deps, collection, ask, response) + renew_name(deps, env, sudo_params, ask, Uint128::zero(), response) } } diff --git a/contracts/marketplace/src/sudo.rs b/contracts/marketplace/src/sudo.rs index 5836f847..508b10f7 100644 --- a/contracts/marketplace/src/sudo.rs +++ b/contracts/marketplace/src/sudo.rs @@ -182,15 +182,12 @@ pub fn sudo_end_block(mut deps: DepsMut, env: Env) -> Result(name_minter, &SgNameMinterQueryMsg::Params {})?; - let name_collection = NAME_COLLECTION.load(deps.storage)?; - for renewable_ask in renewable_asks { response = process_renewal( deps.branch(), &env, &sudo_params, &name_minter_params, - &name_collection, renewable_ask, response, )?; diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index e40663bd..df133cb2 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1331,7 +1331,7 @@ mod query { let ask = result.unwrap().unwrap(); assert_eq!(ask.seller, USER.to_string()); - assert_eq!(ask.renewal_fund, Uint128::zero()); + assert_eq!(ask.renewal_fund, renewal_price.amount); let expected_renewal_time = app.block_info().time.plus_seconds(SECONDS_PER_YEAR); assert_eq!(ask.renewal_time, expected_renewal_time); @@ -1443,7 +1443,7 @@ mod query { } #[test] - fn process_renewals_burn() { + fn process_renewals_renew_free() { let mut app = instantiate_contracts(None, None, None); mint_and_list(&mut app, NAME, USER, None).unwrap(); @@ -1496,7 +1496,7 @@ mod query { }, ); assert!(result.is_ok()); - assert!(result.unwrap().is_none()); + assert!(result.unwrap().is_some()); } #[test] diff --git a/scripts/migrate_mkt.sh b/scripts/migrate_mkt.sh old mode 100644 new mode 100755 index 9ca742c4..1bfdd05f --- a/scripts/migrate_mkt.sh +++ b/scripts/migrate_mkt.sh @@ -9,7 +9,7 @@ MSG=$(cat < Date: Fri, 26 Jan 2024 22:53:50 +0300 Subject: [PATCH 38/91] Update flat rate WL to support multiple admins --- .../src/contract.rs | 41 ++++++++++++------- .../whitelist-updatable-flatrate/src/msg.rs | 7 ++-- .../whitelist-updatable-flatrate/src/state.rs | 2 +- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index c5e9ec27..8f88aada 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -27,8 +27,16 @@ pub fn instantiate( ) -> Result { nonpayable(&info)?; set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + + let mut admin_list: Vec = vec![]; + if let Some(admins) = &msg.admin_list { + admin_list = admins.iter().map(|addr| deps.api.addr_validate(addr)).collect::, _>>()?; + } else { + admin_list.push(info.sender.clone()); + } + let config = Config { - admin: info.sender, + admins: admin_list, per_address_limit: msg.per_address_limit, mint_discount_amount: msg.mint_discount_amount, }; @@ -60,7 +68,7 @@ pub fn execute( msg: ExecuteMsg, ) -> Result { match msg { - ExecuteMsg::UpdateAdmin { new_admin } => execute_update_admin(deps, info, new_admin), + ExecuteMsg::UpdateAdmins { new_admin_list } => execute_update_admins(deps, info, new_admin_list), ExecuteMsg::AddAddresses { addresses } => execute_add_addresses(deps, info, addresses), ExecuteMsg::RemoveAddresses { addresses } => { execute_remove_addresses(deps, info, addresses) @@ -73,21 +81,26 @@ pub fn execute( } } -pub fn execute_update_admin( +pub fn execute_update_admins( deps: DepsMut, info: MessageInfo, - new_admin: String, + new_admin_list: Vec, ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; - if config.admin != info.sender { + + if config.admins.contains(&info.sender) { return Err(ContractError::Unauthorized {}); } - config.admin = deps.api.addr_validate(&new_admin)?; + config.admins = new_admin_list + .into_iter() + .map(|address| deps.api.addr_validate(&address)) + .collect::>>()?; + CONFIG.save(deps.storage, &config)?; let event = Event::new("update-admin") - .add_attribute("new_admin", config.admin) + .add_attribute("new_admin_list", config.admins.into_iter().map(|x| x.to_string()).collect::()) .add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) } @@ -99,7 +112,7 @@ pub fn execute_add_addresses( ) -> Result { let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; - if config.admin != info.sender { + if config.admins.contains(&info.sender) { return Err(ContractError::Unauthorized {}); } @@ -135,7 +148,7 @@ pub fn execute_remove_addresses( nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; - if config.admin != info.sender { + if config.admins.contains(&info.sender) { return Err(ContractError::Unauthorized {}); } @@ -208,7 +221,7 @@ pub fn execute_update_per_address_limit( ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; - if config.admin != info.sender { + if config.admins.contains(&info.sender) { return Err(ContractError::Unauthorized {}); } @@ -224,7 +237,7 @@ pub fn execute_update_per_address_limit( pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; - if config.admin != info.sender { + if config.admins.contains(&info.sender) { return Err(ContractError::Unauthorized {}); } @@ -251,7 +264,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { to_json_binary(&query_includes_address(deps, address)?) } QueryMsg::MintCount { address } => to_json_binary(&query_mint_count(deps, address)?), - QueryMsg::Admin {} => to_json_binary(&query_admin(deps)?), + QueryMsg::Admins {} => to_json_binary(&query_admins(deps)?), QueryMsg::AddressCount {} => to_json_binary(&query_address_count(deps)?), QueryMsg::PerAddressLimit {} => to_json_binary(&query_per_address_limit(deps)?), QueryMsg::IsProcessable { address } => { @@ -274,9 +287,9 @@ pub fn query_mint_count(deps: Deps, address: String) -> StdResult { WHITELIST.load(deps.storage, addr) } -pub fn query_admin(deps: Deps) -> StdResult { +pub fn query_admins(deps: Deps) -> StdResult { let config = CONFIG.load(deps.storage)?; - Ok(config.admin.to_string()) + Ok(config.admins.into_iter().map(|x| x.to_string()).collect::()) } pub fn query_address_count(deps: Deps) -> StdResult { diff --git a/contracts/whitelist-updatable-flatrate/src/msg.rs b/contracts/whitelist-updatable-flatrate/src/msg.rs index e7d5d366..e5dd82c5 100644 --- a/contracts/whitelist-updatable-flatrate/src/msg.rs +++ b/contracts/whitelist-updatable-flatrate/src/msg.rs @@ -7,12 +7,13 @@ pub struct InstantiateMsg { pub addresses: Vec, pub per_address_limit: u32, pub mint_discount_amount: Option, + pub admin_list: Option>, } #[cw_serde] pub enum ExecuteMsg { - UpdateAdmin { - new_admin: String, + UpdateAdmins { + new_admin_list: Vec, }, AddAddresses { addresses: Vec, @@ -43,7 +44,7 @@ pub enum QueryMsg { #[returns(bool)] IsProcessable { address: String }, #[returns(cw_controllers::AdminResponse)] - Admin {}, + Admins {}, #[returns(u64)] AddressCount {}, #[returns(u64)] diff --git a/contracts/whitelist-updatable-flatrate/src/state.rs b/contracts/whitelist-updatable-flatrate/src/state.rs index d28dbb08..740ce4b7 100644 --- a/contracts/whitelist-updatable-flatrate/src/state.rs +++ b/contracts/whitelist-updatable-flatrate/src/state.rs @@ -4,7 +4,7 @@ use cw_storage_plus::{Item, Map}; #[cw_serde] pub struct Config { - pub admin: Addr, + pub admins: Vec, pub per_address_limit: u32, pub mint_discount_amount: Option, } From 2b9b616696907d6e49b96ae903047e14366aa867 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Sat, 27 Jan 2024 15:25:07 +0300 Subject: [PATCH 39/91] Update instantiation logic and admin checks --- .../src/contract.rs | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index 8f88aada..755d0023 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -1,10 +1,7 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{ - to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, - StdResult, -}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, ensure}; use cw2::set_contract_version; use semver::Version; use sg_name_minter::SgNameMinterQueryMsg; @@ -28,12 +25,10 @@ pub fn instantiate( nonpayable(&info)?; set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - let mut admin_list: Vec = vec![]; - if let Some(admins) = &msg.admin_list { - admin_list = admins.iter().map(|addr| deps.api.addr_validate(addr)).collect::, _>>()?; - } else { - admin_list.push(info.sender.clone()); - } + let admin_list: Vec = msg.admin_list.as_ref().map_or_else( + || Ok(vec![info.sender.clone()]), + |admins| admins.iter().map(|addr| deps.api.addr_validate(addr)).collect(), + )?; let config = Config { admins: admin_list, @@ -88,10 +83,7 @@ pub fn execute_update_admins( ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; - - if config.admins.contains(&info.sender) { - return Err(ContractError::Unauthorized {}); - } + ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); config.admins = new_admin_list .into_iter() @@ -112,9 +104,7 @@ pub fn execute_add_addresses( ) -> Result { let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; - if config.admins.contains(&info.sender) { - return Err(ContractError::Unauthorized {}); - } + ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); // dedupe addresses.sort_unstable(); @@ -148,9 +138,7 @@ pub fn execute_remove_addresses( nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; - if config.admins.contains(&info.sender) { - return Err(ContractError::Unauthorized {}); - } + ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); // dedupe addresses.sort_unstable(); @@ -221,9 +209,7 @@ pub fn execute_update_per_address_limit( ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; - if config.admins.contains(&info.sender) { - return Err(ContractError::Unauthorized {}); - } + ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); config.per_address_limit = limit; CONFIG.save(deps.storage, &config)?; @@ -237,9 +223,7 @@ pub fn execute_update_per_address_limit( pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; - if config.admins.contains(&info.sender) { - return Err(ContractError::Unauthorized {}); - } + ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); let keys = WHITELIST .keys(deps.as_ref().storage, None, None, Order::Ascending) From 9916e02ce8cd03a0cbf88dbe28760e03e0ce1376 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Sat, 27 Jan 2024 15:26:29 +0300 Subject: [PATCH 40/91] Update tests --- .../src/integration_tests.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index 01cc4b95..a9d902a4 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -63,7 +63,7 @@ mod tests { #[test] pub fn init() { - let addrs: Vec = vec![ + let addrs = vec![ "addr0001".to_string(), "addr0002".to_string(), "addr0003".to_string(), @@ -75,6 +75,7 @@ mod tests { per_address_limit: PER_ADDRESS_LIMIT, addresses: addrs.clone(), mint_discount_amount: None, + admin_list: None, }; let mut app = custom_mock_app(); @@ -108,7 +109,7 @@ mod tests { let admin: String = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::Admin {}) + .query_wasm_smart(&wl_addr, &QueryMsg::Admins {}) .unwrap(); assert_eq!(admin, CREATOR.to_string()); @@ -174,7 +175,7 @@ mod tests { #[test] fn exec() { - let addrs: Vec = vec![ + let addrs= vec![ "addr0001".to_string(), "addr0002".to_string(), "addr0003".to_string(), @@ -186,6 +187,7 @@ mod tests { per_address_limit: 10, addresses: addrs, mint_discount_amount: None, + admin_list: None, }; let mut app = custom_mock_app(); @@ -217,14 +219,14 @@ mod tests { ) .unwrap(); - let msg = ExecuteMsg::UpdateAdmin { - new_admin: OTHER_ADMIN.to_string(), + let msg = ExecuteMsg::UpdateAdmins { + new_admin_list: vec![OTHER_ADMIN.to_string()], }; let res = app.execute_contract(Addr::unchecked(CREATOR), wl_addr.clone(), &msg, &[]); assert!(res.is_ok()); let res: String = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::Admin {}) + .query_wasm_smart(&wl_addr, &QueryMsg::Admins {}) .unwrap(); assert_eq!(res, OTHER_ADMIN.to_string()); @@ -397,7 +399,7 @@ mod tests { .wrap() .query_wasm_smart(&wl_addr, &QueryMsg::Config {}) .unwrap(); - assert_eq!(res.admin, Addr::unchecked(OTHER_ADMIN).to_string()); + assert_eq!(res.admins, vec![OTHER_ADMIN.to_string()]); assert_eq!(res.per_address_limit, new_per_address_limit); } } From 06ef71a110cd503cf050e9ebfa8c29cfc6ba7c8f Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Sat, 27 Jan 2024 15:27:40 +0300 Subject: [PATCH 41/91] Fix formatting issues --- .../src/contract.rs | 56 +++++++++++++++---- .../src/integration_tests.rs | 2 +- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index 755d0023..b04b441b 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -1,7 +1,10 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, ensure}; +use cosmwasm_std::{ + ensure, to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + StdError, StdResult, +}; use cw2::set_contract_version; use semver::Version; use sg_name_minter::SgNameMinterQueryMsg; @@ -27,7 +30,12 @@ pub fn instantiate( let admin_list: Vec = msg.admin_list.as_ref().map_or_else( || Ok(vec![info.sender.clone()]), - |admins| admins.iter().map(|addr| deps.api.addr_validate(addr)).collect(), + |admins| { + admins + .iter() + .map(|addr| deps.api.addr_validate(addr)) + .collect() + }, )?; let config = Config { @@ -63,7 +71,9 @@ pub fn execute( msg: ExecuteMsg, ) -> Result { match msg { - ExecuteMsg::UpdateAdmins { new_admin_list } => execute_update_admins(deps, info, new_admin_list), + ExecuteMsg::UpdateAdmins { new_admin_list } => { + execute_update_admins(deps, info, new_admin_list) + } ExecuteMsg::AddAddresses { addresses } => execute_add_addresses(deps, info, addresses), ExecuteMsg::RemoveAddresses { addresses } => { execute_remove_addresses(deps, info, addresses) @@ -83,7 +93,10 @@ pub fn execute_update_admins( ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; - ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); + ensure!( + config.admins.contains(&info.sender), + ContractError::Unauthorized {} + ); config.admins = new_admin_list .into_iter() @@ -92,7 +105,14 @@ pub fn execute_update_admins( CONFIG.save(deps.storage, &config)?; let event = Event::new("update-admin") - .add_attribute("new_admin_list", config.admins.into_iter().map(|x| x.to_string()).collect::()) + .add_attribute( + "new_admin_list", + config + .admins + .into_iter() + .map(|x| x.to_string()) + .collect::(), + ) .add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) } @@ -104,7 +124,10 @@ pub fn execute_add_addresses( ) -> Result { let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; - ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); + ensure!( + config.admins.contains(&info.sender), + ContractError::Unauthorized {} + ); // dedupe addresses.sort_unstable(); @@ -138,7 +161,10 @@ pub fn execute_remove_addresses( nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; let mut count = TOTAL_ADDRESS_COUNT.load(deps.storage)?; - ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); + ensure!( + config.admins.contains(&info.sender), + ContractError::Unauthorized {} + ); // dedupe addresses.sort_unstable(); @@ -209,7 +235,10 @@ pub fn execute_update_per_address_limit( ) -> Result { nonpayable(&info)?; let mut config = CONFIG.load(deps.storage)?; - ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); + ensure!( + config.admins.contains(&info.sender), + ContractError::Unauthorized {} + ); config.per_address_limit = limit; CONFIG.save(deps.storage, &config)?; @@ -223,7 +252,10 @@ pub fn execute_update_per_address_limit( pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result { nonpayable(&info)?; let config = CONFIG.load(deps.storage)?; - ensure!(config.admins.contains(&info.sender), ContractError::Unauthorized {}); + ensure!( + config.admins.contains(&info.sender), + ContractError::Unauthorized {} + ); let keys = WHITELIST .keys(deps.as_ref().storage, None, None, Order::Ascending) @@ -273,7 +305,11 @@ pub fn query_mint_count(deps: Deps, address: String) -> StdResult { pub fn query_admins(deps: Deps) -> StdResult { let config = CONFIG.load(deps.storage)?; - Ok(config.admins.into_iter().map(|x| x.to_string()).collect::()) + Ok(config + .admins + .into_iter() + .map(|x| x.to_string()) + .collect::()) } pub fn query_address_count(deps: Deps) -> StdResult { diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index a9d902a4..ca17f7b4 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -175,7 +175,7 @@ mod tests { #[test] fn exec() { - let addrs= vec![ + let addrs = vec![ "addr0001".to_string(), "addr0002".to_string(), "addr0003".to_string(), From 70e39a4cde25d1109654e8cc17b3bb00fcede910 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Sat, 27 Jan 2024 16:25:25 +0300 Subject: [PATCH 42/91] Update query admins response --- contracts/whitelist-updatable-flatrate/src/contract.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index b04b441b..0e482eb8 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -303,13 +303,13 @@ pub fn query_mint_count(deps: Deps, address: String) -> StdResult { WHITELIST.load(deps.storage, addr) } -pub fn query_admins(deps: Deps) -> StdResult { +pub fn query_admins(deps: Deps) -> StdResult> { let config = CONFIG.load(deps.storage)?; Ok(config .admins - .into_iter() + .iter() .map(|x| x.to_string()) - .collect::()) + .collect::>()) } pub fn query_address_count(deps: Deps) -> StdResult { From d9a0c224a340b0b5e07eec0ec0c97942780ff352 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Sat, 27 Jan 2024 16:25:55 +0300 Subject: [PATCH 43/91] Improve test coverage --- .../src/integration_tests.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index ca17f7b4..092eefa5 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -11,6 +11,7 @@ mod tests { use sg_multi_test::StargazeApp; const CREATOR: &str = "creator"; + const TEMP_ADMIN: &str = "temp_admin"; const OTHER_ADMIN: &str = "other_admin"; const PER_ADDRESS_LIMIT: u32 = 10; @@ -75,7 +76,7 @@ mod tests { per_address_limit: PER_ADDRESS_LIMIT, addresses: addrs.clone(), mint_discount_amount: None, - admin_list: None, + admin_list: Some(vec![CREATOR.to_string(), TEMP_ADMIN.to_string()]), }; let mut app = custom_mock_app(); @@ -107,11 +108,11 @@ mod tests { ) .unwrap(); - let admin: String = app + let admins: Vec = app .wrap() .query_wasm_smart(&wl_addr, &QueryMsg::Admins {}) .unwrap(); - assert_eq!(admin, CREATOR.to_string()); + assert_eq!(admins, [CREATOR.to_string(), TEMP_ADMIN.to_string()]); let count: u64 = app .wrap() @@ -224,11 +225,11 @@ mod tests { }; let res = app.execute_contract(Addr::unchecked(CREATOR), wl_addr.clone(), &msg, &[]); assert!(res.is_ok()); - let res: String = app + let res: Vec = app .wrap() .query_wasm_smart(&wl_addr, &QueryMsg::Admins {}) .unwrap(); - assert_eq!(res, OTHER_ADMIN.to_string()); + assert_eq!(res, [OTHER_ADMIN.to_string()]); // add addresses let msg = ExecuteMsg::AddAddresses { From 8ce83267b7d34abc3340221e967fb1441786ed27 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Sat, 27 Jan 2024 16:40:42 +0300 Subject: [PATCH 44/91] Improve test coverage - 2 --- .../src/integration_tests.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index 092eefa5..543db4e5 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -221,15 +221,17 @@ mod tests { .unwrap(); let msg = ExecuteMsg::UpdateAdmins { - new_admin_list: vec![OTHER_ADMIN.to_string()], + new_admin_list: vec![OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()], }; + let res = app.execute_contract(Addr::unchecked(TEMP_ADMIN), wl_addr.clone(), &msg, &[]); + assert!(res.is_err()); let res = app.execute_contract(Addr::unchecked(CREATOR), wl_addr.clone(), &msg, &[]); assert!(res.is_ok()); let res: Vec = app .wrap() .query_wasm_smart(&wl_addr, &QueryMsg::Admins {}) .unwrap(); - assert_eq!(res, [OTHER_ADMIN.to_string()]); + assert_eq!(res, [OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()]); // add addresses let msg = ExecuteMsg::AddAddresses { @@ -400,7 +402,10 @@ mod tests { .wrap() .query_wasm_smart(&wl_addr, &QueryMsg::Config {}) .unwrap(); - assert_eq!(res.admins, vec![OTHER_ADMIN.to_string()]); + assert_eq!( + res.admins, + vec![OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()] + ); assert_eq!(res.per_address_limit, new_per_address_limit); } } From 9265e16bd66aa637538931d8ce132dd21d2d57cf Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Thu, 8 Feb 2024 11:10:51 -0900 Subject: [PATCH 45/91] add test --- .../src/integration_tests.rs | 174 +++++++++++------- 1 file changed, 110 insertions(+), 64 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index 543db4e5..7890a63c 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -1,12 +1,12 @@ #[cfg(test)] mod tests { - use crate::{msg::*, state::Config}; + use crate::{ msg::*, state::Config }; use cosmwasm_std::Addr; use name_minter::msg::InstantiateMsg as NameMinterInstantiateMsg; use sg_std::StargazeMsgWrapper; - use cw_multi_test::{Contract, ContractWrapper, Executor}; + use cw_multi_test::{ Contract, ContractWrapper, Executor }; use sg_multi_test::StargazeApp; @@ -23,7 +23,7 @@ mod tests { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, - crate::contract::query, + crate::contract::query ); Box::new(contract) } @@ -32,7 +32,7 @@ mod tests { let contract = ContractWrapper::new( sg721_name::entry::execute, sg721_name::entry::instantiate, - sg721_name::entry::query, + sg721_name::entry::query ); Box::new(contract) } @@ -41,10 +41,10 @@ mod tests { let contract = ContractWrapper::new( name_minter::contract::execute, name_minter::contract::instantiate, - name_minter::query::query, + name_minter::query::query ) - .with_reply(name_minter::contract::reply) - .with_sudo(name_minter::sudo::sudo); + .with_reply(name_minter::contract::reply) + .with_sudo(name_minter::sudo::sudo); Box::new(contract) } @@ -54,7 +54,7 @@ mod tests { verifier: None, collection_code_id, marketplace_addr: "marketplace".to_string(), - base_price: 100u128.into(), + base_price: (100u128).into(), min_name_length: 3, max_name_length: 63, fair_burn_bps: 5000, @@ -69,7 +69,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0005".to_string(), + "addr0005".to_string() ]; let msg = InstantiateMsg { @@ -91,7 +91,7 @@ mod tests { &msg, &[], "wl-contract".to_string(), - None, + None ) .unwrap(); @@ -104,19 +104,19 @@ mod tests { &msg, &[], "name-minter-contract".to_string(), - None, + None ) .unwrap(); let admins: Vec = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::Admins {}) + .query_wasm_smart(&wl_addr, &(QueryMsg::Admins {})) .unwrap(); assert_eq!(admins, [CREATOR.to_string(), TEMP_ADMIN.to_string()]); let count: u64 = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) + .query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})) .unwrap(); assert_eq!(count, addrs.len() as u64); @@ -124,9 +124,9 @@ mod tests { .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::IncludesAddress { + &(QueryMsg::IncludesAddress { address: addrs[0].clone(), - }, + }) ) .unwrap(); assert!(includes); @@ -135,16 +135,16 @@ mod tests { .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::MintCount { + &(QueryMsg::MintCount { address: addrs[0].clone(), - }, + }) ) .unwrap(); assert_eq!(count, 0); let limit: u32 = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::PerAddressLimit {}) + .query_wasm_smart(&wl_addr, &(QueryMsg::PerAddressLimit {})) .unwrap(); assert_eq!(limit, 10); @@ -166,9 +166,9 @@ mod tests { .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::MintCount { + &(QueryMsg::MintCount { address: addrs[0].clone(), - }, + }) ) .unwrap(); assert_eq!(res, 1); @@ -181,7 +181,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0005".to_string(), + "addr0005".to_string() ]; let msg = InstantiateMsg { @@ -203,7 +203,7 @@ mod tests { &msg, &[], "wl-contract".to_string(), - None, + None ) .unwrap(); @@ -216,7 +216,7 @@ mod tests { &msg, &[], "name-minter-contract".to_string(), - None, + None ) .unwrap(); @@ -229,7 +229,7 @@ mod tests { assert!(res.is_ok()); let res: Vec = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::Admins {}) + .query_wasm_smart(&wl_addr, &(QueryMsg::Admins {})) .unwrap(); assert_eq!(res, [OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()]); @@ -240,7 +240,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0006".to_string(), + "addr0006".to_string() ], }; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); @@ -249,16 +249,13 @@ mod tests { .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::IncludesAddress { + &(QueryMsg::IncludesAddress { address: "addr0006".to_string(), - }, + }) ) .unwrap(); assert!(!res); - let res: u64 = app - .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) - .unwrap(); + let res: u64 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); assert_eq!(res, 5); let msg = ExecuteMsg::AddAddresses { addresses: vec!["addr0007".to_string(), "addr0006".to_string()], @@ -269,16 +266,13 @@ mod tests { .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::IncludesAddress { + &(QueryMsg::IncludesAddress { address: "addr0006".to_string(), - }, + }) ) .unwrap(); assert!(res); - let res: u64 = app - .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) - .unwrap(); + let res: u64 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); assert_eq!(res, 7); // remove addresses @@ -289,7 +283,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0006".to_string(), + "addr0006".to_string() ], }; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); @@ -300,7 +294,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0006".to_string(), + "addr0006".to_string() ], }; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); @@ -309,16 +303,13 @@ mod tests { .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::IncludesAddress { + &(QueryMsg::IncludesAddress { address: "addr0006".to_string(), - }, + }) ) .unwrap(); assert!(!res); - let res: u64 = app - .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) - .unwrap(); + let res: u64 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); assert_eq!(res, 2); // per address limit @@ -330,7 +321,7 @@ mod tests { assert!(res.is_ok()); let res: u32 = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::PerAddressLimit {}) + .query_wasm_smart(&wl_addr, &(QueryMsg::PerAddressLimit {})) .unwrap(); assert_eq!(res, 1); @@ -344,9 +335,9 @@ mod tests { .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::IsProcessable { + &(QueryMsg::IsProcessable { address: "addr0007".to_string(), - }, + }) ) .unwrap(); assert!(res); @@ -357,16 +348,16 @@ mod tests { Addr::unchecked(minter_addr.clone()), wl_addr.clone(), &msg, - &[], + &[] ); assert!(res.is_ok()); let res: bool = app .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::IsProcessable { + &(QueryMsg::IsProcessable { address: "addr0007".to_string(), - }, + }) ) .unwrap(); assert!(!res); @@ -380,32 +371,87 @@ mod tests { let msg = ExecuteMsg::Purge {}; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); assert!(res.is_ok()); - let res: u32 = app - .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::AddressCount {}) - .unwrap(); + let res: u32 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); assert_eq!(res, 0); // does not include addr0007 let res: bool = app .wrap() .query_wasm_smart( &wl_addr, - &QueryMsg::IncludesAddress { + &(QueryMsg::IncludesAddress { address: "addr0007".to_string(), - }, + }) ) .unwrap(); assert!(!res); // query config - let res: Config = app + let res: Config = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::Config {})).unwrap(); + assert_eq!(res.admins, vec![OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()]); + assert_eq!(res.per_address_limit, new_per_address_limit); + } + + #[test] + fn test_whitelist_doesnt_contain_address() { + let addrs = vec![ + "addr0001".to_string(), + "addr0002".to_string(), + "addr0003".to_string(), + "addr0004".to_string(), + "addr0005".to_string() + ]; + + let msg = InstantiateMsg { + per_address_limit: PER_ADDRESS_LIMIT, + addresses: addrs.clone(), + mint_discount_amount: None, + admin_list: Some(vec![CREATOR.to_string(), TEMP_ADMIN.to_string()]), + }; + + let mut app = custom_mock_app(); + let wl_id = app.store_code(wl_contract()); + let sg721_id = app.store_code(contract_collection()); + let minter_id = app.store_code(name_minter_contract()); + + let wl_addr = app + .instantiate_contract( + wl_id, + Addr::unchecked(CREATOR), + &msg, + &[], + "wl-contract".to_string(), + None + ) + .unwrap(); + + let msg = name_minter_init(sg721_id); + + let minter_addr = app + .instantiate_contract( + minter_id, + Addr::unchecked(CREATOR), + &msg, + &[], + "name-minter-contract".to_string(), + None + ) + .unwrap(); + + let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { + address: wl_addr.to_string(), + }; + let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr.clone(), &msg, &[]); + assert!(res.is_ok()); + + let res: bool = app .wrap() - .query_wasm_smart(&wl_addr, &QueryMsg::Config {}) + .query_wasm_smart( + &wl_addr, + &(QueryMsg::IsProcessable { + address: "addr0006".to_string(), + }) + ) .unwrap(); - assert_eq!( - res.admins, - vec![OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()] - ); - assert_eq!(res.per_address_limit, new_per_address_limit); + assert!(!res); } } From 9e41bfc311961dd6d1a90496e3f1ba1ed08c445f Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Thu, 8 Feb 2024 11:22:19 -0900 Subject: [PATCH 46/91] linter issues --- .../whitelist-updatable-flatrate/src/integration_tests.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index 7890a63c..be38777b 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -398,7 +398,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0005".to_string() + "addr0005".to_string(), ]; let msg = InstantiateMsg { @@ -420,7 +420,7 @@ mod tests { &msg, &[], "wl-contract".to_string(), - None + None, ) .unwrap(); @@ -433,7 +433,7 @@ mod tests { &msg, &[], "name-minter-contract".to_string(), - None + None, ) .unwrap(); @@ -449,7 +449,7 @@ mod tests { &wl_addr, &(QueryMsg::IsProcessable { address: "addr0006".to_string(), - }) + }), ) .unwrap(); assert!(!res); From ec57129b65ccb4a96518be6cf05a540864705909 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Thu, 8 Feb 2024 11:25:33 -0900 Subject: [PATCH 47/91] try using cargo fmt to fix linter issues --- .../src/integration_tests.rs | 82 +++++++++++-------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index be38777b..710a5ff1 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -1,12 +1,12 @@ #[cfg(test)] mod tests { - use crate::{ msg::*, state::Config }; + use crate::{msg::*, state::Config}; use cosmwasm_std::Addr; use name_minter::msg::InstantiateMsg as NameMinterInstantiateMsg; use sg_std::StargazeMsgWrapper; - use cw_multi_test::{ Contract, ContractWrapper, Executor }; + use cw_multi_test::{Contract, ContractWrapper, Executor}; use sg_multi_test::StargazeApp; @@ -23,7 +23,7 @@ mod tests { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, - crate::contract::query + crate::contract::query, ); Box::new(contract) } @@ -32,7 +32,7 @@ mod tests { let contract = ContractWrapper::new( sg721_name::entry::execute, sg721_name::entry::instantiate, - sg721_name::entry::query + sg721_name::entry::query, ); Box::new(contract) } @@ -41,10 +41,10 @@ mod tests { let contract = ContractWrapper::new( name_minter::contract::execute, name_minter::contract::instantiate, - name_minter::query::query + name_minter::query::query, ) - .with_reply(name_minter::contract::reply) - .with_sudo(name_minter::sudo::sudo); + .with_reply(name_minter::contract::reply) + .with_sudo(name_minter::sudo::sudo); Box::new(contract) } @@ -69,7 +69,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0005".to_string() + "addr0005".to_string(), ]; let msg = InstantiateMsg { @@ -91,7 +91,7 @@ mod tests { &msg, &[], "wl-contract".to_string(), - None + None, ) .unwrap(); @@ -104,7 +104,7 @@ mod tests { &msg, &[], "name-minter-contract".to_string(), - None + None, ) .unwrap(); @@ -126,7 +126,7 @@ mod tests { &wl_addr, &(QueryMsg::IncludesAddress { address: addrs[0].clone(), - }) + }), ) .unwrap(); assert!(includes); @@ -137,7 +137,7 @@ mod tests { &wl_addr, &(QueryMsg::MintCount { address: addrs[0].clone(), - }) + }), ) .unwrap(); assert_eq!(count, 0); @@ -168,7 +168,7 @@ mod tests { &wl_addr, &(QueryMsg::MintCount { address: addrs[0].clone(), - }) + }), ) .unwrap(); assert_eq!(res, 1); @@ -181,7 +181,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0005".to_string() + "addr0005".to_string(), ]; let msg = InstantiateMsg { @@ -203,7 +203,7 @@ mod tests { &msg, &[], "wl-contract".to_string(), - None + None, ) .unwrap(); @@ -216,7 +216,7 @@ mod tests { &msg, &[], "name-minter-contract".to_string(), - None + None, ) .unwrap(); @@ -240,7 +240,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0006".to_string() + "addr0006".to_string(), ], }; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); @@ -251,11 +251,14 @@ mod tests { &wl_addr, &(QueryMsg::IncludesAddress { address: "addr0006".to_string(), - }) + }), ) .unwrap(); assert!(!res); - let res: u64 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); + let res: u64 = app + .wrap() + .query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})) + .unwrap(); assert_eq!(res, 5); let msg = ExecuteMsg::AddAddresses { addresses: vec!["addr0007".to_string(), "addr0006".to_string()], @@ -268,11 +271,14 @@ mod tests { &wl_addr, &(QueryMsg::IncludesAddress { address: "addr0006".to_string(), - }) + }), ) .unwrap(); assert!(res); - let res: u64 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); + let res: u64 = app + .wrap() + .query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})) + .unwrap(); assert_eq!(res, 7); // remove addresses @@ -283,7 +289,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0006".to_string() + "addr0006".to_string(), ], }; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); @@ -294,7 +300,7 @@ mod tests { "addr0002".to_string(), "addr0003".to_string(), "addr0004".to_string(), - "addr0006".to_string() + "addr0006".to_string(), ], }; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); @@ -305,11 +311,14 @@ mod tests { &wl_addr, &(QueryMsg::IncludesAddress { address: "addr0006".to_string(), - }) + }), ) .unwrap(); assert!(!res); - let res: u64 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); + let res: u64 = app + .wrap() + .query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})) + .unwrap(); assert_eq!(res, 2); // per address limit @@ -337,7 +346,7 @@ mod tests { &wl_addr, &(QueryMsg::IsProcessable { address: "addr0007".to_string(), - }) + }), ) .unwrap(); assert!(res); @@ -348,7 +357,7 @@ mod tests { Addr::unchecked(minter_addr.clone()), wl_addr.clone(), &msg, - &[] + &[], ); assert!(res.is_ok()); let res: bool = app @@ -357,7 +366,7 @@ mod tests { &wl_addr, &(QueryMsg::IsProcessable { address: "addr0007".to_string(), - }) + }), ) .unwrap(); assert!(!res); @@ -371,7 +380,10 @@ mod tests { let msg = ExecuteMsg::Purge {}; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); assert!(res.is_ok()); - let res: u32 = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})).unwrap(); + let res: u32 = app + .wrap() + .query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})) + .unwrap(); assert_eq!(res, 0); // does not include addr0007 let res: bool = app @@ -380,14 +392,20 @@ mod tests { &wl_addr, &(QueryMsg::IncludesAddress { address: "addr0007".to_string(), - }) + }), ) .unwrap(); assert!(!res); // query config - let res: Config = app.wrap().query_wasm_smart(&wl_addr, &(QueryMsg::Config {})).unwrap(); - assert_eq!(res.admins, vec![OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()]); + let res: Config = app + .wrap() + .query_wasm_smart(&wl_addr, &(QueryMsg::Config {})) + .unwrap(); + assert_eq!( + res.admins, + vec![OTHER_ADMIN.to_string(), TEMP_ADMIN.to_string()] + ); assert_eq!(res.per_address_limit, new_per_address_limit); } From c7e819b41f129dbffaa78df24493d9b955e13cec Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Thu, 8 Feb 2024 11:35:31 -0900 Subject: [PATCH 48/91] add make target for coverage --- Makefile | 5 ++++- README.md | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 321ef8d3..e0da8e58 100644 --- a/Makefile +++ b/Makefile @@ -10,4 +10,7 @@ publish: sh scripts/publish.sh schema: - sh scripts/schema.sh \ No newline at end of file + sh scripts/schema.sh + +coverage: + cargo tarpaulin --verbose --workspace --timeout 120 --out Html --avoid-cfg-tarpaulin \ No newline at end of file diff --git a/README.md b/README.md index a16d534e..b13159ed 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,10 @@ The secondary marketplace for names. Names are automatically listed here once th Whitelist allows for flexible updating to add / remove addresses at any point in minting. Also adds helper to account for whitelist minting limits. +#### Coverage + +To run code coverage checks first install `tarpaulin` (`cargo install cargo-tarpaulin`), then run `make coverage` from the project root. + ## DISCLAIMER STARGAZE SOURCE CODE IS PROVIDED “AS IS”, AT YOUR OWN RISK, AND WITHOUT WARRANTIES OF ANY KIND. No developer or entity involved in creating or instantiating Stargaze smart contracts will be liable for any claims or damages whatsoever associated with your use, inability to use, or your interaction with other users of Stargaze, including any direct, indirect, incidental, special, exemplary, punitive or consequential damages, or loss of profits, cryptocurrencies, tokens, or anything else of value. Although Public Awesome, LLC and it's affilliates developed the initial code for Stargaze, it does not own or control the Stargaze network, which is run by a decentralized validator set. From b6fc6ab37c57cd66bc8e50e74827e67076d14ec3 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Fri, 9 Feb 2024 19:08:26 -0900 Subject: [PATCH 49/91] Add a function to return renewal price for multiple names --- contracts/marketplace/src/query.rs | 205 ++++++++++++++--------------- 1 file changed, 96 insertions(+), 109 deletions(-) diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 448504a9..f95c4744 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -1,16 +1,42 @@ use crate::helpers::get_renewal_price_and_bid; -use crate::msg::{BidOffset, Bidder, ConfigResponse, QueryMsg}; +use crate::msg::{ BidOffset, Bidder, ConfigResponse, QueryMsg }; use crate::state::{ - ask_key, asks, bid_key, bids, legacy_bids, Ask, AskKey, Bid, Id, SudoParams, TokenId, - ASK_COUNT, ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, + ask_key, + asks, + bid_key, + bids, + legacy_bids, + Ask, + AskKey, + Bid, + Id, + SudoParams, + TokenId, + ASK_COUNT, + ASK_HOOKS, + BID_HOOKS, + NAME_COLLECTION, + NAME_MINTER, + RENEWAL_QUEUE, + SALE_HOOKS, SUDO_PARAMS, }; use cosmwasm_std::{ - coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, + coin, + to_binary, + Addr, + Binary, + Coin, + Deps, + Env, + Order, + StdError, + StdResult, + Timestamp, }; use cw_storage_plus::Bound; -use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; +use sg_name_minter::{ SgNameMinterQueryMsg, SudoParams as NameMinterParams }; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; @@ -27,73 +53,38 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::Ask { token_id } => to_binary(&query_ask(deps, token_id)?), QueryMsg::Asks { start_after, limit } => to_binary(&query_asks(deps, start_after, limit)?), - QueryMsg::AsksBySeller { - seller, - start_after, - limit, - } => to_binary(&query_asks_by_seller( - deps, - api.addr_validate(&seller)?, - start_after, - limit, - )?), - QueryMsg::AsksByRenewTime { - max_time, - start_after, - limit, - } => to_binary(&query_asks_by_renew_time( - deps, - max_time, - start_after, - limit, - )?), - QueryMsg::AskRenewPrice { - current_time, - token_id, - } => to_binary(&query_ask_renew_price(deps, current_time, token_id)?), + QueryMsg::AsksBySeller { seller, start_after, limit } => + to_binary( + &query_asks_by_seller(deps, api.addr_validate(&seller)?, start_after, limit)? + ), + QueryMsg::AsksByRenewTime { max_time, start_after, limit } => + to_binary(&query_asks_by_renew_time(deps, max_time, start_after, limit)?), + QueryMsg::AskRenewPrice { current_time, token_id } => + to_binary(&query_ask_renew_price(deps, current_time, token_id)?), + QueryMsg::AskRenewalPrices { current_time, token_ids } => + to_binary(&query_ask_renew_prices(deps, current_time, token_ids)?), QueryMsg::AskCount {} => to_binary(&query_ask_count(deps)?), QueryMsg::Bid { token_id, bidder } => { to_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) } - QueryMsg::Bids { - token_id, - start_after, - limit, - } => to_binary(&query_bids(deps, token_id, start_after, limit)?), + QueryMsg::Bids { token_id, start_after, limit } => + to_binary(&query_bids(deps, token_id, start_after, limit)?), QueryMsg::LegacyBids { start_after, limit } => { to_binary(&query_legacy_bids(deps, start_after, limit)?) } - QueryMsg::BidsByBidder { - bidder, - start_after, - limit, - } => to_binary(&query_bids_by_bidder( - deps, - api.addr_validate(&bidder)?, - start_after, - limit, - )?), + QueryMsg::BidsByBidder { bidder, start_after, limit } => + to_binary( + &query_bids_by_bidder(deps, api.addr_validate(&bidder)?, start_after, limit)? + ), QueryMsg::BidsSortedByPrice { start_after, limit } => { to_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) } - QueryMsg::ReverseBidsSortedByPrice { - start_before, - limit, - } => to_binary(&reverse_query_bids_sorted_by_price( - deps, - start_before, - limit, - )?), - QueryMsg::BidsForSeller { - seller, - start_after, - limit, - } => to_binary(&query_bids_for_seller( - deps, - api.addr_validate(&seller)?, - start_after, - limit, - )?), + QueryMsg::ReverseBidsSortedByPrice { start_before, limit } => + to_binary(&reverse_query_bids_sorted_by_price(deps, start_before, limit)?), + QueryMsg::BidsForSeller { seller, start_after, limit } => + to_binary( + &query_bids_for_seller(deps, api.addr_validate(&seller)?, start_after, limit)? + ), QueryMsg::HighestBid { token_id } => to_binary(&query_highest_bid(deps, token_id)?), QueryMsg::Params {} => to_binary(&query_params(deps)?), QueryMsg::AskHooks {} => to_binary(&ASK_HOOKS.query_hooks(deps)?), @@ -112,8 +103,7 @@ pub fn query_config(deps: Deps) -> StdResult { } pub fn query_renewal_queue(deps: Deps, time: Timestamp) -> StdResult> { - let names = RENEWAL_QUEUE - .prefix(time.seconds()) + let names = RENEWAL_QUEUE.prefix(time.seconds()) .range(deps.storage, None, None, Order::Ascending) .map(|item| item.map(|item| item.1)) .collect::>>()?; @@ -128,13 +118,11 @@ pub fn query_asks(deps: Deps, start_after: Option, limit: Option) -> St let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; asks() - .idx - .id - .range( + .idx.id.range( deps.storage, Some(Bound::exclusive(start_after.unwrap_or_default())), None, - Order::Ascending, + Order::Ascending ) .take(limit) .map(|res| res.map(|item| item.1)) @@ -150,16 +138,14 @@ pub fn query_asks_by_seller( deps: Deps, seller: Addr, start_after: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; let start = start_after.map(|start| Bound::exclusive(ask_key(&start))); asks() - .idx - .seller - .prefix(seller) + .idx.seller.prefix(seller) .range(deps.storage, start, None, Order::Ascending) .take(limit) .map(|res| res.map(|item| item.1)) @@ -170,18 +156,16 @@ pub fn query_asks_by_renew_time( deps: Deps, max_time: Timestamp, start_after: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT) as usize; let renewable_asks = asks() - .idx - .renewal_time - .range( + .idx.renewal_time.range( deps.storage, start_after.map(|start| Bound::inclusive((start.seconds() + 1, "".to_string()))), Some(Bound::exclusive((max_time.seconds() + 1, "".to_string()))), - Order::Ascending, + Order::Ascending ) .take(limit) .map(|item| item.map(|(_, v)| v)) @@ -193,7 +177,7 @@ pub fn query_asks_by_renew_time( pub fn query_ask_renew_price( deps: Deps, current_time: Timestamp, - token_id: String, + token_id: String ) -> StdResult<(Option, Option)> { let ask = asks().load(deps.storage, ask_key(&token_id))?; let sudo_params = SUDO_PARAMS.load(deps.storage)?; @@ -205,22 +189,33 @@ pub fn query_ask_renew_price( } let name_minter = NAME_MINTER.load(deps.storage)?; - let name_minter_params = deps - .querier - .query_wasm_smart::(name_minter, &SgNameMinterQueryMsg::Params {})?; + let name_minter_params = deps.querier.query_wasm_smart::( + name_minter, + &(SgNameMinterQueryMsg::Params {}) + )?; let (renewal_price, valid_bid) = get_renewal_price_and_bid( deps, ¤t_time, &sudo_params, &ask.token_id, - name_minter_params.base_price.u128(), - ) - .map_err(|_| StdError::generic_err("failed to fetch renewal price".to_string()))?; + name_minter_params.base_price.u128() + ).map_err(|_| StdError::generic_err("failed to fetch renewal price".to_string()))?; Ok((Some(coin(renewal_price.u128(), NATIVE_DENOM)), valid_bid)) } +pub fn query_ask_renew_prices( + deps: Deps, + current_time: Timestamp, + token_ids: Vec +) -> StdResult, Option)>> { + token_ids + .iter() + .map(|token_id| query_ask_renew_price(deps, current_time, token_id.to_string())) + .collect::>>() +} + pub fn query_ask(deps: Deps, token_id: TokenId) -> StdResult> { asks().may_load(deps.storage, ask_key(&token_id)) } @@ -233,16 +228,14 @@ pub fn query_bids_by_bidder( deps: Deps, bidder: Addr, start_after: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; let start = start_after.map(|start| Bound::exclusive((start, bidder.clone()))); bids() - .idx - .bidder - .prefix(bidder) + .idx.bidder.prefix(bidder) .range(deps.storage, start, None, Order::Ascending) .take(limit) .map(|item| item.map(|(_, b)| b)) @@ -253,19 +246,18 @@ pub fn query_bids_for_seller( deps: Deps, seller: Addr, start_after: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; // Query seller asks, then collect bids starting after token_id // Limitation: Can not collect bids in the middle using `start_after: token_id` pattern // This leads to imprecise pagination based on token id and not bid count - let start_token_id = - start_after.map(|start| Bound::::exclusive(ask_key(&start.token_id))); + let start_token_id = start_after.map(|start| + Bound::::exclusive(ask_key(&start.token_id)) + ); let bids = asks() - .idx - .seller - .prefix(seller) + .idx.seller.prefix(seller) .range(deps.storage, start_token_id, None, Order::Ascending) .take(limit) .map(|res| res.map(|item| item.0).unwrap()) @@ -285,7 +277,7 @@ pub fn query_bids( deps: Deps, token_id: TokenId, start_after: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; let start = start_after.map(|s| Bound::ExclusiveRaw(s.into())); @@ -301,12 +293,13 @@ pub fn query_bids( pub fn query_legacy_bids( deps: Deps, start_after: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; - let start = - start_after.map(|offset| Bound::exclusive(bid_key(&offset.token_id, &offset.bidder))); + let start = start_after.map(|offset| + Bound::exclusive(bid_key(&offset.token_id, &offset.bidder)) + ); legacy_bids() .range(deps.storage, start, None, Order::Ascending) @@ -317,9 +310,7 @@ pub fn query_legacy_bids( pub fn query_highest_bid(deps: Deps, token_id: TokenId) -> StdResult> { let bid = bids() - .idx - .price - .range(deps.storage, None, None, Order::Descending) + .idx.price.range(deps.storage, None, None, Order::Descending) .filter_map(|item| { let (key, bid) = item.unwrap(); if key.0 == token_id { @@ -339,7 +330,7 @@ pub fn query_highest_bid(deps: Deps, token_id: TokenId) -> StdResult pub fn query_bids_sorted_by_price( deps: Deps, start_after: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; @@ -351,9 +342,7 @@ pub fn query_bids_sorted_by_price( }); bids() - .idx - .price - .range(deps.storage, start, None, Order::Ascending) + .idx.price.range(deps.storage, start, None, Order::Ascending) .take(limit) .map(|item| item.map(|(_, b)| b)) .collect::>>() @@ -362,7 +351,7 @@ pub fn query_bids_sorted_by_price( pub fn reverse_query_bids_sorted_by_price( deps: Deps, start_before: Option, - limit: Option, + limit: Option ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; @@ -374,9 +363,7 @@ pub fn reverse_query_bids_sorted_by_price( }); bids() - .idx - .price - .range(deps.storage, None, end, Order::Descending) + .idx.price.range(deps.storage, None, end, Order::Descending) .take(limit) .map(|item| item.map(|(_, b)| b)) .collect::>>() From 5b6b4fb035b96e4d3b9cb8070e643b5f5b6578a4 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Fri, 9 Feb 2024 19:13:14 -0900 Subject: [PATCH 50/91] linting --- contracts/marketplace/src/query.rs | 200 ++++++++++++++++------------- 1 file changed, 114 insertions(+), 86 deletions(-) diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index f95c4744..16246ec6 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -1,42 +1,16 @@ use crate::helpers::get_renewal_price_and_bid; -use crate::msg::{ BidOffset, Bidder, ConfigResponse, QueryMsg }; +use crate::msg::{BidOffset, Bidder, ConfigResponse, QueryMsg}; use crate::state::{ - ask_key, - asks, - bid_key, - bids, - legacy_bids, - Ask, - AskKey, - Bid, - Id, - SudoParams, - TokenId, - ASK_COUNT, - ASK_HOOKS, - BID_HOOKS, - NAME_COLLECTION, - NAME_MINTER, - RENEWAL_QUEUE, - SALE_HOOKS, + ask_key, asks, bid_key, bids, legacy_bids, Ask, AskKey, Bid, Id, SudoParams, TokenId, + ASK_COUNT, ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, SUDO_PARAMS, }; use cosmwasm_std::{ - coin, - to_binary, - Addr, - Binary, - Coin, - Deps, - Env, - Order, - StdError, - StdResult, - Timestamp, + coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, }; use cw_storage_plus::Bound; -use sg_name_minter::{ SgNameMinterQueryMsg, SudoParams as NameMinterParams }; +use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; @@ -53,38 +27,77 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::Ask { token_id } => to_binary(&query_ask(deps, token_id)?), QueryMsg::Asks { start_after, limit } => to_binary(&query_asks(deps, start_after, limit)?), - QueryMsg::AsksBySeller { seller, start_after, limit } => - to_binary( - &query_asks_by_seller(deps, api.addr_validate(&seller)?, start_after, limit)? - ), - QueryMsg::AsksByRenewTime { max_time, start_after, limit } => - to_binary(&query_asks_by_renew_time(deps, max_time, start_after, limit)?), - QueryMsg::AskRenewPrice { current_time, token_id } => - to_binary(&query_ask_renew_price(deps, current_time, token_id)?), - QueryMsg::AskRenewalPrices { current_time, token_ids } => - to_binary(&query_ask_renew_prices(deps, current_time, token_ids)?), + QueryMsg::AsksBySeller { + seller, + start_after, + limit, + } => to_binary(&query_asks_by_seller( + deps, + api.addr_validate(&seller)?, + start_after, + limit, + )?), + QueryMsg::AsksByRenewTime { + max_time, + start_after, + limit, + } => to_binary(&query_asks_by_renew_time( + deps, + max_time, + start_after, + limit, + )?), + QueryMsg::AskRenewPrice { + current_time, + token_id, + } => to_binary(&query_ask_renew_price(deps, current_time, token_id)?), + QueryMsg::AskRenewalPrices { + current_time, + token_ids, + } => to_binary(&query_ask_renew_prices(deps, current_time, token_ids)?), QueryMsg::AskCount {} => to_binary(&query_ask_count(deps)?), QueryMsg::Bid { token_id, bidder } => { to_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) } - QueryMsg::Bids { token_id, start_after, limit } => - to_binary(&query_bids(deps, token_id, start_after, limit)?), + QueryMsg::Bids { + token_id, + start_after, + limit, + } => to_binary(&query_bids(deps, token_id, start_after, limit)?), QueryMsg::LegacyBids { start_after, limit } => { to_binary(&query_legacy_bids(deps, start_after, limit)?) } - QueryMsg::BidsByBidder { bidder, start_after, limit } => - to_binary( - &query_bids_by_bidder(deps, api.addr_validate(&bidder)?, start_after, limit)? - ), + QueryMsg::BidsByBidder { + bidder, + start_after, + limit, + } => to_binary(&query_bids_by_bidder( + deps, + api.addr_validate(&bidder)?, + start_after, + limit, + )?), QueryMsg::BidsSortedByPrice { start_after, limit } => { to_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) } - QueryMsg::ReverseBidsSortedByPrice { start_before, limit } => - to_binary(&reverse_query_bids_sorted_by_price(deps, start_before, limit)?), - QueryMsg::BidsForSeller { seller, start_after, limit } => - to_binary( - &query_bids_for_seller(deps, api.addr_validate(&seller)?, start_after, limit)? - ), + QueryMsg::ReverseBidsSortedByPrice { + start_before, + limit, + } => to_binary(&reverse_query_bids_sorted_by_price( + deps, + start_before, + limit, + )?), + QueryMsg::BidsForSeller { + seller, + start_after, + limit, + } => to_binary(&query_bids_for_seller( + deps, + api.addr_validate(&seller)?, + start_after, + limit, + )?), QueryMsg::HighestBid { token_id } => to_binary(&query_highest_bid(deps, token_id)?), QueryMsg::Params {} => to_binary(&query_params(deps)?), QueryMsg::AskHooks {} => to_binary(&ASK_HOOKS.query_hooks(deps)?), @@ -103,7 +116,8 @@ pub fn query_config(deps: Deps) -> StdResult { } pub fn query_renewal_queue(deps: Deps, time: Timestamp) -> StdResult> { - let names = RENEWAL_QUEUE.prefix(time.seconds()) + let names = RENEWAL_QUEUE + .prefix(time.seconds()) .range(deps.storage, None, None, Order::Ascending) .map(|item| item.map(|item| item.1)) .collect::>>()?; @@ -118,11 +132,13 @@ pub fn query_asks(deps: Deps, start_after: Option, limit: Option) -> St let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; asks() - .idx.id.range( + .idx + .id + .range( deps.storage, Some(Bound::exclusive(start_after.unwrap_or_default())), None, - Order::Ascending + Order::Ascending, ) .take(limit) .map(|res| res.map(|item| item.1)) @@ -138,14 +154,16 @@ pub fn query_asks_by_seller( deps: Deps, seller: Addr, start_after: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; let start = start_after.map(|start| Bound::exclusive(ask_key(&start))); asks() - .idx.seller.prefix(seller) + .idx + .seller + .prefix(seller) .range(deps.storage, start, None, Order::Ascending) .take(limit) .map(|res| res.map(|item| item.1)) @@ -156,16 +174,18 @@ pub fn query_asks_by_renew_time( deps: Deps, max_time: Timestamp, start_after: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT) as usize; let renewable_asks = asks() - .idx.renewal_time.range( + .idx + .renewal_time + .range( deps.storage, start_after.map(|start| Bound::inclusive((start.seconds() + 1, "".to_string()))), Some(Bound::exclusive((max_time.seconds() + 1, "".to_string()))), - Order::Ascending + Order::Ascending, ) .take(limit) .map(|item| item.map(|(_, v)| v)) @@ -177,7 +197,7 @@ pub fn query_asks_by_renew_time( pub fn query_ask_renew_price( deps: Deps, current_time: Timestamp, - token_id: String + token_id: String, ) -> StdResult<(Option, Option)> { let ask = asks().load(deps.storage, ask_key(&token_id))?; let sudo_params = SUDO_PARAMS.load(deps.storage)?; @@ -189,18 +209,18 @@ pub fn query_ask_renew_price( } let name_minter = NAME_MINTER.load(deps.storage)?; - let name_minter_params = deps.querier.query_wasm_smart::( - name_minter, - &(SgNameMinterQueryMsg::Params {}) - )?; + let name_minter_params = deps + .querier + .query_wasm_smart::(name_minter, &(SgNameMinterQueryMsg::Params {}))?; let (renewal_price, valid_bid) = get_renewal_price_and_bid( deps, ¤t_time, &sudo_params, &ask.token_id, - name_minter_params.base_price.u128() - ).map_err(|_| StdError::generic_err("failed to fetch renewal price".to_string()))?; + name_minter_params.base_price.u128(), + ) + .map_err(|_| StdError::generic_err("failed to fetch renewal price".to_string()))?; Ok((Some(coin(renewal_price.u128(), NATIVE_DENOM)), valid_bid)) } @@ -208,7 +228,7 @@ pub fn query_ask_renew_price( pub fn query_ask_renew_prices( deps: Deps, current_time: Timestamp, - token_ids: Vec + token_ids: Vec, ) -> StdResult, Option)>> { token_ids .iter() @@ -228,14 +248,16 @@ pub fn query_bids_by_bidder( deps: Deps, bidder: Addr, start_after: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; let start = start_after.map(|start| Bound::exclusive((start, bidder.clone()))); bids() - .idx.bidder.prefix(bidder) + .idx + .bidder + .prefix(bidder) .range(deps.storage, start, None, Order::Ascending) .take(limit) .map(|item| item.map(|(_, b)| b)) @@ -246,18 +268,19 @@ pub fn query_bids_for_seller( deps: Deps, seller: Addr, start_after: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; // Query seller asks, then collect bids starting after token_id // Limitation: Can not collect bids in the middle using `start_after: token_id` pattern // This leads to imprecise pagination based on token id and not bid count - let start_token_id = start_after.map(|start| - Bound::::exclusive(ask_key(&start.token_id)) - ); + let start_token_id = + start_after.map(|start| Bound::::exclusive(ask_key(&start.token_id))); let bids = asks() - .idx.seller.prefix(seller) + .idx + .seller + .prefix(seller) .range(deps.storage, start_token_id, None, Order::Ascending) .take(limit) .map(|res| res.map(|item| item.0).unwrap()) @@ -277,7 +300,7 @@ pub fn query_bids( deps: Deps, token_id: TokenId, start_after: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; let start = start_after.map(|s| Bound::ExclusiveRaw(s.into())); @@ -293,13 +316,12 @@ pub fn query_bids( pub fn query_legacy_bids( deps: Deps, start_after: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; - let start = start_after.map(|offset| - Bound::exclusive(bid_key(&offset.token_id, &offset.bidder)) - ); + let start = + start_after.map(|offset| Bound::exclusive(bid_key(&offset.token_id, &offset.bidder))); legacy_bids() .range(deps.storage, start, None, Order::Ascending) @@ -310,7 +332,9 @@ pub fn query_legacy_bids( pub fn query_highest_bid(deps: Deps, token_id: TokenId) -> StdResult> { let bid = bids() - .idx.price.range(deps.storage, None, None, Order::Descending) + .idx + .price + .range(deps.storage, None, None, Order::Descending) .filter_map(|item| { let (key, bid) = item.unwrap(); if key.0 == token_id { @@ -330,7 +354,7 @@ pub fn query_highest_bid(deps: Deps, token_id: TokenId) -> StdResult pub fn query_bids_sorted_by_price( deps: Deps, start_after: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; @@ -342,7 +366,9 @@ pub fn query_bids_sorted_by_price( }); bids() - .idx.price.range(deps.storage, start, None, Order::Ascending) + .idx + .price + .range(deps.storage, start, None, Order::Ascending) .take(limit) .map(|item| item.map(|(_, b)| b)) .collect::>>() @@ -351,7 +377,7 @@ pub fn query_bids_sorted_by_price( pub fn reverse_query_bids_sorted_by_price( deps: Deps, start_before: Option, - limit: Option + limit: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; @@ -363,7 +389,9 @@ pub fn reverse_query_bids_sorted_by_price( }); bids() - .idx.price.range(deps.storage, None, end, Order::Descending) + .idx + .price + .range(deps.storage, None, end, Order::Descending) .take(limit) .map(|item| item.map(|(_, b)| b)) .collect::>>() From 9172e555c7f1c736d2c7eacf91069e919088e33b Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sat, 10 Feb 2024 11:30:15 -0900 Subject: [PATCH 51/91] add missing query info and fix test --- contracts/marketplace/src/msg.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index 30008069..acf5a5f8 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -159,6 +159,12 @@ pub enum QueryMsg { current_time: Timestamp, token_id: TokenId, }, + /// Get renewal price for multiple names + #[returns(Vec<(TokenId, Coin, Option)>)] + AskRenewalPrices { + current_time: Timestamp, + token_ids: Vec, + }, /// Get data for a specific bid #[returns(Option)] Bid { token_id: TokenId, bidder: Bidder }, From ce0d3583368dea586930f11fbc44d4c5856d4f4e Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sat, 10 Feb 2024 11:43:52 -0900 Subject: [PATCH 52/91] genreate schemas --- ts/src/NameMarketplace.client.ts | 24 +++++++++++++++++++++- ts/src/NameMarketplace.message-composer.ts | 2 +- ts/src/NameMarketplace.types.ts | 6 ++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ts/src/NameMarketplace.client.ts b/ts/src/NameMarketplace.client.ts index 951bfe0a..27bb0c20 100644 --- a/ts/src/NameMarketplace.client.ts +++ b/ts/src/NameMarketplace.client.ts @@ -6,7 +6,7 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { StdFee } from "@cosmjs/amino"; -import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfTupleOfStringAndCoinAndNullable_Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceReadOnlyInterface { contractAddress: string; ask: ({ @@ -47,6 +47,13 @@ export interface NameMarketplaceReadOnlyInterface { currentTime: Timestamp; tokenId: string; }) => Promise; + askRenewalPrices: ({ + currentTime, + tokenIds + }: { + currentTime: Timestamp; + tokenIds: string[]; + }) => Promise; bid: ({ bidder, tokenId @@ -131,6 +138,7 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf this.asksBySeller = this.asksBySeller.bind(this); this.asksByRenewTime = this.asksByRenewTime.bind(this); this.askRenewPrice = this.askRenewPrice.bind(this); + this.askRenewalPrices = this.askRenewalPrices.bind(this); this.bid = this.bid.bind(this); this.bidsByBidder = this.bidsByBidder.bind(this); this.bids = this.bids.bind(this); @@ -225,6 +233,20 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf } }); }; + askRenewalPrices = async ({ + currentTime, + tokenIds + }: { + currentTime: Timestamp; + tokenIds: string[]; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + ask_renewal_prices: { + current_time: currentTime, + token_ids: tokenIds + } + }); + }; bid = async ({ bidder, tokenId diff --git a/ts/src/NameMarketplace.message-composer.ts b/ts/src/NameMarketplace.message-composer.ts index 6e745ec7..8b89c934 100644 --- a/ts/src/NameMarketplace.message-composer.ts +++ b/ts/src/NameMarketplace.message-composer.ts @@ -7,7 +7,7 @@ import { MsgExecuteContractEncodeObject } from "cosmwasm"; import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; import { toUtf8 } from "@cosmjs/encoding"; -import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfTupleOfStringAndCoinAndNullable_Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceMessage { contractAddress: string; sender: string; diff --git a/ts/src/NameMarketplace.types.ts b/ts/src/NameMarketplace.types.ts index 1145bc90..392e9893 100644 --- a/ts/src/NameMarketplace.types.ts +++ b/ts/src/NameMarketplace.types.ts @@ -97,6 +97,11 @@ export type QueryMsg = { current_time: Timestamp; token_id: string; }; +} | { + ask_renewal_prices: { + current_time: Timestamp; + token_ids: string[]; + }; } | { bid: { bidder: string; @@ -185,6 +190,7 @@ export interface Bid { created_time: Timestamp; token_id: string; } +export type ArrayOfTupleOfStringAndCoinAndNullable_Bid = [string, Coin, Bid | null][]; export type ArrayOfAsk = Ask[]; export type NullableBid = Bid | null; export type ArrayOfBid = Bid[]; From 015eafe6a0020756f675633a54bd80cb3f2eece2 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sat, 10 Feb 2024 11:47:09 -0900 Subject: [PATCH 53/91] check in file --- .../marketplace/schema/name-marketplace.json | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/contracts/marketplace/schema/name-marketplace.json b/contracts/marketplace/schema/name-marketplace.json index eab0cf02..7c052d22 100644 --- a/contracts/marketplace/schema/name-marketplace.json +++ b/contracts/marketplace/schema/name-marketplace.json @@ -544,6 +544,35 @@ }, "additionalProperties": false }, + { + "description": "Get renewal price for multiple names", + "type": "object", + "required": [ + "ask_renewal_prices" + ], + "properties": { + "ask_renewal_prices": { + "type": "object", + "required": [ + "current_time", + "token_ids" + ], + "properties": { + "current_time": { + "$ref": "#/definitions/Timestamp" + }, + "token_ids": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Get data for a specific bid", "type": "object", @@ -1126,6 +1155,96 @@ } } }, + "ask_renewal_prices": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_Tuple_of_String_and_Coin_and_Nullable_Bid", + "type": "array", + "items": { + "type": "array", + "items": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Coin" + }, + { + "anyOf": [ + { + "$ref": "#/definitions/Bid" + }, + { + "type": "null" + } + ] + } + ], + "maxItems": 3, + "minItems": 3 + }, + "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "Bid": { + "description": "Represents a bid (offer) on the marketplace", + "type": "object", + "required": [ + "amount", + "bidder", + "created_time", + "token_id" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "bidder": { + "$ref": "#/definitions/Addr" + }, + "created_time": { + "$ref": "#/definitions/Timestamp" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, "asks": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Array_of_Ask", From 295acbfd5e4b760a904b70bfa6fa28bdb137c63e Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sat, 10 Feb 2024 12:53:57 -0900 Subject: [PATCH 54/91] handle bad returns and update test --- contracts/marketplace/src/query.rs | 21 +++++++++++-- .../name-minter/src/integration_tests.rs | 30 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 16246ec6..6b0b0e74 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -7,7 +7,7 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, + coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, Uint128 }; use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; @@ -229,10 +229,25 @@ pub fn query_ask_renew_prices( deps: Deps, current_time: Timestamp, token_ids: Vec, -) -> StdResult, Option)>> { +) -> StdResult> { token_ids .iter() - .map(|token_id| query_ask_renew_price(deps, current_time, token_id.to_string())) + .map(|token_id| { + let (coin_option, bid_option) = query_ask_renew_price(deps, current_time, token_id.to_string()) + .map_err(|e| StdError::generic_err(format!("Failed to query ask renew price for token_id {}: {}", token_id, e)))?; + let coin = coin_option.unwrap_or(Coin { + denom: "".to_string(), + amount: Uint128::zero(), + }); + let bid = bid_option.unwrap_or(Bid { + // Fill in the fields of Bid with default values + token_id: "".to_string(), + bidder: Addr::unchecked(""), + amount: Uint128::zero(), + created_time: Timestamp::from_seconds(0), + }); + Ok((coin, bid)) + }) .collect::>>() } diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index df133cb2..03ac81ea 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -81,6 +81,7 @@ const BIDDER2: &str = "bidder2"; const ADMIN: &str = "admin"; const ADMIN2: &str = "admin2"; const NAME: &str = "bobo"; +const NAME2: &str = "mccool"; const VERIFIER: &str = "verifier"; const OPERATOR: &str = "operator"; @@ -1191,6 +1192,35 @@ mod query { assert_eq!(renewal_price.unwrap().amount, expect_price); } + #[test] + fn multiple_renew_prices() { + // test that QueryRenewPrices returns multiple entires + let mut app = instantiate_contracts(None, None, None); + + mint_and_list(&mut app, NAME, USER, None).unwrap(); + mint_and_list(&mut app, NAME2, USER, None).unwrap(); + + // Amount to make it just above the char price + let bid_amount = 1_000_000_000u128 * 201u128; + + update_block_time(&mut app, SECONDS_PER_YEAR - (60 * 60 * 24 * 31)); + + bid(&mut app, NAME, BIDDER, bid_amount); + bid(&mut app, NAME2, BIDDER, bid_amount); + + update_block_time(&mut app, 60 * 60 * 24 * 31); + + let result = app.wrap().query_wasm_smart::>( + MKT, + &MarketplaceQueryMsg::AskRenewalPrices { + current_time: app.block_info().time, + token_ids: vec![NAME.to_string(), NAME2.to_string()], + }, + ); + println!("{:?}", result); + assert!(result.is_ok()); + } + #[test] fn renew_execute_msg() { let mut app = instantiate_contracts(None, None, None); From 136e2a2557beb6abd40213453566e22fdcf6c018 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sat, 10 Feb 2024 12:56:25 -0900 Subject: [PATCH 55/91] linter --- contracts/marketplace/src/query.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 6b0b0e74..9cb05561 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -7,7 +7,7 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, Uint128 + coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, Uint128, }; use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; @@ -233,8 +233,13 @@ pub fn query_ask_renew_prices( token_ids .iter() .map(|token_id| { - let (coin_option, bid_option) = query_ask_renew_price(deps, current_time, token_id.to_string()) - .map_err(|e| StdError::generic_err(format!("Failed to query ask renew price for token_id {}: {}", token_id, e)))?; + let (coin_option, bid_option) = + query_ask_renew_price(deps, current_time, token_id.to_string()).map_err(|e| { + StdError::generic_err(format!( + "Failed to query ask renew price for token_id {}: {}", + token_id, e + )) + })?; let coin = coin_option.unwrap_or(Coin { denom: "".to_string(), amount: Uint128::zero(), @@ -244,7 +249,7 @@ pub fn query_ask_renew_prices( token_id: "".to_string(), bidder: Addr::unchecked(""), amount: Uint128::zero(), - created_time: Timestamp::from_seconds(0), + created_time: Timestamp::from_seconds(0), }); Ok((coin, bid)) }) From e4acca70c62a2dda0630fe332d3d54a2401bb160 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 19 Feb 2024 20:37:09 -0900 Subject: [PATCH 56/91] Convert ask renew price response to struct --- contracts/marketplace/src/msg.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index acf5a5f8..3f4065a8 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -124,6 +124,13 @@ impl BidOffset { } } +#[cw_serde] +pub struct AskRenewPriceResponse { + pub token_id: TokenId, + pub price: Coin, + pub bid: Option, +} + #[cw_serde] #[derive(QueryResponses)] pub enum QueryMsg { @@ -160,7 +167,7 @@ pub enum QueryMsg { token_id: TokenId, }, /// Get renewal price for multiple names - #[returns(Vec<(TokenId, Coin, Option)>)] + #[returns(Vec)] AskRenewalPrices { current_time: Timestamp, token_ids: Vec, From 05e9014fb68e6fe8f1cfe1bed2db979500b9b3c6 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 19 Feb 2024 20:43:33 -0900 Subject: [PATCH 57/91] return vect of struct; remove explicit error return --- contracts/marketplace/src/query.rs | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 9cb05561..c4c5b0da 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -1,10 +1,11 @@ use crate::helpers::get_renewal_price_and_bid; -use crate::msg::{BidOffset, Bidder, ConfigResponse, QueryMsg}; +use crate::msg::{AskRenewPriceResponse, BidOffset, Bidder, ConfigResponse, QueryMsg}; use crate::state::{ ask_key, asks, bid_key, bids, legacy_bids, Ask, AskKey, Bid, Id, SudoParams, TokenId, ASK_COUNT, ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, SUDO_PARAMS, }; +use crate::ContractError; use cosmwasm_std::{ coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, Uint128, @@ -229,29 +230,17 @@ pub fn query_ask_renew_prices( deps: Deps, current_time: Timestamp, token_ids: Vec, -) -> StdResult> { +) -> StdResult> { token_ids .iter() .map(|token_id| { let (coin_option, bid_option) = - query_ask_renew_price(deps, current_time, token_id.to_string()).map_err(|e| { - StdError::generic_err(format!( - "Failed to query ask renew price for token_id {}: {}", - token_id, e - )) - })?; - let coin = coin_option.unwrap_or(Coin { - denom: "".to_string(), - amount: Uint128::zero(), - }); - let bid = bid_option.unwrap_or(Bid { - // Fill in the fields of Bid with default values - token_id: "".to_string(), - bidder: Addr::unchecked(""), - amount: Uint128::zero(), - created_time: Timestamp::from_seconds(0), - }); - Ok((coin, bid)) + query_ask_renew_price(deps, current_time, token_id.to_string())?; + Ok(AskRenewPriceResponse { + token_id: token_id.to_string(), + price: coin_option.unwrap_or_default(), + bid: bid_option, + }) }) .collect::>>() } From 2b341ba151589f90802984ed528ca3bb5d9ca980 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 19 Feb 2024 20:46:05 -0900 Subject: [PATCH 58/91] fix test --- contracts/name-minter/src/integration_tests.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 03ac81ea..2823e5f3 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -862,6 +862,7 @@ mod query { use cosmwasm_std::coin; use cosmwasm_std::Coin; use cosmwasm_std::StdResult; + use name_marketplace::msg::AskRenewPriceResponse; use name_marketplace::msg::BidOffset; use name_marketplace::state::Ask; use sg721_base::msg::CollectionInfoResponse; @@ -1210,7 +1211,7 @@ mod query { update_block_time(&mut app, 60 * 60 * 24 * 31); - let result = app.wrap().query_wasm_smart::>( + let result = app.wrap().query_wasm_smart::>( MKT, &MarketplaceQueryMsg::AskRenewalPrices { current_time: app.block_info().time, From 93c37f78e32bbde56c4410049b95beca02ed4d17 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 19 Feb 2024 20:49:04 -0900 Subject: [PATCH 59/91] fix linter error --- contracts/marketplace/src/query.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index c4c5b0da..be6d50b9 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -5,10 +5,9 @@ use crate::state::{ ASK_COUNT, ASK_HOOKS, BID_HOOKS, NAME_COLLECTION, NAME_MINTER, RENEWAL_QUEUE, SALE_HOOKS, SUDO_PARAMS, }; -use crate::ContractError; use cosmwasm_std::{ - coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, Uint128, + coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, }; use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; From 69532346cdeebd93f62768e88e1feeaa83afb356 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 19 Feb 2024 20:51:50 -0900 Subject: [PATCH 60/91] update schemas --- ts/src/NameMarketplace.client.ts | 6 +++--- ts/src/NameMarketplace.message-composer.ts | 2 +- ts/src/NameMarketplace.types.ts | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ts/src/NameMarketplace.client.ts b/ts/src/NameMarketplace.client.ts index 27bb0c20..375ff7d6 100644 --- a/ts/src/NameMarketplace.client.ts +++ b/ts/src/NameMarketplace.client.ts @@ -6,7 +6,7 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { StdFee } from "@cosmjs/amino"; -import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfTupleOfStringAndCoinAndNullable_Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfAskRenewPriceResponse, AskRenewPriceResponse, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceReadOnlyInterface { contractAddress: string; ask: ({ @@ -53,7 +53,7 @@ export interface NameMarketplaceReadOnlyInterface { }: { currentTime: Timestamp; tokenIds: string[]; - }) => Promise; + }) => Promise; bid: ({ bidder, tokenId @@ -239,7 +239,7 @@ export class NameMarketplaceQueryClient implements NameMarketplaceReadOnlyInterf }: { currentTime: Timestamp; tokenIds: string[]; - }): Promise => { + }): Promise => { return this.client.queryContractSmart(this.contractAddress, { ask_renewal_prices: { current_time: currentTime, diff --git a/ts/src/NameMarketplace.message-composer.ts b/ts/src/NameMarketplace.message-composer.ts index 8b89c934..4e68677f 100644 --- a/ts/src/NameMarketplace.message-composer.ts +++ b/ts/src/NameMarketplace.message-composer.ts @@ -7,7 +7,7 @@ import { MsgExecuteContractEncodeObject } from "cosmwasm"; import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; import { toUtf8 } from "@cosmjs/encoding"; -import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfTupleOfStringAndCoinAndNullable_Bid, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; +import { Uint128, Decimal, InstantiateMsg, ExecuteMsg, QueryMsg, Timestamp, Uint64, Addr, BidOffset, NullableAsk, Ask, HooksResponse, TupleOfNullable_CoinAndNullable_Bid, Coin, Bid, ArrayOfAskRenewPriceResponse, AskRenewPriceResponse, ArrayOfAsk, NullableBid, ArrayOfBid, ConfigResponse, SudoParams } from "./NameMarketplace.types"; export interface NameMarketplaceMessage { contractAddress: string; sender: string; diff --git a/ts/src/NameMarketplace.types.ts b/ts/src/NameMarketplace.types.ts index 392e9893..767e3607 100644 --- a/ts/src/NameMarketplace.types.ts +++ b/ts/src/NameMarketplace.types.ts @@ -190,7 +190,12 @@ export interface Bid { created_time: Timestamp; token_id: string; } -export type ArrayOfTupleOfStringAndCoinAndNullable_Bid = [string, Coin, Bid | null][]; +export type ArrayOfAskRenewPriceResponse = AskRenewPriceResponse[]; +export interface AskRenewPriceResponse { + bid?: Bid | null; + price: Coin; + token_id: string; +} export type ArrayOfAsk = Ask[]; export type NullableBid = Bid | null; export type ArrayOfBid = Bid[]; From f908a672567f00f69379a49cc999ffc69d0b6f9b Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 19 Feb 2024 20:53:23 -0900 Subject: [PATCH 61/91] update def --- .../marketplace/schema/name-marketplace.json | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/contracts/marketplace/schema/name-marketplace.json b/contracts/marketplace/schema/name-marketplace.json index 7c052d22..42cf07ec 100644 --- a/contracts/marketplace/schema/name-marketplace.json +++ b/contracts/marketplace/schema/name-marketplace.json @@ -1157,36 +1157,42 @@ }, "ask_renewal_prices": { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Array_of_Tuple_of_String_and_Coin_and_Nullable_Bid", + "title": "Array_of_AskRenewPriceResponse", "type": "array", "items": { - "type": "array", - "items": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Coin" - }, - { - "anyOf": [ - { - "$ref": "#/definitions/Bid" - }, - { - "type": "null" - } - ] - } - ], - "maxItems": 3, - "minItems": 3 + "$ref": "#/definitions/AskRenewPriceResponse" }, "definitions": { "Addr": { "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", "type": "string" }, + "AskRenewPriceResponse": { + "type": "object", + "required": [ + "price", + "token_id" + ], + "properties": { + "bid": { + "anyOf": [ + { + "$ref": "#/definitions/Bid" + }, + { + "type": "null" + } + ] + }, + "price": { + "$ref": "#/definitions/Coin" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + }, "Bid": { "description": "Represents a bid (offer) on the marketplace", "type": "object", From e539c262c1411f4de7af1c27210a54e8c7bbb66d Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 28 Feb 2024 18:51:50 -0900 Subject: [PATCH 62/91] restore deprecated function calls --- contracts/marketplace/src/execute.rs | 6 +-- contracts/marketplace/src/helpers.rs | 6 +-- contracts/marketplace/src/hooks.rs | 6 +-- contracts/marketplace/src/msg.rs | 14 +++--- contracts/marketplace/src/query.rs | 44 +++++++++---------- contracts/name-minter/src/contract.rs | 12 ++--- contracts/name-minter/src/helpers.rs | 8 ++-- .../name-minter/src/integration_tests.rs | 4 +- contracts/name-minter/src/query.rs | 12 ++--- contracts/sg721-name/src/contract.rs | 6 +-- contracts/sg721-name/src/helpers.rs | 10 ++--- contracts/sg721-name/src/lib.rs | 18 ++++---- contracts/sg721-name/src/unit_tests.rs | 6 +-- .../src/contract.rs | 22 ++++------ .../src/helpers.rs | 10 ++--- contracts/whitelist-updatable/src/contract.rs | 22 ++++------ contracts/whitelist-updatable/src/helpers.rs | 10 ++--- packages/sg-name/src/lib.rs | 8 ++-- 18 files changed, 106 insertions(+), 118 deletions(-) diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index 663d5453..c76e23d1 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -8,8 +8,8 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, coins, ensure, ensure_eq, to_json_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, - Env, Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, + coin, coins, ensure, ensure_eq, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, + Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721::{Cw721ExecuteMsg, OwnerOfResponse}; @@ -621,7 +621,7 @@ pub fn finalize_sale( let exec_cw721_transfer = WasmMsg::Execute { contract_addr: collection.to_string(), - msg: to_json_binary(&cw721_transfer_msg)?, + msg: to_binary(&cw721_transfer_msg)?, funds: vec![], }; res.messages.push(SubMsg::new(exec_cw721_transfer)); diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 3953542f..b1808908 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -8,7 +8,7 @@ use crate::{ }; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - coins, ensure, to_json_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, + coins, ensure, to_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, }; use cw_storage_plus::Bound; @@ -26,7 +26,7 @@ impl NameMarketplaceContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_json_binary(&msg.into())?; + let msg = to_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -44,7 +44,7 @@ impl NameMarketplaceContract { pub fn highest_bid(&self, querier: &QuerierWrapper, token_id: &str) -> StdResult> { let res: Option = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::HighestBid { + msg: to_binary(&QueryMsg::HighestBid { token_id: token_id.to_string(), })?, }))?; diff --git a/contracts/marketplace/src/hooks.rs b/contracts/marketplace/src/hooks.rs index 2a899ed4..eab632e6 100644 --- a/contracts/marketplace/src/hooks.rs +++ b/contracts/marketplace/src/hooks.rs @@ -55,7 +55,7 @@ pub fn prepare_ask_hook(deps: Deps, ask: &Ask, action: HookAction) -> StdResult< let msg = AskHookMsg { ask: ask.clone() }; let execute = WasmMsg::Execute { contract_addr: h.to_string(), - msg: msg.into_json_binary(action.clone())?, + msg: msg.into_binary(action.clone())?, funds: vec![], }; Ok(SubMsg::reply_on_error(execute, HookReply::Ask as u64)) @@ -73,7 +73,7 @@ pub fn prepare_sale_hook(deps: Deps, ask: &Ask, buyer: Addr) -> StdResult StdResult< let msg = BidHookMsg { bid: bid.clone() }; let execute = WasmMsg::Execute { contract_addr: h.to_string(), - msg: msg.into_json_binary(action.clone())?, + msg: msg.into_binary(action.clone())?, funds: vec![], }; Ok(SubMsg::reply_on_error(execute, HookReply::Bid as u64)) diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index ee43c695..30008069 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -1,6 +1,6 @@ use crate::state::{Ask, Bid, Id, SudoParams, TokenId}; use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Decimal, StdResult, Timestamp, Uint128}; +use cosmwasm_std::{to_binary, Addr, Binary, Coin, Decimal, StdResult, Timestamp, Uint128}; use sg_controllers::HooksResponse; #[cw_serde] @@ -247,9 +247,9 @@ impl SaleHookMsg { } /// serializes the message - pub fn into_json_binary(self) -> StdResult { + pub fn into_binary(self) -> StdResult { let msg = SaleExecuteMsg::SaleHook(self); - to_json_binary(&msg) + to_binary(&msg) } } @@ -277,13 +277,13 @@ impl AskHookMsg { } /// serializes the message - pub fn into_json_binary(self, action: HookAction) -> StdResult { + pub fn into_binary(self, action: HookAction) -> StdResult { let msg = match action { HookAction::Create => AskHookExecuteMsg::AskCreatedHook(self), HookAction::Update => AskHookExecuteMsg::AskUpdatedHook(self), HookAction::Delete => AskHookExecuteMsg::AskDeletedHook(self), }; - to_json_binary(&msg) + to_binary(&msg) } } @@ -306,13 +306,13 @@ impl BidHookMsg { } /// serializes the message - pub fn into_json_binary(self, action: HookAction) -> StdResult { + pub fn into_binary(self, action: HookAction) -> StdResult { let msg = match action { HookAction::Create => BidExecuteMsg::BidCreatedHook(self), HookAction::Update => BidExecuteMsg::BidUpdatedHook(self), HookAction::Delete => BidExecuteMsg::BidDeletedHook(self), }; - to_json_binary(&msg) + to_binary(&msg) } } diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index d405af29..448504a9 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -7,7 +7,7 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, to_json_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, + coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, }; use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; @@ -25,15 +25,13 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { let api = deps.api; match msg { - QueryMsg::Ask { token_id } => to_json_binary(&query_ask(deps, token_id)?), - QueryMsg::Asks { start_after, limit } => { - to_json_binary(&query_asks(deps, start_after, limit)?) - } + QueryMsg::Ask { token_id } => to_binary(&query_ask(deps, token_id)?), + QueryMsg::Asks { start_after, limit } => to_binary(&query_asks(deps, start_after, limit)?), QueryMsg::AsksBySeller { seller, start_after, limit, - } => to_json_binary(&query_asks_by_seller( + } => to_binary(&query_asks_by_seller( deps, api.addr_validate(&seller)?, start_after, @@ -43,7 +41,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { max_time, start_after, limit, - } => to_json_binary(&query_asks_by_renew_time( + } => to_binary(&query_asks_by_renew_time( deps, max_time, start_after, @@ -52,36 +50,36 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { QueryMsg::AskRenewPrice { current_time, token_id, - } => to_json_binary(&query_ask_renew_price(deps, current_time, token_id)?), - QueryMsg::AskCount {} => to_json_binary(&query_ask_count(deps)?), + } => to_binary(&query_ask_renew_price(deps, current_time, token_id)?), + QueryMsg::AskCount {} => to_binary(&query_ask_count(deps)?), QueryMsg::Bid { token_id, bidder } => { - to_json_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) + to_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) } QueryMsg::Bids { token_id, start_after, limit, - } => to_json_binary(&query_bids(deps, token_id, start_after, limit)?), + } => to_binary(&query_bids(deps, token_id, start_after, limit)?), QueryMsg::LegacyBids { start_after, limit } => { - to_json_binary(&query_legacy_bids(deps, start_after, limit)?) + to_binary(&query_legacy_bids(deps, start_after, limit)?) } QueryMsg::BidsByBidder { bidder, start_after, limit, - } => to_json_binary(&query_bids_by_bidder( + } => to_binary(&query_bids_by_bidder( deps, api.addr_validate(&bidder)?, start_after, limit, )?), QueryMsg::BidsSortedByPrice { start_after, limit } => { - to_json_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) + to_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) } QueryMsg::ReverseBidsSortedByPrice { start_before, limit, - } => to_json_binary(&reverse_query_bids_sorted_by_price( + } => to_binary(&reverse_query_bids_sorted_by_price( deps, start_before, limit, @@ -90,19 +88,19 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { seller, start_after, limit, - } => to_json_binary(&query_bids_for_seller( + } => to_binary(&query_bids_for_seller( deps, api.addr_validate(&seller)?, start_after, limit, )?), - QueryMsg::HighestBid { token_id } => to_json_binary(&query_highest_bid(deps, token_id)?), - QueryMsg::Params {} => to_json_binary(&query_params(deps)?), - QueryMsg::AskHooks {} => to_json_binary(&ASK_HOOKS.query_hooks(deps)?), - QueryMsg::BidHooks {} => to_json_binary(&BID_HOOKS.query_hooks(deps)?), - QueryMsg::SaleHooks {} => to_json_binary(&SALE_HOOKS.query_hooks(deps)?), - QueryMsg::RenewalQueue { time } => to_json_binary(&query_renewal_queue(deps, time)?), - QueryMsg::Config {} => to_json_binary(&query_config(deps)?), + QueryMsg::HighestBid { token_id } => to_binary(&query_highest_bid(deps, token_id)?), + QueryMsg::Params {} => to_binary(&query_params(deps)?), + QueryMsg::AskHooks {} => to_binary(&ASK_HOOKS.query_hooks(deps)?), + QueryMsg::BidHooks {} => to_binary(&BID_HOOKS.query_hooks(deps)?), + QueryMsg::SaleHooks {} => to_binary(&SALE_HOOKS.query_hooks(deps)?), + QueryMsg::RenewalQueue { time } => to_binary(&query_renewal_queue(deps, time)?), + QueryMsg::Config {} => to_binary(&query_config(deps)?), } } diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index d582432e..5f6c20e9 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -3,8 +3,8 @@ use std::vec; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - coin, to_json_binary, Addr, Coin, Decimal, DepsMut, Empty, Env, Event, MessageInfo, Reply, - StdError, Uint128, WasmMsg, + coin, to_binary, Addr, Coin, Decimal, DepsMut, Empty, Env, Event, MessageInfo, Reply, StdError, + Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721_base::MintMsg; @@ -104,7 +104,7 @@ pub fn instantiate( }; let wasm_msg = WasmMsg::Instantiate { code_id: msg.collection_code_id, - msg: to_json_binary(&name_collection_init_msg)?, + msg: to_binary(&name_collection_init_msg)?, funds: info.funds, admin: Some(info.sender.to_string()), label: "Name Collection".to_string(), @@ -210,7 +210,7 @@ pub fn execute_mint_and_list( }); let mint_msg_exec = WasmMsg::Execute { contract_addr: collection.to_string(), - msg: to_json_binary(&mint_msg)?, + msg: to_binary(&mint_msg)?, funds: vec![], }; @@ -220,7 +220,7 @@ pub fn execute_mint_and_list( }; let list_msg_exec = WasmMsg::Execute { contract_addr: marketplace.to_string(), - msg: to_json_binary(&ask_msg)?, + msg: to_binary(&ask_msg)?, funds: vec![], }; @@ -417,7 +417,7 @@ pub fn reply(deps: DepsMut, _env: Env, msg: Reply) -> Result>(&self, msg: T) -> StdResult { - let msg = to_json_binary(&msg.into())?; + let msg = to_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -29,7 +27,7 @@ impl NameMinterContract { pub fn params(&self, querier: &QuerierWrapper) -> StdResult { let res: SudoParams = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::Params {})?, + msg: to_binary(&QueryMsg::Params {})?, }))?; Ok(res) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 0fe30cd5..5d0b155b 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1564,7 +1564,7 @@ mod query { } mod collection { - use cosmwasm_std::{to_json_binary, StdResult}; + use cosmwasm_std::{to_binary, StdResult}; use cw721::NftInfoResponse; use cw_controllers::AdminResponse; use name_marketplace::state::Ask; @@ -1594,7 +1594,7 @@ mod collection { } fn send(app: &mut StargazeApp, from: &str, to: &str) { - let msg = to_json_binary("You now have the melting power").unwrap(); + let msg = to_binary("You now have the melting power").unwrap(); let target = to.to_string(); let send_msg = Sg721NameExecuteMsg::SendNft { contract: target, diff --git a/contracts/name-minter/src/query.rs b/contracts/name-minter/src/query.rs index 435bf25a..34510a7d 100644 --- a/contracts/name-minter/src/query.rs +++ b/contracts/name-minter/src/query.rs @@ -1,6 +1,6 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{to_json_binary, Addr, Binary, Deps, Env, StdResult}; +use cosmwasm_std::{to_binary, Addr, Binary, Deps, Env, StdResult}; use sg_name_minter::{Config, SudoParams}; use crate::{ @@ -11,11 +11,11 @@ use crate::{ #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Admin {} => to_json_binary(&ADMIN.query_admin(deps)?), - QueryMsg::Collection {} => to_json_binary(&query_collection(deps)?), - QueryMsg::Params {} => to_json_binary(&query_params(deps)?), - QueryMsg::Whitelists {} => to_json_binary(&query_whitelists(deps)?), - QueryMsg::Config {} => to_json_binary(&query_config(deps)?), + QueryMsg::Admin {} => to_binary(&ADMIN.query_admin(deps)?), + QueryMsg::Collection {} => to_binary(&query_collection(deps)?), + QueryMsg::Params {} => to_binary(&query_params(deps)?), + QueryMsg::Whitelists {} => to_binary(&query_whitelists(deps)?), + QueryMsg::Config {} => to_binary(&query_config(deps)?), } } diff --git a/contracts/sg721-name/src/contract.rs b/contracts/sg721-name/src/contract.rs index c2b177e9..83de6c08 100644 --- a/contracts/sg721-name/src/contract.rs +++ b/contracts/sg721-name/src/contract.rs @@ -4,8 +4,8 @@ use crate::{ }; use cosmwasm_std::{ - ensure, to_json_binary, Addr, Binary, ContractInfoResponse, Deps, DepsMut, Env, Event, - MessageInfo, StdError, StdResult, WasmMsg, + ensure, to_binary, Addr, Binary, ContractInfoResponse, Deps, DepsMut, Env, Event, MessageInfo, + StdError, StdResult, WasmMsg, }; use cw721_base::{state::TokenInfo, MintMsg}; @@ -195,7 +195,7 @@ fn update_ask_on_marketplace( let update_ask_msg = WasmMsg::Execute { contract_addr: NAME_MARKETPLACE.load(deps.storage)?.to_string(), funds: vec![], - msg: to_json_binary(&msg)?, + msg: to_binary(&msg)?, }; Ok(update_ask_msg) } diff --git a/contracts/sg721-name/src/helpers.rs b/contracts/sg721-name/src/helpers.rs index cdfd370b..1559bd76 100644 --- a/contracts/sg721-name/src/helpers.rs +++ b/contracts/sg721-name/src/helpers.rs @@ -1,6 +1,6 @@ use crate::msg::QueryMsg; use cosmwasm_schema::cw_serde; -use cosmwasm_std::{to_json_binary, Addr, QuerierWrapper, QueryRequest, StdResult, WasmQuery}; +use cosmwasm_std::{to_binary, Addr, QuerierWrapper, QueryRequest, StdResult, WasmQuery}; use sg_name::{TextRecord, NFT}; /// NameCollectionContract is a wrapper around Addr that provides a lot of helpers @@ -15,7 +15,7 @@ impl NameCollectionContract { pub fn name(&self, querier: &QuerierWrapper, address: &str) -> StdResult { let res: String = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::Name { + msg: to_binary(&QueryMsg::Name { address: address.to_string(), })?, }))?; @@ -26,7 +26,7 @@ impl NameCollectionContract { pub fn image_nft(&self, querier: &QuerierWrapper, name: &str) -> StdResult> { let res: Option = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::ImageNFT { + msg: to_binary(&QueryMsg::ImageNFT { name: name.to_string(), })?, }))?; @@ -37,7 +37,7 @@ impl NameCollectionContract { pub fn text_records(&self, querier: &QuerierWrapper, name: &str) -> StdResult> { let res: Vec = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::TextRecords { + msg: to_binary(&QueryMsg::TextRecords { name: name.to_string(), })?, }))?; @@ -48,7 +48,7 @@ impl NameCollectionContract { pub fn is_twitter_verified(&self, querier: &QuerierWrapper, name: &str) -> StdResult { let res: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::IsTwitterVerified { + msg: to_binary(&QueryMsg::IsTwitterVerified { name: name.to_string(), })?, }))?; diff --git a/contracts/sg721-name/src/lib.rs b/contracts/sg721-name/src/lib.rs index ac52d955..50d29846 100644 --- a/contracts/sg721-name/src/lib.rs +++ b/contracts/sg721-name/src/lib.rs @@ -43,7 +43,7 @@ pub mod entry { query_associated_address, query_name, query_name_marketplace, query_params, }; use cosmwasm_std::{ - to_json_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, StdError, StdResult, + to_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, StdError, StdResult, }; use cw2::set_contract_version; use cw_utils::maybe_addr; @@ -134,17 +134,17 @@ pub mod entry { #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Params {} => to_json_binary(&query_params(deps)?), - QueryMsg::NameMarketplace {} => to_json_binary(&query_name_marketplace(deps)?), - QueryMsg::Name { address } => to_json_binary(&query_name(deps, address)?), - QueryMsg::Verifier {} => to_json_binary(&VERIFIER.query_admin(deps)?), + QueryMsg::Params {} => to_binary(&query_params(deps)?), + QueryMsg::NameMarketplace {} => to_binary(&query_name_marketplace(deps)?), + QueryMsg::Name { address } => to_binary(&query_name(deps, address)?), + QueryMsg::Verifier {} => to_binary(&VERIFIER.query_admin(deps)?), QueryMsg::AssociatedAddress { name } => { - to_json_binary(&query_associated_address(deps, &name)?) + to_binary(&query_associated_address(deps, &name)?) } - QueryMsg::ImageNFT { name } => to_json_binary(&query_image_nft(deps, &name)?), - QueryMsg::TextRecords { name } => to_json_binary(&query_text_records(deps, &name)?), + QueryMsg::ImageNFT { name } => to_binary(&query_image_nft(deps, &name)?), + QueryMsg::TextRecords { name } => to_binary(&query_text_records(deps, &name)?), QueryMsg::IsTwitterVerified { name } => { - to_json_binary(&query_is_twitter_verified(deps, &name)?) + to_binary(&query_is_twitter_verified(deps, &name)?) } _ => Sg721NameContract::default().query(deps, env, msg.into()), } diff --git a/contracts/sg721-name/src/unit_tests.rs b/contracts/sg721-name/src/unit_tests.rs index 86e03b68..71910aff 100644 --- a/contracts/sg721-name/src/unit_tests.rs +++ b/contracts/sg721-name/src/unit_tests.rs @@ -1,7 +1,7 @@ use cosmwasm_std::testing::{mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{ - from_json, to_json_binary, Addr, ContractInfoResponse, ContractResult, Empty, OwnedDeps, - Querier, QuerierResult, QueryRequest, StdError, SystemError, SystemResult, WasmQuery, + from_json, to_binary, Addr, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, + QuerierResult, QueryRequest, StdError, SystemError, SystemResult, WasmQuery, }; use cw721::Cw721Query; use cw721_base::MintMsg; @@ -55,7 +55,7 @@ impl CustomMockQuerier { let mut response = ContractInfoResponse::default(); response.code_id = 1; response.creator = CREATOR.to_string(); - SystemResult::Ok(ContractResult::Ok(to_json_binary(&response).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) } _ => self.base.handle_query(request), } diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index 0e482eb8..9a4751b3 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -2,7 +2,7 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - ensure, to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + ensure, to_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, }; use cw2::set_contract_version; @@ -275,18 +275,14 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result StdResult { match msg { - QueryMsg::Config {} => to_json_binary(&query_config(deps)?), - QueryMsg::IncludesAddress { address } => { - to_json_binary(&query_includes_address(deps, address)?) - } - QueryMsg::MintCount { address } => to_json_binary(&query_mint_count(deps, address)?), - QueryMsg::Admins {} => to_json_binary(&query_admins(deps)?), - QueryMsg::AddressCount {} => to_json_binary(&query_address_count(deps)?), - QueryMsg::PerAddressLimit {} => to_json_binary(&query_per_address_limit(deps)?), - QueryMsg::IsProcessable { address } => { - to_json_binary(&query_is_processable(deps, address)?) - } - QueryMsg::MintDiscountAmount {} => to_json_binary(&query_mint_discount_amount(deps)?), + QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::IncludesAddress { address } => to_binary(&query_includes_address(deps, address)?), + QueryMsg::MintCount { address } => to_binary(&query_mint_count(deps, address)?), + QueryMsg::Admins {} => to_binary(&query_admins(deps)?), + QueryMsg::AddressCount {} => to_binary(&query_address_count(deps)?), + QueryMsg::PerAddressLimit {} => to_binary(&query_per_address_limit(deps)?), + QueryMsg::IsProcessable { address } => to_binary(&query_is_processable(deps, address)?), + QueryMsg::MintDiscountAmount {} => to_binary(&query_mint_discount_amount(deps)?), } } diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs index 732e409c..b1b525ca 100644 --- a/contracts/whitelist-updatable-flatrate/src/helpers.rs +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_json_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, + to_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, }; use sg_std::CosmosMsg; @@ -19,7 +19,7 @@ impl WhitelistUpdatableFlatrateContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_json_binary(&msg.into())?; + let msg = to_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -37,7 +37,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn includes(&self, querier: &QuerierWrapper, address: String) -> StdResult { let includes: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::IncludesAddress { address })?, + msg: to_binary(&QueryMsg::IncludesAddress { address })?, }))?; Ok(includes) } @@ -45,7 +45,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn config(&self, querier: &QuerierWrapper) -> StdResult { let res: Config = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::Config {})?, + msg: to_binary(&QueryMsg::Config {})?, }))?; Ok(res) @@ -54,7 +54,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn mint_discount_amount(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::MintDiscountAmount {})?, + msg: to_binary(&QueryMsg::MintDiscountAmount {})?, })) } } diff --git a/contracts/whitelist-updatable/src/contract.rs b/contracts/whitelist-updatable/src/contract.rs index ca0e157f..44de4067 100644 --- a/contracts/whitelist-updatable/src/contract.rs +++ b/contracts/whitelist-updatable/src/contract.rs @@ -2,7 +2,7 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_json_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, }; use cw2::set_contract_version; @@ -247,18 +247,14 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result StdResult { match msg { - QueryMsg::Config {} => to_json_binary(&query_config(deps)?), - QueryMsg::IncludesAddress { address } => { - to_json_binary(&query_includes_address(deps, address)?) - } - QueryMsg::MintCount { address } => to_json_binary(&query_mint_count(deps, address)?), - QueryMsg::Admin {} => to_json_binary(&query_admin(deps)?), - QueryMsg::AddressCount {} => to_json_binary(&query_address_count(deps)?), - QueryMsg::PerAddressLimit {} => to_json_binary(&query_per_address_limit(deps)?), - QueryMsg::IsProcessable { address } => { - to_json_binary(&query_is_processable(deps, address)?) - } - QueryMsg::MintDiscountPercent {} => to_json_binary(&query_mint_discount_percent(deps)?), + QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::IncludesAddress { address } => to_binary(&query_includes_address(deps, address)?), + QueryMsg::MintCount { address } => to_binary(&query_mint_count(deps, address)?), + QueryMsg::Admin {} => to_binary(&query_admin(deps)?), + QueryMsg::AddressCount {} => to_binary(&query_address_count(deps)?), + QueryMsg::PerAddressLimit {} => to_binary(&query_per_address_limit(deps)?), + QueryMsg::IsProcessable { address } => to_binary(&query_is_processable(deps, address)?), + QueryMsg::MintDiscountPercent {} => to_binary(&query_mint_discount_percent(deps)?), } } diff --git a/contracts/whitelist-updatable/src/helpers.rs b/contracts/whitelist-updatable/src/helpers.rs index 9df785c0..459b9ea5 100644 --- a/contracts/whitelist-updatable/src/helpers.rs +++ b/contracts/whitelist-updatable/src/helpers.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_json_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, + to_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, }; use sg_std::CosmosMsg; @@ -19,7 +19,7 @@ impl WhitelistUpdatableContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_json_binary(&msg.into())?; + let msg = to_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -37,7 +37,7 @@ impl WhitelistUpdatableContract { pub fn includes(&self, querier: &QuerierWrapper, address: String) -> StdResult { let includes: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::IncludesAddress { address })?, + msg: to_binary(&QueryMsg::IncludesAddress { address })?, }))?; Ok(includes) } @@ -45,7 +45,7 @@ impl WhitelistUpdatableContract { pub fn config(&self, querier: &QuerierWrapper) -> StdResult { let res: Config = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::Config {})?, + msg: to_binary(&QueryMsg::Config {})?, }))?; Ok(res) @@ -54,7 +54,7 @@ impl WhitelistUpdatableContract { pub fn mint_discount_percent(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_json_binary(&QueryMsg::MintDiscountPercent {})?, + msg: to_binary(&QueryMsg::MintDiscountPercent {})?, })) } } diff --git a/packages/sg-name/src/lib.rs b/packages/sg-name/src/lib.rs index dee4d3eb..3276b7f2 100644 --- a/packages/sg-name/src/lib.rs +++ b/packages/sg-name/src/lib.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_json_vec, Addr}; +use cosmwasm_std::{to_vec, Addr}; pub const MAX_TEXT_LENGTH: u32 = 512; @@ -13,7 +13,7 @@ pub struct NFT { impl NFT { pub fn into_json_string(self: &NFT) -> String { - String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() } } @@ -34,7 +34,7 @@ impl TextRecord { } pub fn into_json_string(self: &TextRecord) -> String { - String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() } } @@ -53,7 +53,7 @@ impl Metadata { // and represent it as a type. Note that we have to use the CosmWasm fork // of serde_json to avoid floats. pub fn into_json_string(self: &Metadata) -> String { - String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() } } From f133ad794497c9d597c38b01ac5fa6e1090959bf Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 28 Feb 2024 18:55:59 -0900 Subject: [PATCH 63/91] restore deprecated func call --- contracts/sg721-name/src/unit_tests.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/sg721-name/src/unit_tests.rs b/contracts/sg721-name/src/unit_tests.rs index 71910aff..1ab7ac73 100644 --- a/contracts/sg721-name/src/unit_tests.rs +++ b/contracts/sg721-name/src/unit_tests.rs @@ -1,6 +1,6 @@ use cosmwasm_std::testing::{mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{ - from_json, to_binary, Addr, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, + from_slice, to_binary, Addr, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, StdError, SystemError, SystemResult, WasmQuery, }; use cw721::Cw721Query; @@ -34,7 +34,7 @@ pub struct CustomMockQuerier { impl Querier for CustomMockQuerier { fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { - let request: QueryRequest = match from_json(bin_request) { + let request: QueryRequest = match from_slice(bin_request) { Ok(v) => v, Err(e) => { return SystemResult::Err(SystemError::InvalidRequest { @@ -108,7 +108,7 @@ fn mint_and_update() { // retrieve max record count let params: SudoParams = - from_json(query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); + from_slice(query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); let max_record_count = params.max_record_count; // mint token @@ -144,7 +144,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_image_msg).unwrap(); let nft_value = res.events[0].attributes[2].value.clone().into_bytes(); - let nft: NFT = from_json(nft_value).unwrap(); + let nft: NFT = from_slice(nft_value).unwrap(); assert_eq!(nft, new_nft); // add text record @@ -159,7 +159,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_record_msg).unwrap(); let record_value = res.events[0].attributes[2].value.clone().into_bytes(); - let record: TextRecord = from_json(record_value).unwrap(); + let record: TextRecord = from_slice(record_value).unwrap(); assert_eq!(record, new_record); let records = query_text_records(deps.as_ref(), token_id).unwrap(); From 86820aae5b6093c0830b41726bb26571525089b6 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 28 Feb 2024 19:00:35 -0900 Subject: [PATCH 64/91] fix test for dep fun --- contracts/sg721-name/src/unit_tests.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/sg721-name/src/unit_tests.rs b/contracts/sg721-name/src/unit_tests.rs index 1ab7ac73..c1cc8fd3 100644 --- a/contracts/sg721-name/src/unit_tests.rs +++ b/contracts/sg721-name/src/unit_tests.rs @@ -108,7 +108,7 @@ fn mint_and_update() { // retrieve max record count let params: SudoParams = - from_slice(query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); + from_slice(&query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); let max_record_count = params.max_record_count; // mint token @@ -144,7 +144,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_image_msg).unwrap(); let nft_value = res.events[0].attributes[2].value.clone().into_bytes(); - let nft: NFT = from_slice(nft_value).unwrap(); + let nft: NFT = from_slice(&nft_value).unwrap(); assert_eq!(nft, new_nft); // add text record @@ -159,7 +159,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_record_msg).unwrap(); let record_value = res.events[0].attributes[2].value.clone().into_bytes(); - let record: TextRecord = from_slice(record_value).unwrap(); + let record: TextRecord = from_slice(&record_value).unwrap(); assert_eq!(record, new_record); let records = query_text_records(deps.as_ref(), token_id).unwrap(); From 91525829aff893292a7236857b4e2a7deee4fd24 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 28 Feb 2024 19:18:32 -0900 Subject: [PATCH 65/91] try regenerating the lock --- Cargo.lock | 102 ++++++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fdaee34..e73fc80d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", @@ -15,9 +15,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "base16ct" @@ -69,9 +69,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9008b6bb9fc80b5277f2fe481c09e828743d9151203e804583eb4c9e15b31d" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "byteorder" @@ -99,32 +99,32 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cosmwasm-crypto" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6aa9f904de106fa16443ad14ec2abe75e94ba003bb61c681c0e43d4c58d2a" +checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" dependencies = [ "digest 0.10.7", "ecdsa 0.16.9", "ed25519-zebra", - "k256 0.13.3", + "k256 0.13.1", "rand_core 0.6.4", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40abec852f3d4abec6d44ead9a58b78325021a1ead1e7229c3471414e57b2e49" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b166215fbfe93dc5575bae062aa57ae7bb41121cffe53bac33b033257949d2a9" +checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -135,9 +135,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf12f8e20bb29d1db66b7ca590bc2f670b548d21e9be92499bc0f9022a994a8" +checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" dependencies = [ "proc-macro2", "quote", @@ -146,9 +146,9 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad011ae7447188e26e4a7dbca2fcd0fc186aa21ae5c86df0503ea44c78f9e469" +checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" dependencies = [ "base64", "bech32", @@ -429,9 +429,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "ecdsa" @@ -476,9 +476,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "elliptic-curve" @@ -661,9 +661,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa 0.16.9", @@ -675,9 +675,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "name-marketplace" @@ -778,9 +778,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -855,9 +855,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "schemars" @@ -913,37 +913,37 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -959,9 +959,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -1235,9 +1235,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -1246,22 +1246,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -1287,9 +1287,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -1299,9 +1299,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] From c12db1c94b0e4c1fe3b3569be0759bbc696de8a9 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 28 Feb 2024 19:22:17 -0900 Subject: [PATCH 66/91] force restore lock from base branch --- Cargo.lock | 1444 +++------------------------------------------------- 1 file changed, 60 insertions(+), 1384 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e73fc80d..bb68681b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,1384 +1,60 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "anyhow" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bnum" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cosmwasm-crypto" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" -dependencies = [ - "digest 0.10.7", - "ecdsa 0.16.9", - "ed25519-zebra", - "k256 0.13.1", - "rand_core 0.6.4", - "thiserror", -] - -[[package]] -name = "cosmwasm-derive" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" -dependencies = [ - "syn 1.0.109", -] - -[[package]] -name = "cosmwasm-schema" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" -dependencies = [ - "cosmwasm-schema-derive", - "schemars", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cosmwasm-schema-derive" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "cosmwasm-std" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" -dependencies = [ - "base64", - "bech32", - "bnum", - "cosmwasm-crypto", - "cosmwasm-derive", - "derivative", - "forward_ref", - "hex", - "schemars", - "serde", - "serde-json-wasm", - "sha2 0.10.8", - "static_assertions", - "thiserror", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "cw-controllers" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24bd6738c3fd59c87d2f84911c1cad1e4f2d1c58ecaa6e52549b4f78f4ed6f07" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "cw-multi-test" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127c7bb95853b8e828bdab97065c81cb5ddc20f7339180b61b2300565aaa99d1" -dependencies = [ - "anyhow", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "derivative", - "itertools", - "k256 0.11.6", - "prost", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "cw-storage-macro" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7a3de01064d249a0e7028b63f8168470dac4bcd0c5dc3710d17486f843d1a8" -dependencies = [ - "syn 1.0.109", -] - -[[package]] -name = "cw-storage-plus" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b6f91c0b94481a3e9ef1ceb183c37d00764f8751e39b45fc09f4d9b970d469" -dependencies = [ - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "cw-storage-plus" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" -dependencies = [ - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "cw-utils" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a84c6c1c0acc3616398eba50783934bd6c964bad6974241eaee3460c8f5b26" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2 0.16.0", - "schemars", - "semver", - "serde", - "thiserror", -] - -[[package]] -name = "cw-utils" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2 1.1.2", - "schemars", - "semver", - "serde", - "thiserror", -] - -[[package]] -name = "cw2" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.16.0", - "schemars", - "serde", -] - -[[package]] -name = "cw2" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "schemars", - "semver", - "serde", - "thiserror", -] - -[[package]] -name = "cw721" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a1ea6e6277bdd6dfc043a9b1380697fe29d6e24b072597439523658d21d791" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils 0.16.0", - "schemars", - "serde", -] - -[[package]] -name = "cw721-base" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77518e27431d43214cff4cdfbd788a7508f68d9b1f32389e6fce513e7eaccbef" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "cw721", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der 0.7.8", - "digest 0.10.7", - "elliptic-curve 0.13.8", - "rfc6979 0.4.0", - "signature 2.2.0", - "spki 0.7.3", -] - -[[package]] -name = "ed25519-zebra" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" -dependencies = [ - "curve25519-dalek", - "hashbrown", - "hex", - "rand_core 0.6.4", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "either" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff 0.13.0", - "generic-array", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "subtle", - "zeroize", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "forward_ref" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.8", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "once_cell", - "sha2 0.10.8", - "signature 2.2.0", -] - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "name-marketplace" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-multi-test", - "cw-storage-macro", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "cw721", - "cw721-base", - "schemars", - "semver", - "serde", - "sg-controllers", - "sg-multi-test", - "sg-name", - "sg-name-common", - "sg-name-minter", - "sg-std", - "sg1", - "sg721", - "thiserror", -] - -[[package]] -name = "name-minter" -version = "2.1.0" -dependencies = [ - "anyhow", - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-multi-test", - "cw-storage-macro", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "cw721", - "cw721-base", - "name-marketplace", - "schemars", - "semver", - "serde", - "sg-multi-test", - "sg-name", - "sg-name-common", - "sg-name-minter", - "sg-std", - "sg721", - "sg721-base", - "sg721-name", - "thiserror", - "whitelist-updatable", - "whitelist-updatable-flatrate", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.8", - "spki 0.7.3", -] - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prost" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "schemars" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 1.0.109", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.8", - "generic-array", - "pkcs8 0.10.2", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-json-wasm" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "serde_derive_internals" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_json" -version = "1.0.114" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sg-controllers" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "073a918d575f4513901c19a311a5fbaf3a7806594500fb7a3b77690720d3fc9e" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "schemars", - "serde", - "sg-std", - "thiserror", -] - -[[package]] -name = "sg-multi-test" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7704c3607bcac9db6c2fc7810d4647268f29c7ea4368648846cbe6bef2bec2be" -dependencies = [ - "anyhow", - "cosmwasm-std", - "cw-multi-test", - "schemars", - "serde", - "sg-std", -] - -[[package]] -name = "sg-name" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "sg-name-common" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "schemars", - "serde", - "sg-std", - "sg1", -] - -[[package]] -name = "sg-name-market" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "sg-name-minter" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "schemars", - "serde", -] - -[[package]] -name = "sg-std" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd076abea035a2da34a770eb7a239a4fbffa59d3a193ab91e07fb81583937c5c" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils 0.16.0", - "cw721", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "sg-whitelist-basic" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "sg1" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8405692379911d16534d515f6848a52b85920f401de6414a57ef7a108bd5d67b" -dependencies = [ - "cosmwasm-std", - "cw-utils 0.16.0", - "serde", - "sg-std", - "thiserror", -] - -[[package]] -name = "sg721" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a8c0cb5748e59d506cb7cf375d1f03769f1e3586a1542be8a199730721c6102" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils 0.16.0", - "cw721-base", - "serde", - "thiserror", -] - -[[package]] -name = "sg721-base" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c3ba2af031105758e21f94e8a1488bf810b33914b7e49d7ef5efcf1936cf96" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "cw721", - "cw721-base", - "serde", - "sg-std", - "sg721", - "thiserror", - "url", -] - -[[package]] -name = "sg721-name" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "cw721", - "cw721-base", - "schemars", - "semver", - "serde", - "sg-name", - "sg-name-market", - "sg-std", - "sg721", - "sg721-base", - "subtle-encoding", - "thiserror", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.8", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "whitelist-updatable" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-multi-test", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "name-minter", - "schemars", - "semver", - "serde", - "sg-multi-test", - "sg-name", - "sg-name-minter", - "sg-std", - "sg-whitelist-basic", - "sg721-name", - "thiserror", -] - -[[package]] -name = "whitelist-updatable-flatrate" -version = "2.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-multi-test", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "name-minter", - "schemars", - "semver", - "serde", - "sg-multi-test", - "sg-name", - "sg-name-minter", - "sg-std", - "sg-whitelist-basic", - "sg721-name", - "thiserror", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +[workspace] +members = ["packages/*", "contracts/*"] +resolver = "2" + +[workspace.package] +version = "2.1.0" +edition = "2021" +homepage = "https://stargaze.zone" +repository = "https://github.com/public-awesome/names" +license = "Apache-2.0" + +[workspace.dependencies] +cosmwasm-schema = "1.2.1" +cosmwasm-std = "1.2.1" +cw2 = "0.16.0" +cw721 = "0.16.0" +cw721-base = "0.16.0" +cw-controllers = "0.16.0" +cw-multi-test = "0.16.0" +cw-storage-macro = "0.16.0" +cw-storage-plus = "0.16.0" +cw-utils = "0.16.0" +schemars = "0.8.11" +semver = "1" +serde = { version = "1.0.145", default-features = false, features = ["derive"] } +sg1 = "0.22.9" +sg721 = "0.22.9" +sg721-base = "0.22.9" +sg-controllers = "0.22.9" +sg-metadata = "0.22.9" +sg-multi-test = "0.22.9" +sg-std = "0.22.9" +thiserror = "1.0.31" +sg-name-common = { path = "./packages/sg-name-common" } +sg-name = { path = "./packages/sg-name" } +sg-name-market = { path = "./packages/sg-name-market" } +sg-name-minter = { path = "./packages/sg-name-minter" } +name-marketplace = { path = "./contracts/marketplace", features = ["library"] } +name-minter = { path = "./contracts/name-minter", features = ["library"] } +sg721-name = { path = "./contracts/sg721-name", features = ["library"] } + +[profile.release.package.name-minter] +codegen-units = 1 +incremental = false + +[profile.release.package.sg721-name] +codegen-units = 1 +incremental = false + +[profile.release.package.name-marketplace] +codegen-units = 1 +incremental = false + +[profile.release] +rpath = false +lto = true +overflow-checks = true +opt-level = 3 +debug = false +debug-assertions = false From 33fec3cd6714ec279e6f7ff7b31b691385ac04ee Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 28 Feb 2024 19:25:02 -0900 Subject: [PATCH 67/91] regenerate lock --- Cargo.lock | 1444 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 1384 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bb68681b..e73fc80d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,60 +1,1384 @@ -[workspace] -members = ["packages/*", "contracts/*"] -resolver = "2" - -[workspace.package] -version = "2.1.0" -edition = "2021" -homepage = "https://stargaze.zone" -repository = "https://github.com/public-awesome/names" -license = "Apache-2.0" - -[workspace.dependencies] -cosmwasm-schema = "1.2.1" -cosmwasm-std = "1.2.1" -cw2 = "0.16.0" -cw721 = "0.16.0" -cw721-base = "0.16.0" -cw-controllers = "0.16.0" -cw-multi-test = "0.16.0" -cw-storage-macro = "0.16.0" -cw-storage-plus = "0.16.0" -cw-utils = "0.16.0" -schemars = "0.8.11" -semver = "1" -serde = { version = "1.0.145", default-features = false, features = ["derive"] } -sg1 = "0.22.9" -sg721 = "0.22.9" -sg721-base = "0.22.9" -sg-controllers = "0.22.9" -sg-metadata = "0.22.9" -sg-multi-test = "0.22.9" -sg-std = "0.22.9" -thiserror = "1.0.31" -sg-name-common = { path = "./packages/sg-name-common" } -sg-name = { path = "./packages/sg-name" } -sg-name-market = { path = "./packages/sg-name-market" } -sg-name-minter = { path = "./packages/sg-name-minter" } -name-marketplace = { path = "./contracts/marketplace", features = ["library"] } -name-minter = { path = "./contracts/name-minter", features = ["library"] } -sg721-name = { path = "./contracts/sg721-name", features = ["library"] } - -[profile.release.package.name-minter] -codegen-units = 1 -incremental = false - -[profile.release.package.sg721-name] -codegen-units = 1 -incremental = false - -[profile.release.package.name-marketplace] -codegen-units = 1 -incremental = false - -[profile.release] -rpath = false -lto = true -overflow-checks = true -opt-level = 3 -debug = false -debug-assertions = false +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "anyhow" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cosmwasm-crypto" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" +dependencies = [ + "digest 0.10.7", + "ecdsa 0.16.9", + "ed25519-zebra", + "k256 0.13.1", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" +dependencies = [ + "base64", + "bech32", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.8", + "static_assertions", + "thiserror", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "cw-controllers" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24bd6738c3fd59c87d2f84911c1cad1e4f2d1c58ecaa6e52549b4f78f4ed6f07" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-multi-test" +version = "0.16.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "127c7bb95853b8e828bdab97065c81cb5ddc20f7339180b61b2300565aaa99d1" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "derivative", + "itertools", + "k256 0.11.6", + "prost", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-storage-macro" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a3de01064d249a0e7028b63f8168470dac4bcd0c5dc3710d17486f843d1a8" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cw-storage-plus" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b6f91c0b94481a3e9ef1ceb183c37d00764f8751e39b45fc09f4d9b970d469" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-storage-plus" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-utils" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a84c6c1c0acc3616398eba50783934bd6c964bad6974241eaee3460c8f5b26" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 0.16.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw2" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw721" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a1ea6e6277bdd6dfc043a9b1380697fe29d6e24b072597439523658d21d791" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw721-base" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77518e27431d43214cff4cdfbd788a7508f68d9b1f32389e6fce513e7eaccbef" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.8", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.5", + "digest 0.10.7", + "ff 0.13.0", + "generic-array", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", + "sha2 0.10.8", + "signature 2.2.0", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "name-marketplace" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-multi-test", + "cw-storage-macro", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721", + "cw721-base", + "schemars", + "semver", + "serde", + "sg-controllers", + "sg-multi-test", + "sg-name", + "sg-name-common", + "sg-name-minter", + "sg-std", + "sg1", + "sg721", + "thiserror", +] + +[[package]] +name = "name-minter" +version = "2.1.0" +dependencies = [ + "anyhow", + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers", + "cw-multi-test", + "cw-storage-macro", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721", + "cw721-base", + "name-marketplace", + "schemars", + "semver", + "serde", + "sg-multi-test", + "sg-name", + "sg-name-common", + "sg-name-minter", + "sg-std", + "sg721", + "sg721-base", + "sg721-name", + "thiserror", + "whitelist-updatable", + "whitelist-updatable-flatrate", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.8", + "spki 0.7.3", +] + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "schemars" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.8", + "generic-array", + "pkcs8 0.10.2", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sg-controllers" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "073a918d575f4513901c19a311a5fbaf3a7806594500fb7a3b77690720d3fc9e" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "schemars", + "serde", + "sg-std", + "thiserror", +] + +[[package]] +name = "sg-multi-test" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7704c3607bcac9db6c2fc7810d4647268f29c7ea4368648846cbe6bef2bec2be" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-multi-test", + "schemars", + "serde", + "sg-std", +] + +[[package]] +name = "sg-name" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "sg-name-common" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", + "sg-std", + "sg1", +] + +[[package]] +name = "sg-name-market" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "sg-name-minter" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers", + "schemars", + "serde", +] + +[[package]] +name = "sg-std" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd076abea035a2da34a770eb7a239a4fbffa59d3a193ab91e07fb81583937c5c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.16.0", + "cw721", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "sg-whitelist-basic" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "sg1" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8405692379911d16534d515f6848a52b85920f401de6414a57ef7a108bd5d67b" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.16.0", + "serde", + "sg-std", + "thiserror", +] + +[[package]] +name = "sg721" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a8c0cb5748e59d506cb7cf375d1f03769f1e3586a1542be8a199730721c6102" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.16.0", + "cw721-base", + "serde", + "thiserror", +] + +[[package]] +name = "sg721-base" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6c3ba2af031105758e21f94e8a1488bf810b33914b7e49d7ef5efcf1936cf96" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721", + "cw721-base", + "serde", + "sg-std", + "sg721", + "thiserror", + "url", +] + +[[package]] +name = "sg721-name" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721", + "cw721-base", + "schemars", + "semver", + "serde", + "sg-name", + "sg-name-market", + "sg-std", + "sg721", + "sg721-base", + "subtle-encoding", + "thiserror", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.8", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "whitelist-updatable" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers", + "cw-multi-test", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "name-minter", + "schemars", + "semver", + "serde", + "sg-multi-test", + "sg-name", + "sg-name-minter", + "sg-std", + "sg-whitelist-basic", + "sg721-name", + "thiserror", +] + +[[package]] +name = "whitelist-updatable-flatrate" +version = "2.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers", + "cw-multi-test", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "name-minter", + "schemars", + "semver", + "serde", + "sg-multi-test", + "sg-name", + "sg-name-minter", + "sg-std", + "sg-whitelist-basic", + "sg721-name", + "thiserror", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" From a37523e3a509f44b30192f8c10027546580b4e43 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 25 Mar 2024 13:07:39 -0800 Subject: [PATCH 68/91] support both whitelist discounts --- contracts/name-minter/src/contract.rs | 81 ++++++++++++++++++++++----- contracts/name-minter/src/error.rs | 3 + 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 5f6c20e9..4e6503eb 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -196,7 +196,18 @@ pub fn execute_mint_and_list( .transpose()? .unwrap_or(None); - let price = validate_payment(name.len(), &info, params.base_price.u128(), discount)?; + let whitelist_type = list.map(|whitelist| match whitelist { + WhitelistContract::Updatable(_) => Some(WhitelistType::Updatable), + WhitelistContract::Flatrate(_) => Some(WhitelistType::Flatrate), + }); + + let price = validate_payment( + name.len(), + &info, + params.base_price.u128(), + discount, + whitelist_type.unwrap(), + )?; charge_fees(&mut res, params.fair_burn_percent, price.amount); let collection = NAME_COLLECTION.load(deps.storage)?; @@ -369,9 +380,10 @@ fn validate_payment( info: &MessageInfo, base_price: u128, discount: Option, + whitelist_type: Option, ) -> Result { // Because we know we are left with ASCII chars, a simple byte count is enough - let amount: Uint128 = (match name_len { + let mut amount: Uint128 = (match name_len { 0..=2 => { return Err(ContractError::NameTooShort {}); } @@ -381,9 +393,23 @@ fn validate_payment( }) .into(); - let amount = discount - .map(|d| amount * (Decimal::one() - d)) - .unwrap_or(amount); + amount = match whitelist_type { + Some(WhitelistType::Updatable) => discount + .map(|d| amount * (Decimal::one() - d)) + .unwrap_or(amount), + Some(WhitelistType::Flatrate) => { + // we assume that discount is a flat amount and + // not a percentage and is a whole number + discount + .map(|d| amount - (d * Uint128::from(1u128))) + .unwrap_or(amount) + } + None => return Err(ContractError::InvalidWhitelistType {}), + }; + + // let amount = discount + // .map(|d| amount * (Decimal::one() - d)) + // .unwrap_or(amount); let payment = must_pay(info, NATIVE_DENOM)?; if payment != amount { @@ -463,7 +489,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result Date: Mon, 25 Mar 2024 17:22:09 -0800 Subject: [PATCH 69/91] fix tests; handle no-whitelist cases --- contracts/name-minter/src/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 4e6503eb..029116d6 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -206,7 +206,7 @@ pub fn execute_mint_and_list( &info, params.base_price.u128(), discount, - whitelist_type.unwrap(), + whitelist_type.unwrap_or(None), )?; charge_fees(&mut res, params.fair_burn_percent, price.amount); @@ -404,7 +404,7 @@ fn validate_payment( .map(|d| amount - (d * Uint128::from(1u128))) .unwrap_or(amount) } - None => return Err(ContractError::InvalidWhitelistType {}), + None => amount, }; // let amount = discount From 44a5172bcbca7b6a0c9a9a158b30cf87b05356ad Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Tue, 26 Mar 2024 15:14:30 +0300 Subject: [PATCH 70/91] Convert minter to accept flat rate discounts only --- contracts/name-minter/src/contract.rs | 188 +++++------------- .../name-minter/src/integration_tests.rs | 76 +++---- contracts/name-minter/src/msg.rs | 12 +- contracts/name-minter/src/query.rs | 10 +- contracts/name-minter/src/state.rs | 8 +- .../src/helpers.rs | 2 +- .../whitelist-updatable-flatrate/src/msg.rs | 2 +- 7 files changed, 102 insertions(+), 196 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 029116d6..de228354 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -21,14 +21,12 @@ use sg_name::{Metadata, SgNameExecuteMsg}; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_name_minter::{Config, SudoParams, PUBLIC_MINT_START_TIME_IN_SECONDS}; use sg_std::{Response, SubMsg, NATIVE_DENOM}; -use whitelist_updatable::helpers::WhitelistUpdatableContract; use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; use crate::error::ContractError; use crate::msg::{ExecuteMsg, InstantiateMsg}; use crate::state::{ - WhitelistContract, ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, PAUSED, SUDO_PARAMS, - WHITELISTS, + ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, PAUSED, SUDO_PARAMS, WHITELISTS, }; // version info for migration info @@ -56,8 +54,7 @@ pub fn instantiate( .whitelists .iter() .filter_map(|addr| api.addr_validate(addr).ok()) - .map(WhitelistUpdatableContract) - .map(WhitelistContract::Updatable) + .map(WhitelistUpdatableFlatrateContract) .collect::>(); WHITELISTS.save(deps.storage, &lists)?; @@ -132,14 +129,8 @@ pub fn execute( Ok(ADMIN.execute_update_admin(deps, info, maybe_addr(api, admin)?)?) } ExecuteMsg::Pause { pause } => execute_pause(deps, info, pause), - ExecuteMsg::AddWhitelist { - address, - whitelist_type, - } => execute_add_whitelist(deps, info, address, whitelist_type), - ExecuteMsg::RemoveWhitelist { - address, - whitelist_type, - } => execute_remove_whitelist(deps, info, address, whitelist_type), + ExecuteMsg::AddWhitelist { address } => execute_add_whitelist(deps, info, address), + ExecuteMsg::RemoveWhitelist { address } => execute_remove_whitelist(deps, info, address), ExecuteMsg::UpdateConfig { config } => execute_update_config(deps, info, env, config), } } @@ -166,13 +157,10 @@ pub fn execute_mint_and_list( // Assumes no duplicate addresses between whitelists // Otherwise there will be edge cases with per addr limit between the whitelists - let list = whitelists.iter().find(|whitelist| match whitelist { - WhitelistContract::Updatable(updatable) => updatable + let list = whitelists.iter().find(|whitelist| { + whitelist .includes(&deps.querier, sender.to_string()) - .unwrap_or(false), - WhitelistContract::Flatrate(flatrate) => flatrate - .includes(&deps.querier, sender.to_string()) - .unwrap_or(false), + .unwrap_or(false) }); // if not on any whitelist, check public mint start time @@ -181,34 +169,24 @@ pub fn execute_mint_and_list( } let discount = list - .map(|whitelist| match whitelist { - WhitelistContract::Updatable(updatable) => { - res.messages - .push(SubMsg::new(updatable.process_address(sender)?)); - updatable.mint_discount_percent(&deps.querier) - } - WhitelistContract::Flatrate(flatrate) => { - res.messages - .push(SubMsg::new(flatrate.process_address(sender)?)); - flatrate.mint_discount_amount(&deps.querier) - } + .map(|list| { + res.messages + .push(SubMsg::new(list.process_address(sender)?)); + list.mint_discount_amount(&deps.querier) }) .transpose()? .unwrap_or(None); - let whitelist_type = list.map(|whitelist| match whitelist { - WhitelistContract::Updatable(_) => Some(WhitelistType::Updatable), - WhitelistContract::Flatrate(_) => Some(WhitelistType::Flatrate), - }); + println!("discount: {:?}", discount); - let price = validate_payment( - name.len(), - &info, - params.base_price.u128(), - discount, - whitelist_type.unwrap_or(None), - )?; - charge_fees(&mut res, params.fair_burn_percent, price.amount); + let price = validate_payment(name.len(), &info, params.base_price.u128(), discount)?; + if price.clone().is_some() { + charge_fees( + &mut res, + params.fair_burn_percent, + price.clone().unwrap().amount, + ); + } let collection = NAME_COLLECTION.load(deps.storage)?; let marketplace = NAME_MARKETPLACE.load(deps.storage)?; @@ -238,7 +216,10 @@ pub fn execute_mint_and_list( let event = Event::new("mint-and-list") .add_attribute("name", name) .add_attribute("owner", sender) - .add_attribute("price", price.amount.to_string()); + .add_attribute( + "price", + price.unwrap_or(coin(0, NATIVE_DENOM)).amount.to_string(), + ); Ok(res .add_event(event) .add_message(mint_msg_exec) @@ -259,34 +240,17 @@ pub fn execute_pause( Ok(Response::new().add_event(event)) } -#[derive(Eq, PartialEq, Clone, JsonSchema, Deserialize, Debug, Serialize)] -pub enum WhitelistType { - Updatable, - Flatrate, -} - pub fn execute_add_whitelist( deps: DepsMut, info: MessageInfo, address: String, - whitelist_type: Option, ) -> Result { ADMIN.assert_admin(deps.as_ref(), &info.sender)?; - let whitelist_type = whitelist_type.unwrap_or(WhitelistType::Updatable); - - let whitelist = match whitelist_type { - WhitelistType::Updatable => WhitelistContract::Updatable( - deps.api - .addr_validate(&address) - .map(WhitelistUpdatableContract)?, - ), - WhitelistType::Flatrate => WhitelistContract::Flatrate( - deps.api - .addr_validate(&address) - .map(WhitelistUpdatableFlatrateContract)?, - ), - }; + let whitelist = deps + .api + .addr_validate(&address) + .map(WhitelistUpdatableFlatrateContract)?; let mut lists = WHITELISTS.load(deps.storage)?; lists.push(whitelist); @@ -301,25 +265,12 @@ pub fn execute_remove_whitelist( deps: DepsMut, info: MessageInfo, address: String, - whitelist_type: Option, ) -> Result { ADMIN.assert_admin(deps.as_ref(), &info.sender)?; - let whitelist_type = whitelist_type.unwrap_or(WhitelistType::Updatable); - let whitelist_addr = deps.api.addr_validate(&address)?; - + let whitelist = deps.api.addr_validate(&address)?; let mut lists = WHITELISTS.load(deps.storage)?; - lists.retain(|whitelist| { - let addr_matches = match whitelist { - WhitelistContract::Updatable(updatable) => updatable.addr() == whitelist_addr, - WhitelistContract::Flatrate(flatrate) => flatrate.addr() == whitelist_addr, - }; - let type_matches = match whitelist { - WhitelistContract::Updatable(_) => whitelist_type == WhitelistType::Updatable, - WhitelistContract::Flatrate(_) => whitelist_type == WhitelistType::Flatrate, - }; - !(addr_matches && type_matches) - }); + lists.retain(|addr| addr.addr() != whitelist); WHITELISTS.save(deps.storage, &lists)?; @@ -379,9 +330,8 @@ fn validate_payment( name_len: usize, info: &MessageInfo, base_price: u128, - discount: Option, - whitelist_type: Option, -) -> Result { + discount: Option, +) -> Result, ContractError> { // Because we know we are left with ASCII chars, a simple byte count is enough let mut amount: Uint128 = (match name_len { 0..=2 => { @@ -393,23 +343,15 @@ fn validate_payment( }) .into(); - amount = match whitelist_type { - Some(WhitelistType::Updatable) => discount - .map(|d| amount * (Decimal::one() - d)) - .unwrap_or(amount), - Some(WhitelistType::Flatrate) => { - // we assume that discount is a flat amount and - // not a percentage and is a whole number - discount - .map(|d| amount - (d * Uint128::from(1u128))) - .unwrap_or(amount) - } - None => amount, - }; + if discount.is_some() && amount.ge(&Uint128::from(discount.unwrap())) { + amount = amount + .checked_sub(Uint128::from(discount.unwrap())) + .unwrap(); + } - // let amount = discount - // .map(|d| amount * (Decimal::one() - d)) - // .unwrap_or(amount); + if amount.is_zero() { + return Ok(None); + } let payment = must_pay(info, NATIVE_DENOM)?; if payment != amount { @@ -419,7 +361,7 @@ fn validate_payment( }); } - Ok(coin(amount.u128(), NATIVE_DENOM)) + Ok(Some(coin(amount.u128(), NATIVE_DENOM))) } fn invalid_char(c: char) -> bool { @@ -489,7 +431,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result Box> { let contract = ContractWrapper::new(execute, instantiate, query).with_reply(reply); @@ -55,9 +57,9 @@ pub fn contract_collection() -> Box> { pub fn contract_whitelist() -> Box> { let contract = ContractWrapper::new( - whitelist_updatable::contract::execute, - whitelist_updatable::contract::instantiate, - whitelist_updatable::contract::query, + whitelist_updatable_flatrate::contract::execute, + whitelist_updatable_flatrate::contract::instantiate, + whitelist_updatable_flatrate::contract::query, ); Box::new(contract) } @@ -191,7 +193,7 @@ fn instantiate_contracts( assert_eq!(res, marketplace.to_string()); // 4. Instantiate Whitelist - let msg = whitelist_updatable::msg::InstantiateMsg { + let msg = whitelist_updatable_flatrate::msg::InstantiateMsg { per_address_limit: PER_ADDRESS_LIMIT, addresses: vec![ "addr0001".to_string(), @@ -200,7 +202,8 @@ fn instantiate_contracts( USER4.to_string(), ADMIN2.to_string(), ], - mint_discount_bps: None, + mint_discount_amount: None, + admin_list: None, }; let wl = app .instantiate_contract(wl_id, Addr::unchecked(ADMIN2), &msg, &[], "Whitelist", None) @@ -210,7 +213,6 @@ fn instantiate_contracts( if let Some(admin) = admin { let msg = ExecuteMsg::AddWhitelist { address: wl.to_string(), - whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(admin), Addr::unchecked(minter), &msg, &[]); assert!(res.is_ok()); @@ -274,14 +276,16 @@ fn mint_and_list( // give user some funds let name_fee = coins(amount.into(), NATIVE_DENOM); - app.sudo(CwSudoMsg::Bank({ - BankSudo::Mint { - to_address: user.to_string(), - amount: name_fee.clone(), - } - })) - .map_err(|err| println!("{:?}", err)) - .ok(); + if amount > Uint128::from(0u128) { + app.sudo(CwSudoMsg::Bank({ + BankSudo::Mint { + to_address: user.to_string(), + amount: name_fee.clone(), + } + })) + .map_err(|err| println!("{:?}", err)) + .ok(); + } let msg = ExecuteMsg::MintAndList { name: name.to_string(), @@ -338,7 +342,7 @@ mod execute { use name_marketplace::state::{Ask, SudoParams}; use sg721_name::msg::QueryMsg as Sg721NameQueryMsg; use sg_name::Metadata; - use whitelist_updatable::msg::QueryMsg::IncludesAddress; + use whitelist_updatable_flatrate::msg::QueryMsg::IncludesAddress; use crate::msg::QueryMsg; @@ -789,7 +793,7 @@ mod execute { } mod admin { - use whitelist_updatable::state::Config; + use whitelist_updatable_flatrate::state::Config; use crate::msg::QueryMsg; @@ -829,7 +833,7 @@ mod admin { let msg = WhitelistQueryMsg::Config {}; let res: Config = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); - assert_eq!(res.admin, ADMIN2.to_string()); + assert_eq!(res.admins, [ADMIN2.to_string()]); let msg = WhitelistQueryMsg::AddressCount {}; let count: u64 = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); @@ -2064,7 +2068,7 @@ mod collection { mod whitelist { use crate::msg::QueryMsg; - use whitelist_updatable::{msg::QueryMsg as WhitelistQueryMsg, state::Config}; + use whitelist_updatable_flatrate::{msg::QueryMsg as WhitelistQueryMsg, state::Config}; use super::*; @@ -2086,7 +2090,6 @@ mod whitelist { let wl_count = whitelists.len(); let msg = ExecuteMsg::AddWhitelist { address: "whitelist".to_string(), - whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); @@ -2098,7 +2101,6 @@ mod whitelist { let msg = ExecuteMsg::RemoveWhitelist { address: "whitelist".to_string(), - whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); @@ -2114,7 +2116,7 @@ mod whitelist { let wl_id = app.store_code(contract_whitelist()); // instantiate wl2 - let msg = whitelist_updatable::msg::InstantiateMsg { + let msg = whitelist_updatable_flatrate::msg::InstantiateMsg { per_address_limit: PER_ADDRESS_LIMIT, addresses: vec![ "addr0001".to_string(), @@ -2123,7 +2125,8 @@ mod whitelist { USER2.to_string(), ADMIN2.to_string(), ], - mint_discount_bps: None, + mint_discount_amount: None, + admin_list: None, }; let wl2 = app .instantiate_contract(wl_id, Addr::unchecked(ADMIN2), &msg, &[], "Whitelist", None) @@ -2132,7 +2135,6 @@ mod whitelist { // add wl2 to minter let msg = ExecuteMsg::AddWhitelist { address: wl2.to_string(), - whitelist_type: None, }; let res = app.execute_contract( Addr::unchecked(ADMIN.to_string()), @@ -2190,7 +2192,7 @@ mod whitelist { let wl_id = app.store_code(contract_whitelist()); // instantiate wl2 - let msg = whitelist_updatable::msg::InstantiateMsg { + let msg = whitelist_updatable_flatrate::msg::InstantiateMsg { per_address_limit: PER_ADDRESS_LIMIT, addresses: vec![ "addr0001".to_string(), @@ -2199,7 +2201,8 @@ mod whitelist { USER2.to_string(), ADMIN2.to_string(), ], - mint_discount_bps: Some(3500), + mint_discount_amount: Some(BASE_PRICE as u64), + admin_list: None, }; let wl2 = app @@ -2209,7 +2212,6 @@ mod whitelist { // add wl2 to minter let msg = ExecuteMsg::AddWhitelist { address: wl2.to_string(), - whitelist_type: None, }; let res = app.execute_contract( Addr::unchecked(ADMIN.to_string()), @@ -2221,11 +2223,20 @@ mod whitelist { // mint and list with discount // query discount, pass to mint_and_list - let discount: Decimal = app + let discount: u64 = app .wrap() - .query_wasm_smart(wl2, &(WhitelistQueryMsg::MintDiscountPercent {})) + .query_wasm_smart(wl2, &(WhitelistQueryMsg::MintDiscountAmount {})) .unwrap(); - let res = mint_and_list(&mut app, NAME, USER2, Some(discount)); + let res = mint_and_list( + &mut app, + NAME, + USER2, + Some(Decimal::from_ratio( + discount, + Uint128::from(1_000_000_000u128), + )), + ); + println!("result: {:?}", res); assert!(res.is_ok()); } @@ -2235,7 +2246,6 @@ mod whitelist { let msg = ExecuteMsg::AddWhitelist { address: WHITELIST.to_string(), - whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); @@ -2261,7 +2271,7 @@ mod whitelist { let msg = WhitelistQueryMsg::Config {}; let res: Config = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); - assert_eq!(res.admin, ADMIN2.to_string()); + assert_eq!(res.admins, [ADMIN2.to_string()]); let msg = WhitelistQueryMsg::AddressCount {}; let res: u64 = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); @@ -2303,7 +2313,6 @@ mod public_start_time { // remove whitelist(s) let msg = ExecuteMsg::RemoveWhitelist { address: WHITELIST.to_string(), - whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); @@ -2324,7 +2333,6 @@ mod public_start_time { // remove whitelist(s) let msg = ExecuteMsg::RemoveWhitelist { address: WHITELIST.to_string(), - whitelist_type: None, }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); assert!(res.is_ok()); diff --git a/contracts/name-minter/src/msg.rs b/contracts/name-minter/src/msg.rs index 1d25a176..a28b9989 100644 --- a/contracts/name-minter/src/msg.rs +++ b/contracts/name-minter/src/msg.rs @@ -2,8 +2,6 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{Addr, Uint128}; use sg_name_minter::{Config, SudoParams}; -use crate::contract::WhitelistType; - #[cw_serde] pub struct InstantiateMsg { /// Temporary admin for managing whitelists @@ -29,15 +27,9 @@ pub enum ExecuteMsg { /// Admin can pause minting during whitelist switching Pause { pause: bool }, /// Add a whitelist address - AddWhitelist { - address: String, - whitelist_type: Option, - }, + AddWhitelist { address: String }, /// Remove a whitelist address - RemoveWhitelist { - address: String, - whitelist_type: Option, - }, + RemoveWhitelist { address: String }, /// Update config, only callable by admin UpdateConfig { config: Config }, } diff --git a/contracts/name-minter/src/query.rs b/contracts/name-minter/src/query.rs index 34510a7d..032f9226 100644 --- a/contracts/name-minter/src/query.rs +++ b/contracts/name-minter/src/query.rs @@ -5,7 +5,7 @@ use sg_name_minter::{Config, SudoParams}; use crate::{ msg::QueryMsg, - state::{WhitelistContract, ADMIN, CONFIG, NAME_COLLECTION, SUDO_PARAMS, WHITELISTS}, + state::{ADMIN, CONFIG, NAME_COLLECTION, SUDO_PARAMS, WHITELISTS}, }; #[cfg_attr(not(feature = "library"), entry_point)] @@ -21,13 +21,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { fn query_whitelists(deps: Deps) -> StdResult> { let whitelists = WHITELISTS.load(deps.storage)?; - Ok(whitelists - .iter() - .map(|w| match w { - WhitelistContract::Updatable(contract) => contract.addr(), - WhitelistContract::Flatrate(contract) => contract.addr(), - }) - .collect()) + Ok(whitelists.iter().map(|w| w.addr()).collect()) } fn query_collection(deps: Deps) -> StdResult { diff --git a/contracts/name-minter/src/state.rs b/contracts/name-minter/src/state.rs index 1d49ffd1..eff09504 100644 --- a/contracts/name-minter/src/state.rs +++ b/contracts/name-minter/src/state.rs @@ -6,12 +6,6 @@ use sg_name_minter::{Config, SudoParams}; use whitelist_updatable::helpers::WhitelistUpdatableContract; use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; -#[derive(Serialize, Deserialize)] -pub enum WhitelistContract { - Updatable(WhitelistUpdatableContract), - Flatrate(WhitelistUpdatableFlatrateContract), -} - pub const SUDO_PARAMS: Item = Item::new("params"); pub const NAME_COLLECTION: Item = Item::new("name-collection"); @@ -21,7 +15,7 @@ pub const NAME_MARKETPLACE: Item = Item::new("name-marketplace"); pub const ADMIN: Admin = Admin::new("admin"); /// Can only be updated by admin -pub const WHITELISTS: Item> = Item::new("whitelists"); +pub const WHITELISTS: Item> = Item::new("whitelists"); /// Controls if minting is paused or not by admin pub const PAUSED: Item = Item::new("paused"); diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs index b1b525ca..ee52ea47 100644 --- a/contracts/whitelist-updatable-flatrate/src/helpers.rs +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -51,7 +51,7 @@ impl WhitelistUpdatableFlatrateContract { Ok(res) } - pub fn mint_discount_amount(&self, querier: &QuerierWrapper) -> StdResult> { + pub fn mint_discount_amount(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), msg: to_binary(&QueryMsg::MintDiscountAmount {})?, diff --git a/contracts/whitelist-updatable-flatrate/src/msg.rs b/contracts/whitelist-updatable-flatrate/src/msg.rs index e5dd82c5..aabc7e55 100644 --- a/contracts/whitelist-updatable-flatrate/src/msg.rs +++ b/contracts/whitelist-updatable-flatrate/src/msg.rs @@ -50,6 +50,6 @@ pub enum QueryMsg { #[returns(u64)] PerAddressLimit {}, // Mint discount converts bps to decimal percentage - #[returns(u64)] + #[returns(Option)] MintDiscountAmount {}, } From 0079ca912c21dede2bf51559744b186c606b4005 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Wed, 27 Mar 2024 11:43:05 +0300 Subject: [PATCH 71/91] Add TS interface & types for whitelist-updatable-flatrate --- ts/src/WhitelistUpdatableFlatrate.client.ts | 217 ++++++++++++++++++++ ts/src/WhitelistUpdatableFlatrate.types.ts | 70 +++++++ 2 files changed, 287 insertions(+) create mode 100644 ts/src/WhitelistUpdatableFlatrate.client.ts create mode 100644 ts/src/WhitelistUpdatableFlatrate.types.ts diff --git a/ts/src/WhitelistUpdatableFlatrate.client.ts b/ts/src/WhitelistUpdatableFlatrate.client.ts new file mode 100644 index 00000000..69190905 --- /dev/null +++ b/ts/src/WhitelistUpdatableFlatrate.client.ts @@ -0,0 +1,217 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { Coin, StdFee } from "@cosmjs/amino"; +import { InstantiateMsg, ExecuteMsg, QueryMsg, Uint64, AdminResponse, Addr, Config, Boolean, Nullableuint64 } from "./WhitelistUpdatableFlatrate.types"; +export interface WhitelistUpdatableFlatrateReadOnlyInterface { + contractAddress: string; + config: () => Promise; + includesAddress: ({ + address + }: { + address: string; + }) => Promise; + mintCount: ({ + address + }: { + address: string; + }) => Promise; + isProcessable: ({ + address + }: { + address: string; + }) => Promise; + admins: () => Promise; + addressCount: () => Promise; + perAddressLimit: () => Promise; + mintDiscountAmount: () => Promise; +} +export class WhitelistUpdatableFlatrateQueryClient implements WhitelistUpdatableFlatrateReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.config = this.config.bind(this); + this.includesAddress = this.includesAddress.bind(this); + this.mintCount = this.mintCount.bind(this); + this.isProcessable = this.isProcessable.bind(this); + this.admins = this.admins.bind(this); + this.addressCount = this.addressCount.bind(this); + this.perAddressLimit = this.perAddressLimit.bind(this); + this.mintDiscountAmount = this.mintDiscountAmount.bind(this); + } + + config = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + config: {} + }); + }; + includesAddress = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + includes_address: { + address + } + }); + }; + mintCount = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + mint_count: { + address + } + }); + }; + isProcessable = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + is_processable: { + address + } + }); + }; + admins = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + admins: {} + }); + }; + addressCount = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + address_count: {} + }); + }; + perAddressLimit = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + per_address_limit: {} + }); + }; + mintDiscountAmount = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + mint_discount_amount: {} + }); + }; +} +export interface WhitelistUpdatableFlatrateInterface extends WhitelistUpdatableFlatrateReadOnlyInterface { + contractAddress: string; + sender: string; + updateAdmins: ({ + newAdminList + }: { + newAdminList: string[]; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + addAddresses: ({ + addresses + }: { + addresses: string[]; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + removeAddresses: ({ + addresses + }: { + addresses: string[]; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + processAddress: ({ + address + }: { + address: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updatePerAddressLimit: ({ + limit + }: { + limit: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + purge: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class WhitelistUpdatableFlatrateClient extends WhitelistUpdatableFlatrateQueryClient implements WhitelistUpdatableFlatrateInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.updateAdmins = this.updateAdmins.bind(this); + this.addAddresses = this.addAddresses.bind(this); + this.removeAddresses = this.removeAddresses.bind(this); + this.processAddress = this.processAddress.bind(this); + this.updatePerAddressLimit = this.updatePerAddressLimit.bind(this); + this.purge = this.purge.bind(this); + } + + updateAdmins = async ({ + newAdminList + }: { + newAdminList: string[]; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_admins: { + new_admin_list: newAdminList + } + }, fee, memo, _funds); + }; + addAddresses = async ({ + addresses + }: { + addresses: string[]; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + add_addresses: { + addresses + } + }, fee, memo, _funds); + }; + removeAddresses = async ({ + addresses + }: { + addresses: string[]; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + remove_addresses: { + addresses + } + }, fee, memo, _funds); + }; + processAddress = async ({ + address + }: { + address: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + process_address: { + address + } + }, fee, memo, _funds); + }; + updatePerAddressLimit = async ({ + limit + }: { + limit: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_per_address_limit: { + limit + } + }, fee, memo, _funds); + }; + purge = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + purge: {} + }, fee, memo, _funds); + }; +} \ No newline at end of file diff --git a/ts/src/WhitelistUpdatableFlatrate.types.ts b/ts/src/WhitelistUpdatableFlatrate.types.ts new file mode 100644 index 00000000..c9efa0c3 --- /dev/null +++ b/ts/src/WhitelistUpdatableFlatrate.types.ts @@ -0,0 +1,70 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export interface InstantiateMsg { + addresses: string[]; + admin_list?: string[] | null; + mint_discount_amount?: number | null; + per_address_limit: number; +} +export type ExecuteMsg = { + update_admins: { + new_admin_list: string[]; + }; +} | { + add_addresses: { + addresses: string[]; + }; +} | { + remove_addresses: { + addresses: string[]; + }; +} | { + process_address: { + address: string; + }; +} | { + update_per_address_limit: { + limit: number; + }; +} | { + purge: {}; +}; +export type QueryMsg = { + config: {}; +} | { + includes_address: { + address: string; + }; +} | { + mint_count: { + address: string; + }; +} | { + is_processable: { + address: string; + }; +} | { + admins: {}; +} | { + address_count: {}; +} | { + per_address_limit: {}; +} | { + mint_discount_amount: {}; +}; +export type Uint64 = number; +export interface AdminResponse { + admin?: string | null; +} +export type Addr = string; +export interface Config { + admins: Addr[]; + mint_discount_amount?: number | null; + per_address_limit: number; +} +export type Boolean = boolean; +export type Nullableuint64 = number | null; \ No newline at end of file From eeb9b9002d0a8da979103f95d8937cef31ba5121 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Wed, 27 Mar 2024 11:49:20 +0300 Subject: [PATCH 72/91] Update whitelist-updatable-flatrate TS client --- ts/src/WhitelistUpdatableFlatrate.client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ts/src/WhitelistUpdatableFlatrate.client.ts b/ts/src/WhitelistUpdatableFlatrate.client.ts index 69190905..253f9471 100644 --- a/ts/src/WhitelistUpdatableFlatrate.client.ts +++ b/ts/src/WhitelistUpdatableFlatrate.client.ts @@ -28,7 +28,7 @@ export interface WhitelistUpdatableFlatrateReadOnlyInterface { admins: () => Promise; addressCount: () => Promise; perAddressLimit: () => Promise; - mintDiscountAmount: () => Promise; + mintDiscountAmount: () => Promise; } export class WhitelistUpdatableFlatrateQueryClient implements WhitelistUpdatableFlatrateReadOnlyInterface { client: CosmWasmClient; @@ -100,7 +100,7 @@ export class WhitelistUpdatableFlatrateQueryClient implements WhitelistUpdatable per_address_limit: {} }); }; - mintDiscountAmount = async (): Promise => { + mintDiscountAmount = async (): Promise => { return this.client.queryContractSmart(this.contractAddress, { mint_discount_amount: {} }); From c351a23f1e9d02cc226e6e3f2222f01967149115 Mon Sep 17 00:00:00 2001 From: Jorge Hernandez <3452489+jhernandezb@users.noreply.github.com> Date: Wed, 27 Mar 2024 08:42:04 -0600 Subject: [PATCH 73/91] minor updates (#259) * minor updates * ignore lint * ignore lint * update schema --- contracts/name-minter/schema/name-minter.json | 27 ------------------- contracts/name-minter/src/contract.rs | 14 +++++----- .../src/contract.rs | 6 +---- .../src/integration_tests.rs | 6 ++--- 4 files changed, 12 insertions(+), 41 deletions(-) diff --git a/contracts/name-minter/schema/name-minter.json b/contracts/name-minter/schema/name-minter.json index 886cfa02..a7b7ce15 100644 --- a/contracts/name-minter/schema/name-minter.json +++ b/contracts/name-minter/schema/name-minter.json @@ -156,16 +156,6 @@ "properties": { "address": { "type": "string" - }, - "whitelist_type": { - "anyOf": [ - { - "$ref": "#/definitions/WhitelistType" - }, - { - "type": "null" - } - ] } }, "additionalProperties": false @@ -188,16 +178,6 @@ "properties": { "address": { "type": "string" - }, - "whitelist_type": { - "anyOf": [ - { - "$ref": "#/definitions/WhitelistType" - }, - { - "type": "null" - } - ] } }, "additionalProperties": false @@ -252,13 +232,6 @@ "Uint64": { "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", "type": "string" - }, - "WhitelistType": { - "type": "string", - "enum": [ - "Updatable", - "Flatrate" - ] } } }, diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index de228354..2812cd80 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -177,8 +177,6 @@ pub fn execute_mint_and_list( .transpose()? .unwrap_or(None); - println!("discount: {:?}", discount); - let price = validate_payment(name.len(), &info, params.base_price.u128(), discount)?; if price.clone().is_some() { charge_fees( @@ -343,10 +341,14 @@ fn validate_payment( }) .into(); - if discount.is_some() && amount.ge(&Uint128::from(discount.unwrap())) { - amount = amount - .checked_sub(Uint128::from(discount.unwrap())) - .unwrap(); + if let Some(discount_value) = discount { + let discount_amount = Uint128::from(discount_value); + // TODO: should we handle the case where discount > amount (eg 1,000 discount but buying a 100 name) + if amount.ge(&discount_amount) { + amount = amount + .checked_sub(discount_amount) + .map_err(|_| StdError::generic_err("invalid discount amount"))?; + } } if amount.is_zero() { diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index 9a4751b3..e48bb21b 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -135,11 +135,7 @@ pub fn execute_add_addresses( for address in addresses.into_iter() { let addr = deps.api.addr_validate(&address.clone())?; - if WHITELIST.has(deps.storage, addr.clone()) { - return Err(ContractError::AddressAlreadyExists { - addr: addr.to_string(), - }); - } else { + if !WHITELIST.has(deps.storage, addr.clone()) { WHITELIST.save(deps.storage, addr, &0u32)?; count += 1; } diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index 710a5ff1..0392f1e2 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -244,7 +244,7 @@ mod tests { ], }; let res = app.execute_contract(Addr::unchecked(OTHER_ADMIN), wl_addr.clone(), &msg, &[]); - assert!(res.is_err()); + assert!(res.is_ok()); let res: bool = app .wrap() .query_wasm_smart( @@ -254,12 +254,12 @@ mod tests { }), ) .unwrap(); - assert!(!res); + assert!(res); let res: u64 = app .wrap() .query_wasm_smart(&wl_addr, &(QueryMsg::AddressCount {})) .unwrap(); - assert_eq!(res, 5); + assert_eq!(res, 6); let msg = ExecuteMsg::AddAddresses { addresses: vec!["addr0007".to_string(), "addr0006".to_string()], }; From 92e05c766fb60f9736ccee43eb71f9b823226375 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 8 Apr 2024 06:57:37 -0800 Subject: [PATCH 74/91] linter fix for deprc functions --- contracts/marketplace/src/execute.rs | 6 +-- contracts/marketplace/src/helpers.rs | 6 +-- contracts/marketplace/src/hooks.rs | 6 +-- contracts/marketplace/src/msg.rs | 14 +++--- contracts/marketplace/src/query.rs | 44 ++++++++++--------- contracts/name-minter/src/contract.rs | 12 ++--- contracts/name-minter/src/helpers.rs | 8 ++-- .../name-minter/src/integration_tests.rs | 4 +- contracts/name-minter/src/query.rs | 12 ++--- contracts/sg721-name/src/contract.rs | 6 +-- contracts/sg721-name/src/helpers.rs | 10 ++--- contracts/sg721-name/src/lib.rs | 18 ++++---- contracts/sg721-name/src/unit_tests.rs | 14 +++--- .../src/contract.rs | 22 ++++++---- .../src/helpers.rs | 10 ++--- contracts/whitelist-updatable/src/contract.rs | 22 ++++++---- contracts/whitelist-updatable/src/helpers.rs | 10 ++--- packages/sg-name/src/lib.rs | 8 ++-- 18 files changed, 122 insertions(+), 110 deletions(-) diff --git a/contracts/marketplace/src/execute.rs b/contracts/marketplace/src/execute.rs index c76e23d1..663d5453 100644 --- a/contracts/marketplace/src/execute.rs +++ b/contracts/marketplace/src/execute.rs @@ -8,8 +8,8 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, coins, ensure, ensure_eq, to_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, Env, - Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, + coin, coins, ensure, ensure_eq, to_json_binary, Addr, BankMsg, Decimal, Deps, DepsMut, Empty, + Env, Event, MessageInfo, Order, StdError, StdResult, Storage, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721::{Cw721ExecuteMsg, OwnerOfResponse}; @@ -621,7 +621,7 @@ pub fn finalize_sale( let exec_cw721_transfer = WasmMsg::Execute { contract_addr: collection.to_string(), - msg: to_binary(&cw721_transfer_msg)?, + msg: to_json_binary(&cw721_transfer_msg)?, funds: vec![], }; res.messages.push(SubMsg::new(exec_cw721_transfer)); diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index b1808908..3953542f 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -8,7 +8,7 @@ use crate::{ }; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - coins, ensure, to_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, + coins, ensure, to_json_binary, Addr, BankMsg, Deps, DepsMut, Env, Event, Order, QuerierWrapper, QueryRequest, StdError, StdResult, Timestamp, Uint128, WasmMsg, WasmQuery, }; use cw_storage_plus::Bound; @@ -26,7 +26,7 @@ impl NameMarketplaceContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -44,7 +44,7 @@ impl NameMarketplaceContract { pub fn highest_bid(&self, querier: &QuerierWrapper, token_id: &str) -> StdResult> { let res: Option = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::HighestBid { + msg: to_json_binary(&QueryMsg::HighestBid { token_id: token_id.to_string(), })?, }))?; diff --git a/contracts/marketplace/src/hooks.rs b/contracts/marketplace/src/hooks.rs index eab632e6..2a899ed4 100644 --- a/contracts/marketplace/src/hooks.rs +++ b/contracts/marketplace/src/hooks.rs @@ -55,7 +55,7 @@ pub fn prepare_ask_hook(deps: Deps, ask: &Ask, action: HookAction) -> StdResult< let msg = AskHookMsg { ask: ask.clone() }; let execute = WasmMsg::Execute { contract_addr: h.to_string(), - msg: msg.into_binary(action.clone())?, + msg: msg.into_json_binary(action.clone())?, funds: vec![], }; Ok(SubMsg::reply_on_error(execute, HookReply::Ask as u64)) @@ -73,7 +73,7 @@ pub fn prepare_sale_hook(deps: Deps, ask: &Ask, buyer: Addr) -> StdResult StdResult< let msg = BidHookMsg { bid: bid.clone() }; let execute = WasmMsg::Execute { contract_addr: h.to_string(), - msg: msg.into_binary(action.clone())?, + msg: msg.into_json_binary(action.clone())?, funds: vec![], }; Ok(SubMsg::reply_on_error(execute, HookReply::Bid as u64)) diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index 30008069..ee43c695 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -1,6 +1,6 @@ use crate::state::{Ask, Bid, Id, SudoParams, TokenId}; use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_binary, Addr, Binary, Coin, Decimal, StdResult, Timestamp, Uint128}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Decimal, StdResult, Timestamp, Uint128}; use sg_controllers::HooksResponse; #[cw_serde] @@ -247,9 +247,9 @@ impl SaleHookMsg { } /// serializes the message - pub fn into_binary(self) -> StdResult { + pub fn into_json_binary(self) -> StdResult { let msg = SaleExecuteMsg::SaleHook(self); - to_binary(&msg) + to_json_binary(&msg) } } @@ -277,13 +277,13 @@ impl AskHookMsg { } /// serializes the message - pub fn into_binary(self, action: HookAction) -> StdResult { + pub fn into_json_binary(self, action: HookAction) -> StdResult { let msg = match action { HookAction::Create => AskHookExecuteMsg::AskCreatedHook(self), HookAction::Update => AskHookExecuteMsg::AskUpdatedHook(self), HookAction::Delete => AskHookExecuteMsg::AskDeletedHook(self), }; - to_binary(&msg) + to_json_binary(&msg) } } @@ -306,13 +306,13 @@ impl BidHookMsg { } /// serializes the message - pub fn into_binary(self, action: HookAction) -> StdResult { + pub fn into_json_binary(self, action: HookAction) -> StdResult { let msg = match action { HookAction::Create => BidExecuteMsg::BidCreatedHook(self), HookAction::Update => BidExecuteMsg::BidUpdatedHook(self), HookAction::Delete => BidExecuteMsg::BidDeletedHook(self), }; - to_binary(&msg) + to_json_binary(&msg) } } diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 448504a9..d405af29 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -7,7 +7,7 @@ use crate::state::{ }; use cosmwasm_std::{ - coin, to_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, + coin, to_json_binary, Addr, Binary, Coin, Deps, Env, Order, StdError, StdResult, Timestamp, }; use cw_storage_plus::Bound; use sg_name_minter::{SgNameMinterQueryMsg, SudoParams as NameMinterParams}; @@ -25,13 +25,15 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { let api = deps.api; match msg { - QueryMsg::Ask { token_id } => to_binary(&query_ask(deps, token_id)?), - QueryMsg::Asks { start_after, limit } => to_binary(&query_asks(deps, start_after, limit)?), + QueryMsg::Ask { token_id } => to_json_binary(&query_ask(deps, token_id)?), + QueryMsg::Asks { start_after, limit } => { + to_json_binary(&query_asks(deps, start_after, limit)?) + } QueryMsg::AsksBySeller { seller, start_after, limit, - } => to_binary(&query_asks_by_seller( + } => to_json_binary(&query_asks_by_seller( deps, api.addr_validate(&seller)?, start_after, @@ -41,7 +43,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { max_time, start_after, limit, - } => to_binary(&query_asks_by_renew_time( + } => to_json_binary(&query_asks_by_renew_time( deps, max_time, start_after, @@ -50,36 +52,36 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { QueryMsg::AskRenewPrice { current_time, token_id, - } => to_binary(&query_ask_renew_price(deps, current_time, token_id)?), - QueryMsg::AskCount {} => to_binary(&query_ask_count(deps)?), + } => to_json_binary(&query_ask_renew_price(deps, current_time, token_id)?), + QueryMsg::AskCount {} => to_json_binary(&query_ask_count(deps)?), QueryMsg::Bid { token_id, bidder } => { - to_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) + to_json_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) } QueryMsg::Bids { token_id, start_after, limit, - } => to_binary(&query_bids(deps, token_id, start_after, limit)?), + } => to_json_binary(&query_bids(deps, token_id, start_after, limit)?), QueryMsg::LegacyBids { start_after, limit } => { - to_binary(&query_legacy_bids(deps, start_after, limit)?) + to_json_binary(&query_legacy_bids(deps, start_after, limit)?) } QueryMsg::BidsByBidder { bidder, start_after, limit, - } => to_binary(&query_bids_by_bidder( + } => to_json_binary(&query_bids_by_bidder( deps, api.addr_validate(&bidder)?, start_after, limit, )?), QueryMsg::BidsSortedByPrice { start_after, limit } => { - to_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) + to_json_binary(&query_bids_sorted_by_price(deps, start_after, limit)?) } QueryMsg::ReverseBidsSortedByPrice { start_before, limit, - } => to_binary(&reverse_query_bids_sorted_by_price( + } => to_json_binary(&reverse_query_bids_sorted_by_price( deps, start_before, limit, @@ -88,19 +90,19 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { seller, start_after, limit, - } => to_binary(&query_bids_for_seller( + } => to_json_binary(&query_bids_for_seller( deps, api.addr_validate(&seller)?, start_after, limit, )?), - QueryMsg::HighestBid { token_id } => to_binary(&query_highest_bid(deps, token_id)?), - QueryMsg::Params {} => to_binary(&query_params(deps)?), - QueryMsg::AskHooks {} => to_binary(&ASK_HOOKS.query_hooks(deps)?), - QueryMsg::BidHooks {} => to_binary(&BID_HOOKS.query_hooks(deps)?), - QueryMsg::SaleHooks {} => to_binary(&SALE_HOOKS.query_hooks(deps)?), - QueryMsg::RenewalQueue { time } => to_binary(&query_renewal_queue(deps, time)?), - QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::HighestBid { token_id } => to_json_binary(&query_highest_bid(deps, token_id)?), + QueryMsg::Params {} => to_json_binary(&query_params(deps)?), + QueryMsg::AskHooks {} => to_json_binary(&ASK_HOOKS.query_hooks(deps)?), + QueryMsg::BidHooks {} => to_json_binary(&BID_HOOKS.query_hooks(deps)?), + QueryMsg::SaleHooks {} => to_json_binary(&SALE_HOOKS.query_hooks(deps)?), + QueryMsg::RenewalQueue { time } => to_json_binary(&query_renewal_queue(deps, time)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), } } diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 029116d6..32ac444e 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -3,8 +3,8 @@ use std::vec; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - coin, to_binary, Addr, Coin, Decimal, DepsMut, Empty, Env, Event, MessageInfo, Reply, StdError, - Uint128, WasmMsg, + coin, to_json_binary, Addr, Coin, Decimal, DepsMut, Empty, Env, Event, MessageInfo, Reply, + StdError, Uint128, WasmMsg, }; use cw2::set_contract_version; use cw721_base::MintMsg; @@ -104,7 +104,7 @@ pub fn instantiate( }; let wasm_msg = WasmMsg::Instantiate { code_id: msg.collection_code_id, - msg: to_binary(&name_collection_init_msg)?, + msg: to_json_binary(&name_collection_init_msg)?, funds: info.funds, admin: Some(info.sender.to_string()), label: "Name Collection".to_string(), @@ -221,7 +221,7 @@ pub fn execute_mint_and_list( }); let mint_msg_exec = WasmMsg::Execute { contract_addr: collection.to_string(), - msg: to_binary(&mint_msg)?, + msg: to_json_binary(&mint_msg)?, funds: vec![], }; @@ -231,7 +231,7 @@ pub fn execute_mint_and_list( }; let list_msg_exec = WasmMsg::Execute { contract_addr: marketplace.to_string(), - msg: to_binary(&ask_msg)?, + msg: to_json_binary(&ask_msg)?, funds: vec![], }; @@ -443,7 +443,7 @@ pub fn reply(deps: DepsMut, _env: Env, msg: Reply) -> Result>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -27,7 +29,7 @@ impl NameMinterContract { pub fn params(&self, querier: &QuerierWrapper) -> StdResult { let res: SudoParams = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Params {})?, + msg: to_json_binary(&QueryMsg::Params {})?, }))?; Ok(res) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 5d0b155b..0fe30cd5 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -1564,7 +1564,7 @@ mod query { } mod collection { - use cosmwasm_std::{to_binary, StdResult}; + use cosmwasm_std::{to_json_binary, StdResult}; use cw721::NftInfoResponse; use cw_controllers::AdminResponse; use name_marketplace::state::Ask; @@ -1594,7 +1594,7 @@ mod collection { } fn send(app: &mut StargazeApp, from: &str, to: &str) { - let msg = to_binary("You now have the melting power").unwrap(); + let msg = to_json_binary("You now have the melting power").unwrap(); let target = to.to_string(); let send_msg = Sg721NameExecuteMsg::SendNft { contract: target, diff --git a/contracts/name-minter/src/query.rs b/contracts/name-minter/src/query.rs index 34510a7d..435bf25a 100644 --- a/contracts/name-minter/src/query.rs +++ b/contracts/name-minter/src/query.rs @@ -1,6 +1,6 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{to_binary, Addr, Binary, Deps, Env, StdResult}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Deps, Env, StdResult}; use sg_name_minter::{Config, SudoParams}; use crate::{ @@ -11,11 +11,11 @@ use crate::{ #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Admin {} => to_binary(&ADMIN.query_admin(deps)?), - QueryMsg::Collection {} => to_binary(&query_collection(deps)?), - QueryMsg::Params {} => to_binary(&query_params(deps)?), - QueryMsg::Whitelists {} => to_binary(&query_whitelists(deps)?), - QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::Admin {} => to_json_binary(&ADMIN.query_admin(deps)?), + QueryMsg::Collection {} => to_json_binary(&query_collection(deps)?), + QueryMsg::Params {} => to_json_binary(&query_params(deps)?), + QueryMsg::Whitelists {} => to_json_binary(&query_whitelists(deps)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), } } diff --git a/contracts/sg721-name/src/contract.rs b/contracts/sg721-name/src/contract.rs index 83de6c08..c2b177e9 100644 --- a/contracts/sg721-name/src/contract.rs +++ b/contracts/sg721-name/src/contract.rs @@ -4,8 +4,8 @@ use crate::{ }; use cosmwasm_std::{ - ensure, to_binary, Addr, Binary, ContractInfoResponse, Deps, DepsMut, Env, Event, MessageInfo, - StdError, StdResult, WasmMsg, + ensure, to_json_binary, Addr, Binary, ContractInfoResponse, Deps, DepsMut, Env, Event, + MessageInfo, StdError, StdResult, WasmMsg, }; use cw721_base::{state::TokenInfo, MintMsg}; @@ -195,7 +195,7 @@ fn update_ask_on_marketplace( let update_ask_msg = WasmMsg::Execute { contract_addr: NAME_MARKETPLACE.load(deps.storage)?.to_string(), funds: vec![], - msg: to_binary(&msg)?, + msg: to_json_binary(&msg)?, }; Ok(update_ask_msg) } diff --git a/contracts/sg721-name/src/helpers.rs b/contracts/sg721-name/src/helpers.rs index 1559bd76..cdfd370b 100644 --- a/contracts/sg721-name/src/helpers.rs +++ b/contracts/sg721-name/src/helpers.rs @@ -1,6 +1,6 @@ use crate::msg::QueryMsg; use cosmwasm_schema::cw_serde; -use cosmwasm_std::{to_binary, Addr, QuerierWrapper, QueryRequest, StdResult, WasmQuery}; +use cosmwasm_std::{to_json_binary, Addr, QuerierWrapper, QueryRequest, StdResult, WasmQuery}; use sg_name::{TextRecord, NFT}; /// NameCollectionContract is a wrapper around Addr that provides a lot of helpers @@ -15,7 +15,7 @@ impl NameCollectionContract { pub fn name(&self, querier: &QuerierWrapper, address: &str) -> StdResult { let res: String = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Name { + msg: to_json_binary(&QueryMsg::Name { address: address.to_string(), })?, }))?; @@ -26,7 +26,7 @@ impl NameCollectionContract { pub fn image_nft(&self, querier: &QuerierWrapper, name: &str) -> StdResult> { let res: Option = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::ImageNFT { + msg: to_json_binary(&QueryMsg::ImageNFT { name: name.to_string(), })?, }))?; @@ -37,7 +37,7 @@ impl NameCollectionContract { pub fn text_records(&self, querier: &QuerierWrapper, name: &str) -> StdResult> { let res: Vec = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::TextRecords { + msg: to_json_binary(&QueryMsg::TextRecords { name: name.to_string(), })?, }))?; @@ -48,7 +48,7 @@ impl NameCollectionContract { pub fn is_twitter_verified(&self, querier: &QuerierWrapper, name: &str) -> StdResult { let res: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::IsTwitterVerified { + msg: to_json_binary(&QueryMsg::IsTwitterVerified { name: name.to_string(), })?, }))?; diff --git a/contracts/sg721-name/src/lib.rs b/contracts/sg721-name/src/lib.rs index 50d29846..ac52d955 100644 --- a/contracts/sg721-name/src/lib.rs +++ b/contracts/sg721-name/src/lib.rs @@ -43,7 +43,7 @@ pub mod entry { query_associated_address, query_name, query_name_marketplace, query_params, }; use cosmwasm_std::{ - to_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, StdError, StdResult, + to_json_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, StdError, StdResult, }; use cw2::set_contract_version; use cw_utils::maybe_addr; @@ -134,17 +134,17 @@ pub mod entry { #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Params {} => to_binary(&query_params(deps)?), - QueryMsg::NameMarketplace {} => to_binary(&query_name_marketplace(deps)?), - QueryMsg::Name { address } => to_binary(&query_name(deps, address)?), - QueryMsg::Verifier {} => to_binary(&VERIFIER.query_admin(deps)?), + QueryMsg::Params {} => to_json_binary(&query_params(deps)?), + QueryMsg::NameMarketplace {} => to_json_binary(&query_name_marketplace(deps)?), + QueryMsg::Name { address } => to_json_binary(&query_name(deps, address)?), + QueryMsg::Verifier {} => to_json_binary(&VERIFIER.query_admin(deps)?), QueryMsg::AssociatedAddress { name } => { - to_binary(&query_associated_address(deps, &name)?) + to_json_binary(&query_associated_address(deps, &name)?) } - QueryMsg::ImageNFT { name } => to_binary(&query_image_nft(deps, &name)?), - QueryMsg::TextRecords { name } => to_binary(&query_text_records(deps, &name)?), + QueryMsg::ImageNFT { name } => to_json_binary(&query_image_nft(deps, &name)?), + QueryMsg::TextRecords { name } => to_json_binary(&query_text_records(deps, &name)?), QueryMsg::IsTwitterVerified { name } => { - to_binary(&query_is_twitter_verified(deps, &name)?) + to_json_binary(&query_is_twitter_verified(deps, &name)?) } _ => Sg721NameContract::default().query(deps, env, msg.into()), } diff --git a/contracts/sg721-name/src/unit_tests.rs b/contracts/sg721-name/src/unit_tests.rs index c1cc8fd3..86e03b68 100644 --- a/contracts/sg721-name/src/unit_tests.rs +++ b/contracts/sg721-name/src/unit_tests.rs @@ -1,7 +1,7 @@ use cosmwasm_std::testing::{mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{ - from_slice, to_binary, Addr, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, - QuerierResult, QueryRequest, StdError, SystemError, SystemResult, WasmQuery, + from_json, to_json_binary, Addr, ContractInfoResponse, ContractResult, Empty, OwnedDeps, + Querier, QuerierResult, QueryRequest, StdError, SystemError, SystemResult, WasmQuery, }; use cw721::Cw721Query; use cw721_base::MintMsg; @@ -34,7 +34,7 @@ pub struct CustomMockQuerier { impl Querier for CustomMockQuerier { fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { - let request: QueryRequest = match from_slice(bin_request) { + let request: QueryRequest = match from_json(bin_request) { Ok(v) => v, Err(e) => { return SystemResult::Err(SystemError::InvalidRequest { @@ -55,7 +55,7 @@ impl CustomMockQuerier { let mut response = ContractInfoResponse::default(); response.code_id = 1; response.creator = CREATOR.to_string(); - SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_json_binary(&response).unwrap())) } _ => self.base.handle_query(request), } @@ -108,7 +108,7 @@ fn mint_and_update() { // retrieve max record count let params: SudoParams = - from_slice(&query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); + from_json(query(deps.as_ref(), mock_env(), QueryMsg::Params {}).unwrap()).unwrap(); let max_record_count = params.max_record_count; // mint token @@ -144,7 +144,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_image_msg).unwrap(); let nft_value = res.events[0].attributes[2].value.clone().into_bytes(); - let nft: NFT = from_slice(&nft_value).unwrap(); + let nft: NFT = from_json(nft_value).unwrap(); assert_eq!(nft, new_nft); // add text record @@ -159,7 +159,7 @@ fn mint_and_update() { }; let res = execute(deps.as_mut(), mock_env(), info.clone(), update_record_msg).unwrap(); let record_value = res.events[0].attributes[2].value.clone().into_bytes(); - let record: TextRecord = from_slice(&record_value).unwrap(); + let record: TextRecord = from_json(record_value).unwrap(); assert_eq!(record, new_record); let records = query_text_records(deps.as_ref(), token_id).unwrap(); diff --git a/contracts/whitelist-updatable-flatrate/src/contract.rs b/contracts/whitelist-updatable-flatrate/src/contract.rs index 9a4751b3..0e482eb8 100644 --- a/contracts/whitelist-updatable-flatrate/src/contract.rs +++ b/contracts/whitelist-updatable-flatrate/src/contract.rs @@ -2,7 +2,7 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - ensure, to_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + ensure, to_json_binary, Addr, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, }; use cw2::set_contract_version; @@ -275,14 +275,18 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result StdResult { match msg { - QueryMsg::Config {} => to_binary(&query_config(deps)?), - QueryMsg::IncludesAddress { address } => to_binary(&query_includes_address(deps, address)?), - QueryMsg::MintCount { address } => to_binary(&query_mint_count(deps, address)?), - QueryMsg::Admins {} => to_binary(&query_admins(deps)?), - QueryMsg::AddressCount {} => to_binary(&query_address_count(deps)?), - QueryMsg::PerAddressLimit {} => to_binary(&query_per_address_limit(deps)?), - QueryMsg::IsProcessable { address } => to_binary(&query_is_processable(deps, address)?), - QueryMsg::MintDiscountAmount {} => to_binary(&query_mint_discount_amount(deps)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), + QueryMsg::IncludesAddress { address } => { + to_json_binary(&query_includes_address(deps, address)?) + } + QueryMsg::MintCount { address } => to_json_binary(&query_mint_count(deps, address)?), + QueryMsg::Admins {} => to_json_binary(&query_admins(deps)?), + QueryMsg::AddressCount {} => to_json_binary(&query_address_count(deps)?), + QueryMsg::PerAddressLimit {} => to_json_binary(&query_per_address_limit(deps)?), + QueryMsg::IsProcessable { address } => { + to_json_binary(&query_is_processable(deps, address)?) + } + QueryMsg::MintDiscountAmount {} => to_json_binary(&query_mint_discount_amount(deps)?), } } diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs index b1b525ca..732e409c 100644 --- a/contracts/whitelist-updatable-flatrate/src/helpers.rs +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, + to_json_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, }; use sg_std::CosmosMsg; @@ -19,7 +19,7 @@ impl WhitelistUpdatableFlatrateContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -37,7 +37,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn includes(&self, querier: &QuerierWrapper, address: String) -> StdResult { let includes: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::IncludesAddress { address })?, + msg: to_json_binary(&QueryMsg::IncludesAddress { address })?, }))?; Ok(includes) } @@ -45,7 +45,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn config(&self, querier: &QuerierWrapper) -> StdResult { let res: Config = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Config {})?, + msg: to_json_binary(&QueryMsg::Config {})?, }))?; Ok(res) @@ -54,7 +54,7 @@ impl WhitelistUpdatableFlatrateContract { pub fn mint_discount_amount(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::MintDiscountAmount {})?, + msg: to_json_binary(&QueryMsg::MintDiscountAmount {})?, })) } } diff --git a/contracts/whitelist-updatable/src/contract.rs b/contracts/whitelist-updatable/src/contract.rs index 44de4067..ca0e157f 100644 --- a/contracts/whitelist-updatable/src/contract.rs +++ b/contracts/whitelist-updatable/src/contract.rs @@ -2,7 +2,7 @@ use crate::state::{Config, CONFIG, TOTAL_ADDRESS_COUNT, WHITELIST}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, + to_json_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, Event, MessageInfo, Order, StdError, StdResult, }; use cw2::set_contract_version; @@ -247,14 +247,18 @@ pub fn execute_purge(deps: DepsMut, info: MessageInfo) -> Result StdResult { match msg { - QueryMsg::Config {} => to_binary(&query_config(deps)?), - QueryMsg::IncludesAddress { address } => to_binary(&query_includes_address(deps, address)?), - QueryMsg::MintCount { address } => to_binary(&query_mint_count(deps, address)?), - QueryMsg::Admin {} => to_binary(&query_admin(deps)?), - QueryMsg::AddressCount {} => to_binary(&query_address_count(deps)?), - QueryMsg::PerAddressLimit {} => to_binary(&query_per_address_limit(deps)?), - QueryMsg::IsProcessable { address } => to_binary(&query_is_processable(deps, address)?), - QueryMsg::MintDiscountPercent {} => to_binary(&query_mint_discount_percent(deps)?), + QueryMsg::Config {} => to_json_binary(&query_config(deps)?), + QueryMsg::IncludesAddress { address } => { + to_json_binary(&query_includes_address(deps, address)?) + } + QueryMsg::MintCount { address } => to_json_binary(&query_mint_count(deps, address)?), + QueryMsg::Admin {} => to_json_binary(&query_admin(deps)?), + QueryMsg::AddressCount {} => to_json_binary(&query_address_count(deps)?), + QueryMsg::PerAddressLimit {} => to_json_binary(&query_per_address_limit(deps)?), + QueryMsg::IsProcessable { address } => { + to_json_binary(&query_is_processable(deps, address)?) + } + QueryMsg::MintDiscountPercent {} => to_json_binary(&query_mint_discount_percent(deps)?), } } diff --git a/contracts/whitelist-updatable/src/helpers.rs b/contracts/whitelist-updatable/src/helpers.rs index 459b9ea5..9df785c0 100644 --- a/contracts/whitelist-updatable/src/helpers.rs +++ b/contracts/whitelist-updatable/src/helpers.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, + to_json_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, }; use sg_std::CosmosMsg; @@ -19,7 +19,7 @@ impl WhitelistUpdatableContract { } pub fn call>(&self, msg: T) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -37,7 +37,7 @@ impl WhitelistUpdatableContract { pub fn includes(&self, querier: &QuerierWrapper, address: String) -> StdResult { let includes: bool = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::IncludesAddress { address })?, + msg: to_json_binary(&QueryMsg::IncludesAddress { address })?, }))?; Ok(includes) } @@ -45,7 +45,7 @@ impl WhitelistUpdatableContract { pub fn config(&self, querier: &QuerierWrapper) -> StdResult { let res: Config = querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::Config {})?, + msg: to_json_binary(&QueryMsg::Config {})?, }))?; Ok(res) @@ -54,7 +54,7 @@ impl WhitelistUpdatableContract { pub fn mint_discount_percent(&self, querier: &QuerierWrapper) -> StdResult> { querier.query(&QueryRequest::Wasm(WasmQuery::Smart { contract_addr: self.addr().into(), - msg: to_binary(&QueryMsg::MintDiscountPercent {})?, + msg: to_json_binary(&QueryMsg::MintDiscountPercent {})?, })) } } diff --git a/packages/sg-name/src/lib.rs b/packages/sg-name/src/lib.rs index 3276b7f2..dee4d3eb 100644 --- a/packages/sg-name/src/lib.rs +++ b/packages/sg-name/src/lib.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_vec, Addr}; +use cosmwasm_std::{to_json_vec, Addr}; pub const MAX_TEXT_LENGTH: u32 = 512; @@ -13,7 +13,7 @@ pub struct NFT { impl NFT { pub fn into_json_string(self: &NFT) -> String { - String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() } } @@ -34,7 +34,7 @@ impl TextRecord { } pub fn into_json_string(self: &TextRecord) -> String { - String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() } } @@ -53,7 +53,7 @@ impl Metadata { // and represent it as a type. Note that we have to use the CosmWasm fork // of serde_json to avoid floats. pub fn into_json_string(self: &Metadata) -> String { - String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default() + String::from_utf8(to_json_vec(&self).unwrap_or_default()).unwrap_or_default() } } From 663394a2c6e4020054d9b90942cf541ac720991d Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Wed, 10 Apr 2024 06:56:37 -0800 Subject: [PATCH 75/91] fix bad merge from base branch --- contracts/marketplace/src/query.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index 0ab389af..38cce4c2 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -57,7 +57,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { QueryMsg::AskRenewalPrices { current_time, token_ids, - } => to_binary(&query_ask_renew_prices(deps, current_time, token_ids)?), + } => to_json_binary(&query_ask_renew_prices(deps, current_time, token_ids)?), QueryMsg::Bid { token_id, bidder } => { to_json_binary(&query_bid(deps, token_id, api.addr_validate(&bidder)?)?) } From f781a7e735939c3277fc2536c8c8280b1791b51c Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Fri, 12 Apr 2024 07:10:48 -0800 Subject: [PATCH 76/91] remove unused import --- contracts/whitelist-updatable-flatrate/src/helpers.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/whitelist-updatable-flatrate/src/helpers.rs b/contracts/whitelist-updatable-flatrate/src/helpers.rs index db835779..37cdb1b6 100644 --- a/contracts/whitelist-updatable-flatrate/src/helpers.rs +++ b/contracts/whitelist-updatable-flatrate/src/helpers.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - to_json_binary, Addr, Decimal, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, + to_json_binary, Addr, QuerierWrapper, QueryRequest, StdResult, WasmMsg, WasmQuery, }; use sg_std::CosmosMsg; From 61694ce86d244a559b5033d72db6735b78771768 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Fri, 12 Apr 2024 07:11:08 -0800 Subject: [PATCH 77/91] commit clippy autofix --- contracts/name-minter/src/contract.rs | 4 ++-- contracts/name-minter/src/state.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 8e384d11..199f2c9b 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -10,9 +10,9 @@ use cw2::set_contract_version; use cw721_base::MintMsg; use cw_utils::{maybe_addr, must_pay, parse_reply_instantiate_data}; use name_marketplace::msg::ExecuteMsg as MarketplaceExecuteMsg; -use schemars::JsonSchema; + use semver::Version; -use serde::{Deserialize, Serialize}; + use sg721::{CollectionInfo, InstantiateMsg as Sg721InstantiateMsg}; use sg721_name::msg::{ ExecuteMsg as NameCollectionExecuteMsg, InstantiateMsg as NameCollectionInstantiateMsg, diff --git a/contracts/name-minter/src/state.rs b/contracts/name-minter/src/state.rs index eff09504..98e25508 100644 --- a/contracts/name-minter/src/state.rs +++ b/contracts/name-minter/src/state.rs @@ -1,9 +1,9 @@ use cosmwasm_std::Addr; use cw_controllers::Admin; use cw_storage_plus::Item; -use serde::{Deserialize, Serialize}; + use sg_name_minter::{Config, SudoParams}; -use whitelist_updatable::helpers::WhitelistUpdatableContract; + use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; pub const SUDO_PARAMS: Item = Item::new("params"); From 78cfb76d0111d74defbb81504c6b94e2cfa71b22 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Fri, 12 Apr 2024 07:15:38 -0800 Subject: [PATCH 78/91] remove unused import from test --- contracts/name-minter/src/contract.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 199f2c9b..b8031215 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -431,7 +431,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result Date: Thu, 25 Apr 2024 18:03:17 -0800 Subject: [PATCH 79/91] fix cargo merge conflict issues --- Cargo.lock | 187 +++++++++++++++++++++++++++++------------------------ Cargo.toml | 10 +-- 2 files changed, 107 insertions(+), 90 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b9d11feb..37280f1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,15 +15,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "base16ct" -version = "0.2.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base16ct" @@ -49,12 +49,6 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - [[package]] name = "block-buffer" version = "0.9.0" @@ -87,9 +81,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cfg-if" @@ -105,9 +99,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cosmwasm-crypto" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" +checksum = "e6b4c3f9c4616d6413d4b5fc4c270a4cc32a374b9be08671e80e1a019f805d8f" dependencies = [ "digest 0.10.7", "ecdsa 0.16.9", @@ -119,18 +113,18 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" +checksum = "c586ced10c3b00e809ee664a895025a024f60d65d34fe4c09daed4a4db68a3f3" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" +checksum = "8467874827d384c131955ff6f4d47d02e72a956a08eb3c0ff24f8c903a5517b4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -141,9 +135,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" +checksum = "f6db85d98ac80922aef465e564d5b21fa9cfac5058cb62df7f116c3682337393" dependencies = [ "proc-macro2", "quote", @@ -152,9 +146,9 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" +checksum = "712fe58f39d55c812f7b2c84e097cdede3a39d520f89b6dc3153837e31741927" dependencies = [ "base64", "bech32", @@ -193,6 +187,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -283,13 +289,13 @@ dependencies = [ [[package]] name = "cw-utils" -version = "1.0.3" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +checksum = "d6a84c6c1c0acc3616398eba50783934bd6c964bad6974241eaee3460c8f5b26" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw2 1.1.2", + "cw2 0.16.0", "schemars", "semver", "serde", @@ -297,31 +303,31 @@ dependencies = [ ] [[package]] -name = "cw2" -version = "0.16.0" +name = "cw-utils" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 0.16.0", + "cw2 1.1.2", "schemars", + "semver", "serde", + "thiserror", ] [[package]] name = "cw2" -version = "1.1.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" +checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 1.2.0", + "cw-storage-plus 0.16.0", "schemars", - "semver", "serde", - "thiserror", ] [[package]] @@ -369,6 +375,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "der" version = "0.7.9" @@ -417,13 +433,25 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + [[package]] name = "ecdsa" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der 0.7.8", + "der 0.7.9", "digest 0.10.7", "elliptic-curve 0.13.8", "rfc6979 0.4.0", @@ -448,15 +476,15 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "elliptic-curve" -version = "0.13.8" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ "base16ct 0.1.1", "crypto-bigint 0.4.9", @@ -539,9 +567,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", @@ -615,15 +643,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "k256" -version = "0.13.1" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" dependencies = [ "cfg-if", "ecdsa 0.14.8", @@ -661,7 +689,7 @@ dependencies = [ "cw-storage-macro", "cw-storage-plus 0.16.0", "cw-utils 0.16.0", - "cw2 0.16.0", + "cw2 1.1.2", "cw721", "cw721-base", "schemars", @@ -690,7 +718,7 @@ dependencies = [ "cw-storage-macro", "cw-storage-plus 0.16.0", "cw-utils 0.16.0", - "cw2 0.16.0", + "cw2 1.1.2", "cw721", "cw721-base", "name-marketplace", @@ -718,9 +746,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "percent-encoding" @@ -730,9 +758,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pkcs8" -version = "0.10.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" dependencies = [ "der 0.6.1", "spki 0.6.0", @@ -744,15 +772,15 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.8", + "der 0.7.9", "spki 0.7.3", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -782,9 +810,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -812,7 +840,7 @@ checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint 0.4.9", "hmac", - "subtle", + "zeroize", ] [[package]] @@ -857,9 +885,9 @@ dependencies = [ [[package]] name = "sec1" -version = "0.7.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ "base16ct 0.1.1", "der 0.6.1", @@ -876,7 +904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct 0.2.0", - "der 0.7.8", + "der 0.7.9", "generic-array", "pkcs8 0.10.2", "subtle", @@ -891,9 +919,9 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] @@ -931,9 +959,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -1094,7 +1122,7 @@ dependencies = [ "cw-controllers", "cw-storage-plus 0.16.0", "cw-utils 0.16.0", - "cw2 0.16.0", + "cw2 1.1.2", "cw721", "cw721-base", "schemars", @@ -1155,9 +1183,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" dependencies = [ "base64ct", "der 0.6.1", @@ -1170,7 +1198,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der 0.7.8", + "der 0.7.9", ] [[package]] @@ -1205,17 +1233,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn" -version = "2.0.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.60" @@ -1229,18 +1246,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", @@ -1322,7 +1339,7 @@ dependencies = [ "cw-multi-test", "cw-storage-plus 0.16.0", "cw-utils 0.16.0", - "cw2 0.16.0", + "cw2 1.1.2", "name-minter", "schemars", "semver", @@ -1346,7 +1363,7 @@ dependencies = [ "cw-multi-test", "cw-storage-plus 0.16.0", "cw-utils 0.16.0", - "cw2 0.16.0", + "cw2 1.1.2", "name-minter", "schemars", "semver", diff --git a/Cargo.toml b/Cargo.toml index cb74583d..a1f138b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,11 +31,11 @@ sg-metadata = "0.22.9" sg-multi-test = "0.22.9" sg-std = "0.22.9" thiserror = "1.0.31" -sg-name-common = { version = "1.2.5", path = "./packages/sg-name-common" } -sg-name = { version = "1.2.5", path = "./packages/sg-name" } -sg-name-market = { version = "1.2.5", path = "./packages/sg-name-market" } -sg-name-minter = { version = "1.2.5", path = "./packages/sg-name-minter" } -name-marketplace = { version = "1.2.5", path = "./contracts/marketplace", features = ["library"] } +sg-name-common = { path = "./packages/sg-name-common" } +sg-name = { path = "./packages/sg-name" } +sg-name-market = { path = "./packages/sg-name-market" } +sg-name-minter = { path = "./packages/sg-name-minter" } +name-marketplace = { path = "./contracts/marketplace", features = ["library"] } name-minter = { path = "./contracts/name-minter", features = ["library"] } sg721-name = { path = "./contracts/sg721-name", features = ["library"] } From 5e50c1ccd65d5969e9a52166b5160b69fe83b257 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Thu, 25 Apr 2024 18:08:15 -0800 Subject: [PATCH 80/91] address linting issues from clippy --- contracts/marketplace/src/helpers.rs | 2 +- contracts/name-minter/src/contract.rs | 4 ++-- contracts/sg721-name/src/contract.rs | 2 +- .../whitelist-updatable-flatrate/src/integration_tests.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/marketplace/src/helpers.rs b/contracts/marketplace/src/helpers.rs index 3953542f..d8033e16 100644 --- a/contracts/marketplace/src/helpers.rs +++ b/contracts/marketplace/src/helpers.rs @@ -209,7 +209,7 @@ fn sell_name( deps.as_ref(), ask.clone(), bid.amount, - bid.bidder.clone(), + bid.bidder, &mut response, )?; diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index b8031215..c0ec2314 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -178,7 +178,7 @@ pub fn execute_mint_and_list( .unwrap_or(None); let price = validate_payment(name.len(), &info, params.base_price.u128(), discount)?; - if price.clone().is_some() { + if price.is_some() { charge_fees( &mut res, params.fair_burn_percent, @@ -216,7 +216,7 @@ pub fn execute_mint_and_list( .add_attribute("owner", sender) .add_attribute( "price", - price.unwrap_or(coin(0, NATIVE_DENOM)).amount.to_string(), + price.unwrap_or_else(|| coin(0, NATIVE_DENOM)).amount.to_string(), ); Ok(res .add_event(event) diff --git a/contracts/sg721-name/src/contract.rs b/contracts/sg721-name/src/contract.rs index aaaa4c80..408735dd 100644 --- a/contracts/sg721-name/src/contract.rs +++ b/contracts/sg721-name/src/contract.rs @@ -615,7 +615,7 @@ fn validate_address(deps: Deps, sender: &Addr, addr: Addr) -> Result Date: Thu, 25 Apr 2024 18:13:07 -0800 Subject: [PATCH 81/91] cargo fmt fix --- contracts/name-minter/src/contract.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index c0ec2314..1612ec5c 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -216,7 +216,10 @@ pub fn execute_mint_and_list( .add_attribute("owner", sender) .add_attribute( "price", - price.unwrap_or_else(|| coin(0, NATIVE_DENOM)).amount.to_string(), + price + .unwrap_or_else(|| coin(0, NATIVE_DENOM)) + .amount + .to_string(), ); Ok(res .add_event(event) From 3c94c426c65bed45b1ae51aa0b534045cb915fca Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 29 Apr 2024 15:42:34 -0800 Subject: [PATCH 82/91] update workspace optimizer version in script --- scripts/optimize.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/optimize.sh b/scripts/optimize.sh index 1e9c51ac..30407c6b 100755 --- a/scripts/optimize.sh +++ b/scripts/optimize.sh @@ -1,4 +1,4 @@ docker run --rm -v "$(pwd)":/code --platform linux/amd64 \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/workspace-optimizer:0.12.9 + cosmwasm/workspace-optimizer:0.14.0 From ace3b8305a2277bd9b7fbef8c1ef41bc3080874d Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 12 May 2024 22:28:27 -0800 Subject: [PATCH 83/91] add support for multiple whitelist types --- contracts/name-minter/src/contract.rs | 145 ++++++++++++++---- .../name-minter/src/integration_tests.rs | 5 + contracts/name-minter/src/msg.rs | 7 +- contracts/name-minter/src/query.rs | 2 +- contracts/name-minter/src/state.rs | 15 +- 5 files changed, 138 insertions(+), 36 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index 1612ec5c..e7800742 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -21,12 +21,14 @@ use sg_name::{Metadata, SgNameExecuteMsg}; use sg_name_common::{charge_fees, SECONDS_PER_YEAR}; use sg_name_minter::{Config, SudoParams, PUBLIC_MINT_START_TIME_IN_SECONDS}; use sg_std::{Response, SubMsg, NATIVE_DENOM}; +use whitelist_updatable::helpers::WhitelistUpdatableContract; use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; use crate::error::ContractError; use crate::msg::{ExecuteMsg, InstantiateMsg}; use crate::state::{ - ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, PAUSED, SUDO_PARAMS, WHITELISTS, + WhitelistContract, WhitelistContractType, ADMIN, CONFIG, NAME_COLLECTION, NAME_MARKETPLACE, + PAUSED, SUDO_PARAMS, WHITELISTS, }; // version info for migration info @@ -54,7 +56,10 @@ pub fn instantiate( .whitelists .iter() .filter_map(|addr| api.addr_validate(addr).ok()) - .map(WhitelistUpdatableFlatrateContract) + .map(|addr| WhitelistContract { + contract_type: WhitelistContractType::UpdatableFlatrateDiscount, + addr, + }) .collect::>(); WHITELISTS.save(deps.storage, &lists)?; @@ -99,6 +104,7 @@ pub fn instantiate( verifier: msg.verifier, base_init_msg: collection_init_msg, }; + let wasm_msg = WasmMsg::Instantiate { code_id: msg.collection_code_id, msg: to_json_binary(&name_collection_init_msg)?, @@ -129,7 +135,10 @@ pub fn execute( Ok(ADMIN.execute_update_admin(deps, info, maybe_addr(api, admin)?)?) } ExecuteMsg::Pause { pause } => execute_pause(deps, info, pause), - ExecuteMsg::AddWhitelist { address } => execute_add_whitelist(deps, info, address), + ExecuteMsg::AddWhitelist { + address, + whitelist_type, + } => execute_add_whitelist(deps, info, address, whitelist_type), ExecuteMsg::RemoveWhitelist { address } => execute_remove_whitelist(deps, info, address), ExecuteMsg::UpdateConfig { config } => execute_update_config(deps, info, env, config), } @@ -157,25 +166,63 @@ pub fn execute_mint_and_list( // Assumes no duplicate addresses between whitelists // Otherwise there will be edge cases with per addr limit between the whitelists - let list = whitelists.iter().find(|whitelist| { - whitelist - .includes(&deps.querier, sender.to_string()) - .unwrap_or(false) - }); + let list = whitelists + .iter() + .find(|whitelist| match whitelist.contract_type { + WhitelistContractType::UpdatableFlatrateDiscount => { + let contract = WhitelistUpdatableFlatrateContract(whitelist.addr.clone()); + contract + .includes(&deps.querier, sender.to_string()) + .unwrap_or(false) + } + WhitelistContractType::UpdatablePercentDiscount => { + let contract = WhitelistUpdatableContract(whitelist.addr.clone()); + contract + .includes(&deps.querier, sender.to_string()) + .unwrap_or(false) + } + }); // if not on any whitelist, check public mint start time if list.is_none() && env.block.time < config.public_mint_start_time { return Err(ContractError::MintingNotStarted {}); } - let discount = list - .map(|list| { - res.messages - .push(SubMsg::new(list.process_address(sender)?)); - list.mint_discount_amount(&deps.querier) - }) - .transpose()? - .unwrap_or(None); + for list in list.iter() { + match list.contract_type { + WhitelistContractType::UpdatableFlatrateDiscount => { + let contract = WhitelistUpdatableFlatrateContract(list.addr.clone()); + res.messages + .push(SubMsg::new(contract.process_address(sender)?)); + } + WhitelistContractType::UpdatablePercentDiscount => { + let contract = WhitelistUpdatableContract(list.addr.clone()); + res.messages + .push(SubMsg::new(contract.process_address(sender)?)); + } + } + } + + let discount = list.map(|list| match list.contract_type { + WhitelistContractType::UpdatableFlatrateDiscount => { + let contract = WhitelistUpdatableFlatrateContract(list.addr.clone()); + return Discount::Flatrate( + contract + .mint_discount_amount(&deps.querier) + .unwrap() + .unwrap(), + ); + } + WhitelistContractType::UpdatablePercentDiscount => { + let contract = WhitelistUpdatableContract(list.addr.clone()); + return Discount::Percent( + contract + .mint_discount_percent(&deps.querier) + .unwrap() + .unwrap(), + ); + } + }); let price = validate_payment(name.len(), &info, params.base_price.u128(), discount)?; if price.is_some() { @@ -245,6 +292,7 @@ pub fn execute_add_whitelist( deps: DepsMut, info: MessageInfo, address: String, + whitelist_type: String, ) -> Result { ADMIN.assert_admin(deps.as_ref(), &info.sender)?; @@ -254,7 +302,21 @@ pub fn execute_add_whitelist( .map(WhitelistUpdatableFlatrateContract)?; let mut lists = WHITELISTS.load(deps.storage)?; - lists.push(whitelist); + match whitelist_type.as_str() { + "FlatrateDiscount" => { + lists.push(WhitelistContract { + contract_type: WhitelistContractType::UpdatableFlatrateDiscount, + addr: whitelist.addr(), + }); + } + "PercentDiscount" => { + lists.push(WhitelistContract { + contract_type: WhitelistContractType::UpdatablePercentDiscount, + addr: whitelist.addr(), + }); + } + _ => return Err(ContractError::InvalidWhitelistType {}), + } WHITELISTS.save(deps.storage, &lists)?; @@ -271,7 +333,7 @@ pub fn execute_remove_whitelist( let whitelist = deps.api.addr_validate(&address)?; let mut lists = WHITELISTS.load(deps.storage)?; - lists.retain(|addr| addr.addr() != whitelist); + lists.retain(|whitelist_contract| whitelist_contract.addr != whitelist); WHITELISTS.save(deps.storage, &lists)?; @@ -327,11 +389,16 @@ fn validate_name(name: &str, min: u32, max: u32) -> Result<(), ContractError> { Ok(()) } +pub enum Discount { + Flatrate(u64), + Percent(Decimal), +} + fn validate_payment( name_len: usize, info: &MessageInfo, base_price: u128, - discount: Option, + discount: Option, ) -> Result, ContractError> { // Because we know we are left with ASCII chars, a simple byte count is enough let mut amount: Uint128 = (match name_len { @@ -344,15 +411,22 @@ fn validate_payment( }) .into(); - if let Some(discount_value) = discount { - let discount_amount = Uint128::from(discount_value); - // TODO: should we handle the case where discount > amount (eg 1,000 discount but buying a 100 name) - if amount.ge(&discount_amount) { - amount = amount - .checked_sub(discount_amount) - .map_err(|_| StdError::generic_err("invalid discount amount"))?; + match discount { + Some(Discount::Flatrate(discount)) => { + let discount = Uint128::from(discount); + if amount.ge(&discount) { + amount = amount + .checked_sub(discount) + .map_err(|_| StdError::generic_err("invalid discount amount"))?; + } + } + Some(Discount::Percent(discount)) => { + amount = amount * (Decimal::one() - discount); + } + None => { + amount = amount; + } } - } if amount.is_zero() { return Ok(None); @@ -436,7 +510,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result StdResult { fn query_whitelists(deps: Deps) -> StdResult> { let whitelists = WHITELISTS.load(deps.storage)?; - Ok(whitelists.iter().map(|w| w.addr()).collect()) + Ok(whitelists.iter().map(|w| w.addr.clone()).collect()) } fn query_collection(deps: Deps) -> StdResult { diff --git a/contracts/name-minter/src/state.rs b/contracts/name-minter/src/state.rs index 98e25508..62175337 100644 --- a/contracts/name-minter/src/state.rs +++ b/contracts/name-minter/src/state.rs @@ -2,10 +2,23 @@ use cosmwasm_std::Addr; use cw_controllers::Admin; use cw_storage_plus::Item; +use serde::{Deserialize, Serialize}; use sg_name_minter::{Config, SudoParams}; use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; +#[derive(Serialize, Deserialize)] +pub struct WhitelistContract { + pub contract_type: WhitelistContractType, + pub addr: Addr, +} + +#[derive(Serialize, Deserialize, PartialEq)] +pub enum WhitelistContractType { + UpdatableFlatrateDiscount, + UpdatablePercentDiscount, +} + pub const SUDO_PARAMS: Item = Item::new("params"); pub const NAME_COLLECTION: Item = Item::new("name-collection"); @@ -15,7 +28,7 @@ pub const NAME_MARKETPLACE: Item = Item::new("name-marketplace"); pub const ADMIN: Admin = Admin::new("admin"); /// Can only be updated by admin -pub const WHITELISTS: Item> = Item::new("whitelists"); +pub const WHITELISTS: Item> = Item::new("whitelists"); /// Controls if minting is paused or not by admin pub const PAUSED: Item = Item::new("paused"); From fa2769ba3a16d0bc4bd571c20a1adf7d7ef0f079 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 13 May 2024 00:09:18 -0800 Subject: [PATCH 84/91] fix linting errors and tests --- contracts/name-minter/src/contract.rs | 40 +++++++++---------- .../name-minter/src/integration_tests.rs | 2 +- contracts/name-minter/src/msg.rs | 2 - contracts/name-minter/src/state.rs | 4 +- .../src/integration_tests.rs | 3 ++ .../src/integration_tests.rs | 2 + packages/sg-name-minter/src/lib.rs | 5 ++- 7 files changed, 30 insertions(+), 28 deletions(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index e7800742..c43f7c67 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -188,7 +188,7 @@ pub fn execute_mint_and_list( return Err(ContractError::MintingNotStarted {}); } - for list in list.iter() { + if let Some(list) = list { match list.contract_type { WhitelistContractType::UpdatableFlatrateDiscount => { let contract = WhitelistUpdatableFlatrateContract(list.addr.clone()); @@ -206,21 +206,21 @@ pub fn execute_mint_and_list( let discount = list.map(|list| match list.contract_type { WhitelistContractType::UpdatableFlatrateDiscount => { let contract = WhitelistUpdatableFlatrateContract(list.addr.clone()); - return Discount::Flatrate( + Discount::Flatrate( contract .mint_discount_amount(&deps.querier) .unwrap() - .unwrap(), - ); + .unwrap_or(0u64), + ) } WhitelistContractType::UpdatablePercentDiscount => { let contract = WhitelistUpdatableContract(list.addr.clone()); - return Discount::Percent( + Discount::Percent( contract .mint_discount_percent(&deps.querier) .unwrap() - .unwrap(), - ); + .unwrap_or(Decimal::zero()), + ) } }); @@ -411,22 +411,20 @@ fn validate_payment( }) .into(); - match discount { - Some(Discount::Flatrate(discount)) => { - let discount = Uint128::from(discount); - if amount.ge(&discount) { - amount = amount - .checked_sub(discount) - .map_err(|_| StdError::generic_err("invalid discount amount"))?; - } - } - Some(Discount::Percent(discount)) => { - amount = amount * (Decimal::one() - discount); - } - None => { - amount = amount; + match discount { + Some(Discount::Flatrate(discount)) => { + let discount = Uint128::from(discount); + if amount.ge(&discount) { + amount = amount + .checked_sub(discount) + .map_err(|_| StdError::generic_err("invalid discount amount"))?; } } + Some(Discount::Percent(discount)) => { + amount = amount * (Decimal::one() - discount); + } + None => {} + } if amount.is_zero() { return Ok(None); diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 5e7bae6d..3c996b9d 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -214,7 +214,7 @@ fn instantiate_contracts( if let Some(admin) = admin { let msg = ExecuteMsg::AddWhitelist { address: wl.to_string(), - whitelist_type: "FlatrateDiscount".to_string() + whitelist_type: "FlatrateDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(admin), Addr::unchecked(minter), &msg, &[]); assert!(res.is_ok()); diff --git a/contracts/name-minter/src/msg.rs b/contracts/name-minter/src/msg.rs index 222b1250..a485a5db 100644 --- a/contracts/name-minter/src/msg.rs +++ b/contracts/name-minter/src/msg.rs @@ -2,8 +2,6 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{Addr, Uint128}; use sg_name_minter::{Config, SudoParams}; -use crate::state::{WhitelistContract, WhitelistContractType}; - #[cw_serde] pub struct InstantiateMsg { /// Temporary admin for managing whitelists diff --git a/contracts/name-minter/src/state.rs b/contracts/name-minter/src/state.rs index 62175337..4c7d86a3 100644 --- a/contracts/name-minter/src/state.rs +++ b/contracts/name-minter/src/state.rs @@ -5,15 +5,13 @@ use cw_storage_plus::Item; use serde::{Deserialize, Serialize}; use sg_name_minter::{Config, SudoParams}; -use whitelist_updatable_flatrate::helpers::WhitelistUpdatableFlatrateContract; - #[derive(Serialize, Deserialize)] pub struct WhitelistContract { pub contract_type: WhitelistContractType, pub addr: Addr, } -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Serialize, Deserialize, PartialEq, Eq)] pub enum WhitelistContractType { UpdatableFlatrateDiscount, UpdatablePercentDiscount, diff --git a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs index 5847a95b..365a3a79 100644 --- a/contracts/whitelist-updatable-flatrate/src/integration_tests.rs +++ b/contracts/whitelist-updatable-flatrate/src/integration_tests.rs @@ -151,6 +151,7 @@ mod tests { // add wl_addr to minter let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { address: wl_addr.to_string(), + whitelist_type: "FlatrateDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr.clone(), &msg, &[]); assert!(res.is_ok()); @@ -337,6 +338,7 @@ mod tests { // surpass limit let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { address: wl_addr.to_string(), + whitelist_type: "FlatrateDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr.clone(), &msg, &[]); assert!(res.is_ok()); @@ -457,6 +459,7 @@ mod tests { let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { address: wl_addr.to_string(), + whitelist_type: "FlatrateDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr, &msg, &[]); assert!(res.is_ok()); diff --git a/contracts/whitelist-updatable/src/integration_tests.rs b/contracts/whitelist-updatable/src/integration_tests.rs index 01f0809d..0506964e 100644 --- a/contracts/whitelist-updatable/src/integration_tests.rs +++ b/contracts/whitelist-updatable/src/integration_tests.rs @@ -149,6 +149,7 @@ mod tests { // add wl_addr to minter let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { address: wl_addr.to_string(), + whitelist_type: "FlatrateDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr.clone(), &msg, &[]); assert!(res.is_ok()); @@ -332,6 +333,7 @@ mod tests { // surpass limit let msg = sg_name_minter::SgNameMinterExecuteMsg::AddWhitelist { address: wl_addr.to_string(), + whitelist_type: "FlatrateDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(CREATOR), minter_addr.clone(), &msg, &[]); assert!(res.is_ok()); diff --git a/packages/sg-name-minter/src/lib.rs b/packages/sg-name-minter/src/lib.rs index f201bb39..6ded30e2 100644 --- a/packages/sg-name-minter/src/lib.rs +++ b/packages/sg-name-minter/src/lib.rs @@ -27,7 +27,10 @@ pub enum SgNameMinterExecuteMsg { /// Will be set to null after go-to-market UpdateAdmin { admin: Option }, /// Add a whiltelist address - AddWhitelist { address: String }, + AddWhitelist { + address: String, + whitelist_type: String, + }, /// Remove a whitelist address RemoveWhitelist { address: String }, /// Update config, only callable by admin From 4d8a6c0ba9563a481a9db8f1ceefd51952b94c8b Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 13 May 2024 00:11:36 -0800 Subject: [PATCH 85/91] gen schema --- contracts/name-minter/schema/name-minter.json | 6 +++++- ts/src/NameMinter.client.ts | 11 ++++++++--- ts/src/NameMinter.message-composer.ts | 11 ++++++++--- ts/src/NameMinter.types.ts | 1 + 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/contracts/name-minter/schema/name-minter.json b/contracts/name-minter/schema/name-minter.json index a7b7ce15..5d1a0ed9 100644 --- a/contracts/name-minter/schema/name-minter.json +++ b/contracts/name-minter/schema/name-minter.json @@ -151,11 +151,15 @@ "add_whitelist": { "type": "object", "required": [ - "address" + "address", + "whitelist_type" ], "properties": { "address": { "type": "string" + }, + "whitelist_type": { + "type": "string" } }, "additionalProperties": false diff --git a/ts/src/NameMinter.client.ts b/ts/src/NameMinter.client.ts index 21506aa9..4fdffd01 100644 --- a/ts/src/NameMinter.client.ts +++ b/ts/src/NameMinter.client.ts @@ -74,9 +74,11 @@ export interface NameMinterInterface extends NameMinterReadOnlyInterface { pause: boolean; }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; addWhitelist: ({ - address + address, + whitelistType }: { address: string; + whitelistType: string; }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; removeWhitelist: ({ address @@ -141,13 +143,16 @@ export class NameMinterClient extends NameMinterQueryClient implements NameMinte }, fee, memo, funds); }; addWhitelist = async ({ - address + address, + whitelistType }: { address: string; + whitelistType: string; }, fee: number | StdFee | "auto" = "auto", memo?: string, funds?: Coin[]): Promise => { return await this.client.execute(this.sender, this.contractAddress, { add_whitelist: { - address + address, + whitelist_type: whitelistType } }, fee, memo, funds); }; diff --git a/ts/src/NameMinter.message-composer.ts b/ts/src/NameMinter.message-composer.ts index 1bd88b55..a331419e 100644 --- a/ts/src/NameMinter.message-composer.ts +++ b/ts/src/NameMinter.message-composer.ts @@ -28,9 +28,11 @@ export interface NameMinterMessage { pause: boolean; }, funds?: Coin[]) => MsgExecuteContractEncodeObject; addWhitelist: ({ - address + address, + whitelistType }: { address: string; + whitelistType: string; }, funds?: Coin[]) => MsgExecuteContractEncodeObject; removeWhitelist: ({ address @@ -116,9 +118,11 @@ export class NameMinterMessageComposer implements NameMinterMessage { }; }; addWhitelist = ({ - address + address, + whitelistType }: { address: string; + whitelistType: string; }, funds?: Coin[]): MsgExecuteContractEncodeObject => { return { typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", @@ -127,7 +131,8 @@ export class NameMinterMessageComposer implements NameMinterMessage { contract: this.contractAddress, msg: toUtf8(JSON.stringify({ add_whitelist: { - address + address, + whitelist_type: whitelistType } })), funds diff --git a/ts/src/NameMinter.types.ts b/ts/src/NameMinter.types.ts index 181917e7..ed0a2f83 100644 --- a/ts/src/NameMinter.types.ts +++ b/ts/src/NameMinter.types.ts @@ -31,6 +31,7 @@ export type ExecuteMsg = { } | { add_whitelist: { address: string; + whitelist_type: string; }; } | { remove_whitelist: { From efcb44ddcae7ca1c39c8fea2c01ea66deb8cd49c Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 13 May 2024 08:26:55 -0800 Subject: [PATCH 86/91] add tests --- .../name-minter/src/integration_tests.rs | 97 ++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 3c996b9d..7ac18dad 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -2112,7 +2112,7 @@ mod whitelist { } #[test] - fn add_remove_whitelist() { + fn add_remove_flatrate_whitelist() { let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); let whitelists: Vec = app @@ -2143,6 +2143,39 @@ mod whitelist { assert_eq!(whitelists.len(), wl_count); } + + #[test] + fn add_remove_percent_whitelist() { + let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); + + let whitelists: Vec = app + .wrap() + .query_wasm_smart(MINTER, &(QueryMsg::Whitelists {})) + .unwrap(); + let wl_count = whitelists.len(); + let msg = ExecuteMsg::AddWhitelist { + address: "whitelist".to_string(), + whitelist_type: "PercentDiscount".to_string(), + }; + + let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); + assert!(res.is_ok()); + + let msg = QueryMsg::Whitelists {}; + let whitelists: Vec = app.wrap().query_wasm_smart(MINTER, &msg).unwrap(); + assert_eq!(whitelists.len(), wl_count + 1); + + let msg = ExecuteMsg::RemoveWhitelist { + address: "whitelist".to_string(), + }; + let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); + assert!(res.is_ok()); + + let msg = QueryMsg::Whitelists {}; + let whitelists: Vec = app.wrap().query_wasm_smart(MINTER, &msg).unwrap(); + assert_eq!(whitelists.len(), wl_count); + } + #[test] fn multiple_wl() { let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); @@ -2276,7 +2309,67 @@ mod whitelist { } #[test] - fn mint_from_whitelist() { + fn mint_from_incorrect_whitelist_type() { + let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); + + let msg = ExecuteMsg::AddWhitelist { + address: WHITELIST.to_string(), + whitelist_type: "FakeDiscount".to_string(), + }; + let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); + assert_eq!(res.is_ok(), false); + } + + #[test] + fn mint_from_percent_whitelist() { + let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); + + let msg = ExecuteMsg::AddWhitelist { + address: WHITELIST.to_string(), + whitelist_type: "PercentDiscount".to_string(), + }; + let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); + assert!(res.is_ok()); + + let msg = QueryMsg::Whitelists {}; + let whitelists: Vec = app.wrap().query_wasm_smart(MINTER, &msg).unwrap(); + assert_eq!(whitelists.len(), 2); + + let msg = WhitelistQueryMsg::AddressCount {}; + let wl_addr_count: u64 = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); + assert_eq!(wl_addr_count, 5); + + let msg = WhitelistExecuteMsg::AddAddresses { + addresses: vec![USER3.to_string()], + }; + let res = app.execute_contract( + Addr::unchecked(ADMIN2), + Addr::unchecked(WHITELIST), + &msg, + &[], + ); + assert!(res.is_ok()); + + let msg = WhitelistQueryMsg::Config {}; + let res: Config = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); + assert_eq!(res.admins, [ADMIN2.to_string()]); + + let msg = WhitelistQueryMsg::AddressCount {}; + let res: u64 = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); + assert_eq!(res, wl_addr_count + 1); + + let msg = WhitelistQueryMsg::IncludesAddress { + address: USER3.to_string(), + }; + let res: bool = app.wrap().query_wasm_smart(WHITELIST, &msg).unwrap(); + assert!(res); + + let res = mint_and_list(&mut app, NAME, USER3, None); + assert!(res.is_ok()); + } + + #[test] + fn mint_from_flatrate_whitelist() { let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); let msg = ExecuteMsg::AddWhitelist { From 6c5e4b59e568235b606ca975e0ea9532551d4403 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Mon, 13 May 2024 08:28:11 -0800 Subject: [PATCH 87/91] lint fix --- contracts/name-minter/src/integration_tests.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 7ac18dad..0c3eb475 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -2143,7 +2143,6 @@ mod whitelist { assert_eq!(whitelists.len(), wl_count); } - #[test] fn add_remove_percent_whitelist() { let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); From e9da5ce49f3ce27b74ffa74083a6f7b1ee0ba2cd Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Tue, 14 May 2024 20:43:20 -0800 Subject: [PATCH 88/91] more test coverage --- .../name-minter/src/integration_tests.rs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 0c3eb475..84ef566c 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -26,6 +26,7 @@ use sg_name_minter::{ SgNameMinterQueryMsg, SudoParams as NameMinterParams, PUBLIC_MINT_START_TIME_IN_SECONDS, }; use sg_std::{StargazeMsgWrapper, NATIVE_DENOM}; +use whitelist_updatable::msg::QueryMsg as PercentWhitelistQueryMsg; use whitelist_updatable_flatrate::msg::{ ExecuteMsg as WhitelistExecuteMsg, QueryMsg as WhitelistQueryMsg, }; @@ -64,6 +65,15 @@ pub fn contract_whitelist() -> Box> { Box::new(contract) } +pub fn contract_whitelist_percent() -> Box> { + let contract = ContractWrapper::new( + whitelist_updatable::contract::execute, + whitelist_updatable::contract::instantiate, + whitelist_updatable::contract::query, + ); + Box::new(contract) +} + // pub fn contract_nft() -> Box> { let contract = ContractWrapper::new( @@ -2307,6 +2317,52 @@ mod whitelist { assert!(res.is_ok()); } + #[test] + fn discount2() { + let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); + let wl_id = app.store_code(contract_whitelist_percent()); + + // instantiate wl2 + let msg = whitelist_updatable::msg::InstantiateMsg { + per_address_limit: PER_ADDRESS_LIMIT, + addresses: vec![ + "addr0001".to_string(), + "addr0002".to_string(), + USER.to_string(), + USER2.to_string(), + ADMIN2.to_string(), + ], + mint_discount_bps: Some(1000u64), + }; + + let wl2 = app + .instantiate_contract(wl_id, Addr::unchecked(ADMIN2), &msg, &[], "Whitelist", None) + .unwrap(); + + // add wl2 to minter + let msg = ExecuteMsg::AddWhitelist { + address: wl2.to_string(), + whitelist_type: "PercentDiscount".to_string(), + }; + let res = app.execute_contract( + Addr::unchecked(ADMIN.to_string()), + Addr::unchecked(MINTER.to_string()), + &msg, + &[], + ); + assert!(res.is_ok()); + + // mint and list with discount + // query discount, pass to mint_and_list + let discount: Decimal = app + .wrap() + .query_wasm_smart(wl2, &(PercentWhitelistQueryMsg::MintDiscountPercent {})) + .unwrap(); + let res = mint_and_list(&mut app, NAME, USER2, Some(discount)); + println!("result: {:?}", res); + assert!(res.is_ok()); + } + #[test] fn mint_from_incorrect_whitelist_type() { let mut app = instantiate_contracts(None, Some(ADMIN.to_string()), None); From d13e36f9f34976609b7a3e3ee9d79c50fe34cedd Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Tue, 14 May 2024 20:49:21 -0800 Subject: [PATCH 89/91] fix clippy gripe --- contracts/name-minter/src/integration_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 84ef566c..9fce720e 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -2372,7 +2372,7 @@ mod whitelist { whitelist_type: "FakeDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); - assert_eq!(res.is_ok(), false); + assert!(!res.is_ok()); } #[test] From 1d007208299b34267f7dc659866052482b0d764e Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Tue, 14 May 2024 20:50:56 -0800 Subject: [PATCH 90/91] wow, clippy is kind of a dick --- contracts/name-minter/src/integration_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/name-minter/src/integration_tests.rs b/contracts/name-minter/src/integration_tests.rs index 9fce720e..8ae256ab 100644 --- a/contracts/name-minter/src/integration_tests.rs +++ b/contracts/name-minter/src/integration_tests.rs @@ -2372,7 +2372,7 @@ mod whitelist { whitelist_type: "FakeDiscount".to_string(), }; let res = app.execute_contract(Addr::unchecked(ADMIN), Addr::unchecked(MINTER), &msg, &[]); - assert!(!res.is_ok()); + assert!(res.is_err()); } #[test] From 4766bd12966cbdaec20ae43bf9368ba5de7c5920 Mon Sep 17 00:00:00 2001 From: jason-c-child Date: Sun, 19 May 2024 22:08:00 -0800 Subject: [PATCH 91/91] add comment re: multiple WLs --- contracts/name-minter/src/contract.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/name-minter/src/contract.rs b/contracts/name-minter/src/contract.rs index c43f7c67..027cba11 100644 --- a/contracts/name-minter/src/contract.rs +++ b/contracts/name-minter/src/contract.rs @@ -165,7 +165,7 @@ pub fn execute_mint_and_list( // Assumes no duplicate addresses between whitelists // Otherwise there will be edge cases with per addr limit between the whitelists - + // currently this is going to match the _first_ WL they appear in... let list = whitelists .iter() .find(|whitelist| match whitelist.contract_type {