From 693c3547c0e2327a25592baae6a6e0a8969f2dba Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Mon, 9 May 2022 18:46:26 -0400 Subject: [PATCH 1/3] Fix include_inactive queries --- contracts/marketplace/src/msg.rs | 8 +-- contracts/marketplace/src/multitest.rs | 58 ++++++++++++------ contracts/marketplace/src/query.rs | 80 ++++++++++++++----------- contracts/marketplace/src/unit_tests.rs | 2 +- 4 files changed, 90 insertions(+), 58 deletions(-) diff --git a/contracts/marketplace/src/msg.rs b/contracts/marketplace/src/msg.rs index 89f28874..84866f2e 100644 --- a/contracts/marketplace/src/msg.rs +++ b/contracts/marketplace/src/msg.rs @@ -224,25 +224,25 @@ pub enum QueryMsg { /// Return type: `AsksResponse` Asks { collection: Collection, + include_inactive: Option, start_after: Option, limit: Option, - include_inactive: bool, }, /// Get all asks for a collection, sorted by price /// Return type: `AsksResponse` AsksSortedByPrice { collection: Collection, + include_inactive: Option, start_after: Option, limit: Option, - include_inactive: bool, }, /// Get all asks for a collection, sorted by price in reverse /// Return type: `AsksResponse` ReverseAsksSortedByPrice { collection: Collection, + include_inactive: Option, start_before: Option, limit: Option, - include_inactive: bool, }, /// Count of all asks /// Return type: `AskCountResponse` @@ -251,9 +251,9 @@ pub enum QueryMsg { /// Return type: `AsksResponse` AsksBySeller { seller: Seller, + include_inactive: Option, start_after: Option, limit: Option, - include_inactive: bool, }, /// Get data for a specific bid /// Return type: `BidResponse` diff --git a/contracts/marketplace/src/multitest.rs b/contracts/marketplace/src/multitest.rs index c2df245a..b527e076 100644 --- a/contracts/marketplace/src/multitest.rs +++ b/contracts/marketplace/src/multitest.rs @@ -637,9 +637,9 @@ fn try_query_asks() { // test before ask is made, without using pagination let query_asks_msg = QueryMsg::Asks { collection: collection.to_string(), + include_inactive: Some(true), start_after: None, limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -672,9 +672,9 @@ fn try_query_asks() { // test pagination, starting when tokens exist let query_asks_msg = QueryMsg::Asks { collection: collection.to_string(), + include_inactive: Some(true), start_after: Some(TOKEN_ID - 1), limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -685,9 +685,9 @@ fn try_query_asks() { // test pagination, starting when token don't exist let query_asks_msg = QueryMsg::Asks { collection: collection.to_string(), + include_inactive: Some(true), start_after: Some(TOKEN_ID), limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -781,9 +781,9 @@ fn try_query_sorted_asks() { let query_asks_msg = QueryMsg::AsksSortedByPrice { collection: collection.to_string(), + include_inactive: Some(true), start_after: None, limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -797,9 +797,9 @@ fn try_query_sorted_asks() { let start_after = AskOffset::new(res.asks[0].price, res.asks[0].token_id); let query_msg = QueryMsg::AsksSortedByPrice { collection: collection.to_string(), + include_inactive: Some(true), start_after: Some(start_after), limit: None, - include_inactive: true, }; let res: AsksResponse = router @@ -812,9 +812,9 @@ fn try_query_sorted_asks() { let reverse_query_asks_msg = QueryMsg::ReverseAsksSortedByPrice { collection: collection.to_string(), + include_inactive: Some(true), start_before: None, limit: None, - include_inactive: true, }; let res: AsksResponse = router @@ -829,9 +829,9 @@ fn try_query_sorted_asks() { let start_before = AskOffset::new(res.asks[0].price, res.asks[0].token_id); let reverse_query_asks_start_before_first_desc_msg = QueryMsg::ReverseAsksSortedByPrice { collection: collection.to_string(), + include_inactive: Some(true), start_before: Some(start_before), limit: None, - include_inactive: true, }; let res: AsksResponse = router @@ -954,9 +954,9 @@ fn try_query_asks_by_seller() { // owner1 should only have 1 token let query_asks_msg = QueryMsg::AsksBySeller { seller: owner.to_string(), + include_inactive: Some(true), start_after: None, limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -967,9 +967,9 @@ fn try_query_asks_by_seller() { // owner2 should have 2 token let query_asks_msg = QueryMsg::AsksBySeller { seller: owner2.to_string(), + include_inactive: Some(true), start_after: None, limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -980,12 +980,12 @@ fn try_query_asks_by_seller() { // owner2 should have 0 tokens when paginated by a non-existing collection let query_asks_msg = QueryMsg::AsksBySeller { seller: owner2.to_string(), + include_inactive: Some(true), start_after: Some(CollectionOffset::new( "non-existing-collection".to_string(), TOKEN_ID, )), limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -996,9 +996,9 @@ fn try_query_asks_by_seller() { // owner2 should have 2 tokens when paginated by a existing collection let query_asks_msg = QueryMsg::AsksBySeller { seller: owner2.to_string(), + include_inactive: Some(true), start_after: Some(CollectionOffset::new(collection.to_string(), 0)), limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -1009,9 +1009,9 @@ fn try_query_asks_by_seller() { // owner2 should have 1 token when paginated by a existing collection starting after a token let query_asks_msg = QueryMsg::AsksBySeller { seller: owner2.to_string(), + include_inactive: Some(true), start_after: Some(CollectionOffset::new(collection.to_string(), TOKEN_ID + 1)), limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() @@ -2559,7 +2559,7 @@ fn try_ask_with_filter_inactive() { let mut router = custom_mock_app(); // Setup intial accounts - let (_, _, creator) = setup_accounts(&mut router).unwrap(); + let (owner, _, creator) = setup_accounts(&mut router).unwrap(); // Instantiate and configure contracts let (marketplace, collection) = setup_contracts(&mut router, &creator).unwrap(); @@ -2582,14 +2582,38 @@ fn try_ask_with_filter_inactive() { let res = router.execute_contract(creator.clone(), marketplace.clone(), &set_ask, &[]); assert!(res.is_ok()); - // Move forward in time.. - setup_block_time(&mut router, 10000000000); + // transfer nft from creator to owner. Creates a stale ask that needs to be updated + transfer(&mut router, &creator, &owner, &collection, TOKEN_ID); + + let update_ask_state = ExecuteMsg::SyncAsk { + collection: collection.to_string(), + token_id: TOKEN_ID, + }; + let res = router.execute_contract( + Addr::unchecked("operator"), + marketplace.clone(), + &update_ask_state, + &[], + ); + assert!(res.is_ok()); + + let ask_msg = QueryMsg::Asks { + collection: collection.to_string(), + include_inactive: None, + start_after: None, + limit: None, + }; + let res: AsksResponse = router + .wrap() + .query_wasm_smart(marketplace.clone(), &ask_msg) + .unwrap(); + assert_eq!(res.asks.len(), 0); let ask_msg = QueryMsg::Asks { collection: collection.to_string(), + include_inactive: Some(false), start_after: None, limit: None, - include_inactive: false, }; let res: AsksResponse = router .wrap() @@ -2599,9 +2623,9 @@ fn try_ask_with_filter_inactive() { let ask_msg = QueryMsg::Asks { collection: collection.to_string(), + include_inactive: Some(true), start_after: None, limit: None, - include_inactive: true, }; let res: AsksResponse = router .wrap() diff --git a/contracts/marketplace/src/query.rs b/contracts/marketplace/src/query.rs index b0c5c495..183e1e16 100644 --- a/contracts/marketplace/src/query.rs +++ b/contracts/marketplace/src/query.rs @@ -29,51 +29,51 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { } => to_binary(&query_ask(deps, api.addr_validate(&collection)?, token_id)?), QueryMsg::Asks { collection, + include_inactive, start_after, limit, - include_inactive, } => to_binary(&query_asks( deps, api.addr_validate(&collection)?, + include_inactive, start_after, limit, - include_inactive, )?), QueryMsg::AsksSortedByPrice { collection, + include_inactive, start_after, limit, - include_inactive, } => to_binary(&query_asks_sorted_by_price( deps, api.addr_validate(&collection)?, + include_inactive, start_after, limit, - include_inactive, )?), QueryMsg::ReverseAsksSortedByPrice { collection, + include_inactive, start_before, limit, - include_inactive, } => to_binary(&reverse_query_asks_sorted_by_price( deps, api.addr_validate(&collection)?, + include_inactive, start_before, limit, - include_inactive, )?), QueryMsg::AsksBySeller { seller, + include_inactive, start_after, limit, - include_inactive, } => to_binary(&query_asks_by_seller( deps, api.addr_validate(&seller)?, + include_inactive, start_after, limit, - include_inactive, )?), QueryMsg::AskCount { collection } => { to_binary(&query_ask_count(deps, api.addr_validate(&collection)?)?) @@ -217,13 +217,13 @@ pub fn query_collections( pub fn query_asks( deps: Deps, collection: Addr, + include_inactive: Option, start_after: Option, limit: Option, - include_inactive: bool, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; - let mut asks = asks() + let asks = asks() .idx .collection .prefix(collection.clone()) @@ -236,24 +236,26 @@ pub fn query_asks( None, Order::Ascending, ) + .filter(|item| match item { + Ok((_, ask)) => match include_inactive { + Some(true) => true, + _ => ask.is_active, + }, + Err(_) => true, + }) .take(limit) .map(|res| res.map(|item| item.1)) .collect::>>()?; - asks = asks - .into_iter() - .filter(|a| a.is_active == include_inactive) - .collect::>(); - Ok(AsksResponse { asks }) } pub fn query_asks_sorted_by_price( deps: Deps, collection: Addr, + include_inactive: Option, start_after: Option, limit: Option, - include_inactive: bool, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; @@ -261,29 +263,31 @@ pub fn query_asks_sorted_by_price( Bound::exclusive((offset.price.u128(), ask_key(&collection, offset.token_id))) }); - let mut asks = asks() + let asks = asks() .idx .collection_price .sub_prefix(collection) .range(deps.storage, start, None, Order::Ascending) + .filter(|item| match item { + Ok((_, ask)) => match include_inactive { + Some(true) => true, + _ => ask.is_active, + }, + Err(_) => true, + }) .take(limit) .map(|res| res.map(|item| item.1)) .collect::>>()?; - asks = asks - .into_iter() - .filter(|a| a.is_active == include_inactive) - .collect::>(); - Ok(AsksResponse { asks }) } pub fn reverse_query_asks_sorted_by_price( deps: Deps, collection: Addr, + include_inactive: Option, start_before: Option, limit: Option, - include_inactive: bool, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; @@ -291,20 +295,22 @@ pub fn reverse_query_asks_sorted_by_price( Bound::exclusive((offset.price.u128(), ask_key(&collection, offset.token_id))) }); - let mut asks = asks() + let asks = asks() .idx .collection_price .sub_prefix(collection) .range(deps.storage, None, end, Order::Descending) + .filter(|item| match item { + Ok((_, ask)) => match include_inactive { + Some(true) => true, + _ => ask.is_active, + }, + Err(_) => true, + }) .take(limit) .map(|res| res.map(|item| item.1)) .collect::>>()?; - asks = asks - .into_iter() - .filter(|a| a.is_active == include_inactive) - .collect::>(); - Ok(AsksResponse { asks }) } @@ -322,9 +328,9 @@ pub fn query_ask_count(deps: Deps, collection: Addr) -> StdResult, start_after: Option, limit: Option, - include_inactive: bool, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_QUERY_LIMIT).min(MAX_QUERY_LIMIT) as usize; @@ -335,20 +341,22 @@ pub fn query_asks_by_seller( None }; - let mut asks = asks() + let asks = asks() .idx .seller .prefix(seller) .range(deps.storage, start, None, Order::Ascending) + .filter(|item| match item { + Ok((_, ask)) => match include_inactive { + Some(true) => true, + _ => ask.is_active, + }, + Err(_) => true, + }) .take(limit) .map(|res| res.map(|item| item.1)) .collect::>>()?; - asks = asks - .into_iter() - .filter(|a| a.is_active == include_inactive) - .collect::>(); - Ok(AsksResponse { asks }) } diff --git a/contracts/marketplace/src/unit_tests.rs b/contracts/marketplace/src/unit_tests.rs index d498cbbe..5671d025 100644 --- a/contracts/marketplace/src/unit_tests.rs +++ b/contracts/marketplace/src/unit_tests.rs @@ -65,7 +65,7 @@ fn ask_indexed_map() { let res = asks().load(deps.as_ref().storage, key); assert_eq!(res.unwrap(), ask); - let res = query_asks_by_seller(deps.as_ref(), seller, None, None, true).unwrap(); + let res = query_asks_by_seller(deps.as_ref(), seller, Some(true), None, None).unwrap(); assert_eq!(res.asks.len(), 2); assert_eq!(res.asks[0], ask); From 34a6886863e9698f008a3b8ee7cefac41bde5ab6 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Mon, 9 May 2022 20:19:34 -0400 Subject: [PATCH 2/3] Update schema --- contracts/marketplace/schema/query_msg.json | 30 +++++++++++++-------- types/contracts/marketplace/query_msg.d.ts | 8 +++--- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/contracts/marketplace/schema/query_msg.json b/contracts/marketplace/schema/query_msg.json index ccae79ca..008ffecc 100644 --- a/contracts/marketplace/schema/query_msg.json +++ b/contracts/marketplace/schema/query_msg.json @@ -68,15 +68,17 @@ "asks": { "type": "object", "required": [ - "collection", - "include_inactive" + "collection" ], "properties": { "collection": { "type": "string" }, "include_inactive": { - "type": "boolean" + "type": [ + "boolean", + "null" + ] }, "limit": { "type": [ @@ -109,15 +111,17 @@ "asks_sorted_by_price": { "type": "object", "required": [ - "collection", - "include_inactive" + "collection" ], "properties": { "collection": { "type": "string" }, "include_inactive": { - "type": "boolean" + "type": [ + "boolean", + "null" + ] }, "limit": { "type": [ @@ -152,15 +156,17 @@ "reverse_asks_sorted_by_price": { "type": "object", "required": [ - "collection", - "include_inactive" + "collection" ], "properties": { "collection": { "type": "string" }, "include_inactive": { - "type": "boolean" + "type": [ + "boolean", + "null" + ] }, "limit": { "type": [ @@ -216,12 +222,14 @@ "asks_by_seller": { "type": "object", "required": [ - "include_inactive", "seller" ], "properties": { "include_inactive": { - "type": "boolean" + "type": [ + "boolean", + "null" + ] }, "limit": { "type": [ diff --git a/types/contracts/marketplace/query_msg.d.ts b/types/contracts/marketplace/query_msg.d.ts index 1bbc5192..b36419ee 100644 --- a/types/contracts/marketplace/query_msg.d.ts +++ b/types/contracts/marketplace/query_msg.d.ts @@ -15,7 +15,7 @@ token_id: number } | { asks: { collection: string -include_inactive: boolean +include_inactive?: (boolean | null) limit?: (number | null) start_after?: (number | null) [k: string]: unknown @@ -23,7 +23,7 @@ start_after?: (number | null) } | { asks_sorted_by_price: { collection: string -include_inactive: boolean +include_inactive?: (boolean | null) limit?: (number | null) start_after?: (AskOffset | null) [k: string]: unknown @@ -31,7 +31,7 @@ start_after?: (AskOffset | null) } | { reverse_asks_sorted_by_price: { collection: string -include_inactive: boolean +include_inactive?: (boolean | null) limit?: (number | null) start_before?: (AskOffset | null) [k: string]: unknown @@ -43,7 +43,7 @@ collection: string } } | { asks_by_seller: { -include_inactive: boolean +include_inactive?: (boolean | null) limit?: (number | null) seller: string start_after?: (CollectionOffset | null) From 00347efffde69a59644b7621a88d28b51ea724c2 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Mon, 9 May 2022 20:21:07 -0400 Subject: [PATCH 3/3] Update version --- Cargo.lock | 2 +- contracts/marketplace/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dc2ec3cd..967eb48a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "sg-marketplace" -version = "0.14.4" +version = "0.15.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", diff --git a/contracts/marketplace/Cargo.toml b/contracts/marketplace/Cargo.toml index 223df722..4a2cb139 100644 --- a/contracts/marketplace/Cargo.toml +++ b/contracts/marketplace/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sg-marketplace" -version = "0.14.4" +version = "0.15.0" authors = [ "Shane Vitarana ", "Jake Hartnell ",