From 17cafde7b9141f34663caf4fceb029c3f8196e09 Mon Sep 17 00:00:00 2001 From: mr-t Date: Sun, 17 Mar 2024 22:38:13 +0100 Subject: [PATCH 01/20] migrate using royalty info from new cw721-base --- Cargo.lock | 114 ++---- Cargo.toml | 8 +- .../collections/sg721-base/examples/schema.rs | 28 +- .../collections/sg721-base/src/contract.rs | 380 +++++++----------- contracts/collections/sg721-base/src/error.rs | 2 +- contracts/collections/sg721-base/src/lib.rs | 55 ++- contracts/collections/sg721-base/src/msg.rs | 192 +++++---- contracts/collections/sg721-base/src/state.rs | 109 ++++- .../sg721-base/src/upgrades/v3_0_0.rs | 38 +- .../sg721-base/src/upgrades/v3_1_0.rs | 42 +- .../sg721-metadata-onchain/.cargo/config | 4 - .../sg721-metadata-onchain/Cargo.toml | 45 --- .../sg721-metadata-onchain/examples/schema.rs | 48 --- .../schema/all_nft_info_response.json | 252 ------------ .../schema/all_operators_response.json | 100 ----- .../schema/all_tokens_response.json | 18 - .../schema/approval_response.json | 97 ----- .../schema/approvals_response.json | 100 ----- .../schema/collection_info_response.json | 88 ---- .../schema/contract_info_response.json | 18 - .../schema/instantiate_msg.json | 112 ------ .../schema/minter_response.json | 15 - .../schema/nft_info_response.json | 124 ------ .../schema/num_tokens_response.json | 16 - .../schema/operators_response.json | 100 ----- .../schema/owner_of_response.json | 106 ----- .../schema/query_msg.json | 310 -------------- .../schema/tokens_response.json | 18 - .../sg721-metadata-onchain/src/lib.rs | 207 ---------- .../collections/sg721-nt/examples/schema.rs | 21 +- contracts/collections/sg721-nt/src/lib.rs | 54 ++- .../sg721-updatable/examples/schema.rs | 15 +- .../sg721-updatable/src/contract.rs | 26 +- .../collections/sg721-updatable/src/lib.rs | 13 +- .../collections/sg721-updatable/src/msg.rs | 28 +- contracts/minters/base-minter/src/contract.rs | 8 +- packages/sg721/Cargo.toml | 2 +- packages/sg721/src/lib.rs | 241 +++++++++-- test-suite/Cargo.toml | 2 +- .../base_minter/tests/integration_tests.rs | 21 +- .../complete_mint_all_outcomes_validation.rs | 13 +- .../src/sg721_base/tests/integration_tests.rs | 141 +++++-- .../src/vending_minter/tests/address_limit.rs | 10 +- .../src/vending_minter/tests/happy_unhappy.rs | 10 +- .../src/vending_minter/tests/trading_time.rs | 3 +- .../tests/trading_time_updatable.rs | 3 +- .../src/vending_minter/tests/updatable.rs | 7 +- .../src/vending_minter/tests/whitelist.rs | 10 +- .../vending_minter/tests/zero_mint_price.rs | 6 +- 49 files changed, 1047 insertions(+), 2333 deletions(-) delete mode 100644 contracts/collections/sg721-metadata-onchain/.cargo/config delete mode 100644 contracts/collections/sg721-metadata-onchain/Cargo.toml delete mode 100644 contracts/collections/sg721-metadata-onchain/examples/schema.rs delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/all_nft_info_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/all_operators_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/all_tokens_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/approval_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/approvals_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/collection_info_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/contract_info_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/instantiate_msg.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/minter_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/nft_info_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/num_tokens_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/operators_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/owner_of_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/query_msg.json delete mode 100644 contracts/collections/sg721-metadata-onchain/schema/tokens_response.json delete mode 100644 contracts/collections/sg721-metadata-onchain/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 07acbaaf0..ade1b2f55 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -309,8 +309,8 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "schemars", "serde", "sg-std", @@ -1002,8 +1002,7 @@ dependencies = [ [[package]] name = "cw-address-like" version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451a4691083a88a3c0630a8a88799e9d4cd6679b7ce8ff22b8da2873ff31d380" +source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=multiple_ownership#d40ce97bc1cc0e4870591ba8bf4a6160b1ae8b00" dependencies = [ "cosmwasm-std", ] @@ -1079,9 +1078,8 @@ dependencies = [ [[package]] name = "cw-ownable" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093dfb4520c48b5848274dd88ea99e280a04bc08729603341c7fb0d758c74321" +version = "0.6.0" +source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=multiple_ownership#d40ce97bc1cc0e4870591ba8bf4a6160b1ae8b00" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1094,9 +1092,8 @@ dependencies = [ [[package]] name = "cw-ownable-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d3bf2e0f341bb6cc100d7d441d31cf713fbd3ce0c511f91e79f14b40a889af" +version = "0.6.0" +source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=multiple_ownership#d40ce97bc1cc0e4870591ba8bf4a6160b1ae8b00" dependencies = [ "proc-macro2", "quote", @@ -1217,8 +1214,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a1ea6e6277bdd6dfc043a9b1380697fe29d6e24b072597439523658d21d791" +source = "git+https://github.com/CosmWasm/cw-nfts?tag=v0.16.0#2cad1d3e15e0a34d466a0b51e02c58b82ebe5ecd" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1241,39 +1237,33 @@ dependencies = [ ] [[package]] -name = "cw721-base" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77518e27431d43214cff4cdfbd788a7508f68d9b1f32389e6fce513e7eaccbef" +name = "cw721" +version = "0.19.0" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#a358c4c207894fb6fc73ff29c0723690eabadab4" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 0.16.0", - "cw-utils 0.16.0", - "cw2 0.16.0", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", "cw721 0.16.0", "schemars", "serde", "thiserror", + "url", ] [[package]] name = "cw721-base" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da518d9f68bfda7d972cbaca2e8fcf04651d0edc3de72b04ae2bcd9289c81614" +version = "0.19.0" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#a358c4c207894fb6fc73ff29c0723690eabadab4" dependencies = [ - "cosmwasm-schema", "cosmwasm-std", "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.16.0", - "schemars", + "cw721 0.19.0", "serde", - "thiserror", ] [[package]] @@ -1722,9 +1712,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -2128,9 +2118,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2465,7 +2455,7 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721-base 0.18.0", + "cw721-base", "open-edition-factory", "semver", "serde", @@ -2616,9 +2606,9 @@ checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" @@ -3628,7 +3618,7 @@ dependencies = [ "cw-multi-test 0.20.0", "cw-ownable", "cw-utils 1.0.3", - "cw721-base 0.18.0", + "cw721-base", "serde", "thiserror", ] @@ -3643,8 +3633,8 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "serde", "sg-std", "sg721", @@ -3652,24 +3642,6 @@ dependencies = [ "url", ] -[[package]] -name = "sg721-metadata-onchain" -version = "3.5.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-ownable", - "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", - "schemars", - "serde", - "sg-metadata", - "sg-std", - "sg721", - "sg721-base", -] - [[package]] name = "sg721-nt" version = "3.5.0" @@ -3678,8 +3650,8 @@ dependencies = [ "cosmwasm-std", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "schemars", "serde", "sg-std", @@ -3697,8 +3669,8 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "schemars", "semver", "serde", @@ -4080,8 +4052,8 @@ dependencies = [ "cw2 1.1.2", "cw4", "cw4-group", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "ethers-core", "ethers-signers", "eyre", @@ -4466,9 +4438,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -4523,8 +4495,8 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "rand_core 0.6.4", "rand_xoshiro", "schemars", @@ -4552,8 +4524,8 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "rand_core 0.6.4", "rand_xoshiro", "schemars", @@ -4582,8 +4554,8 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", + "cw721 0.19.0", + "cw721-base", "rand_core 0.6.4", "rand_xoshiro", "schemars", diff --git a/Cargo.toml b/Cargo.toml index 41445c084..a006f27e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,8 +27,8 @@ cw-controllers = "1.1.0" cw2 = "1.1.0" cw4 = "1.1.0" cw4-group = "1.1.0" -cw721 = "0.18.0" -cw721-base = "0.18.0" +cw721 = { git = "https://github.com/arkprotocol/cw-nfts.git", branch = "collection-info"} # TODO: switch to official repo once merged +cw721-base = { git = "https://github.com/arkprotocol/cw-nfts.git", branch = "collection-info"} # TODO: switch to official repo once merged cw-multi-test = "0.20.0" cw-storage-plus = "1.2.0" cw-utils = "1.0.1" @@ -50,7 +50,7 @@ sg-splits = { version = "3.5.0", path = "contracts/splits" } sg-std = { version = "3.2.0" } sg-whitelist = { version = "3.5.0", path = "contracts/whitelists/whitelist" } thiserror = "1.0.31" -url = "2.2.2" +url = "^2.5" sha2 = { version = "0.10.2", default-features = false } whitelist-mtree = { version = "3.5.0", path = "contracts/whitelists/whitelist-merkletree" } @@ -66,7 +66,7 @@ sg-eth-airdrop = { version = "3.5.0", path = "contracts/sg-eth-airdrop test-suite = { version = "3.5.0", path = "test-suite" } semver = "1" -cw-ownable = "0.5.1" +cw-ownable = { git = "https://github.com/public-awesome/cw-plus-plus.git", branch = "multiple_ownership"} # TODO: switch to official https://github.com/larry0x/cw-plus-plus once merged anybuf = "0.3.0" [profile.release.package.sg721] diff --git a/contracts/collections/sg721-base/examples/schema.rs b/contracts/collections/sg721-base/examples/schema.rs index 4f2f18f68..41e155f83 100644 --- a/contracts/collections/sg721-base/examples/schema.rs +++ b/contracts/collections/sg721-base/examples/schema.rs @@ -5,12 +5,17 @@ use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, s use cosmwasm_std::Empty; -use cw721::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, ContractInfoResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, +use cw721_base::{ + msg::{ + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, + NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, + }, + state::CollectionMetadata, + CollectionMetadataExtension, DefaultOptionCollectionMetadataExtension, + DefaultOptionNftMetadataExtension, RoyaltyInfo, }; -use cw721_base::MinterResponse; use sg721::InstantiateMsg; +#[allow(deprecated)] use sg721_base::msg::{CollectionInfoResponse, QueryMsg}; fn main() { @@ -20,8 +25,16 @@ fn main() { remove_schemas(&out_dir).unwrap(); export_schema(&schema_for!(InstantiateMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema( + &schema_for!(QueryMsg), + &out_dir, + ); + #[allow(deprecated)] export_schema(&schema_for!(CollectionInfoResponse), &out_dir); + export_schema( + &schema_for!(CollectionMetadata>), + &out_dir, + ); export_schema_with_title( &schema_for!(AllNftInfoResponse), &out_dir, @@ -37,7 +50,10 @@ fn main() { export_schema(&schema_for!(ApprovalResponse), &out_dir); export_schema(&schema_for!(ApprovalsResponse), &out_dir); export_schema(&schema_for!(OperatorsResponse), &out_dir); - export_schema(&schema_for!(ContractInfoResponse), &out_dir); + export_schema( + &schema_for!(CollectionMetadata), + &out_dir, + ); export_schema_with_title( &schema_for!(NftInfoResponse), &out_dir, diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 91dc05663..950b7b44f 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -1,46 +1,65 @@ -use cw721_base::state::TokenInfo; +use std::fmt::Debug; + +use cw721::msg::CollectionMetadataMsg; +use cw721::state::{MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_ROYALTY_SHARE_PCT}; +use cw721::traits::{Cw721CustomMsg, Cw721State}; +use cw721_base::msg::{CollectionMetadataExtensionMsg, Cw721InstantiateMsg, RoyaltyInfoResponse}; +use cw721_base::state::NftInfo; +use cw721_base::{ + traits::StateFactory, DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, +}; use url::Url; use cosmwasm_std::{ - to_json_binary, Addr, Binary, ContractInfoResponse, Decimal, Deps, DepsMut, Empty, Env, Event, - MessageInfo, Response, StdError, StdResult, Storage, Timestamp, WasmQuery, + to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Decimal, Deps, DepsMut, Empty, + Env, Event, MessageInfo, Response, StdError, StdResult, Storage, Timestamp, WasmQuery, }; -use cw721::{ContractInfoResponse as CW721ContractInfoResponse, Cw721Execute}; +use cw721_base::{execute::Cw721Execute, query::Cw721Query, state::CollectionMetadata}; use cw_utils::nonpayable; use serde::{de::DeserializeOwned, Serialize}; -use sg721::{ - CollectionInfo, ExecuteMsg, InstantiateMsg, RoyaltyInfo, RoyaltyInfoResponse, - UpdateCollectionInfoMsg, -}; +use sg721::{CollectionInfo, ExecuteMsg, InstantiateMsg, RoyaltyInfo, UpdateCollectionInfoMsg}; use crate::msg::{CollectionInfoResponse, NftParams, QueryMsg}; use crate::{ContractError, Sg721Contract}; use crate::entry::{CONTRACT_NAME, CONTRACT_VERSION}; -const MAX_DESCRIPTION_LENGTH: u32 = 512; -const MAX_SHARE_DELTA_PCT: u64 = 2; -const MAX_ROYALTY_SHARE_PCT: u64 = 10; - -impl<'a, T> Sg721Contract<'a, T> +impl<'a, TNftMetadataExtension, TNftMetadataExtensionMsg, TCustomResponseMsg> + Sg721Contract< + 'a, + // Metadata defined in NftInfo (used for mint). + TNftMetadataExtension, + // Message passed for updating metadata. + TNftMetadataExtensionMsg, + // Extension defined in CollectionMetadata. + DefaultOptionCollectionMetadataExtension, + // Message passed for updating collection info extension. + DefaultOptionCollectionMetadataExtensionMsg, + // Defines for `CosmosMsg::Custom` in response. Barely used, so `Empty` can be used. + TCustomResponseMsg, + > where - T: Serialize + DeserializeOwned + Clone, + TNftMetadataExtension: Cw721State, + TNftMetadataExtensionMsg: Cw721CustomMsg + StateFactory, + TCustomResponseMsg: CustomMsg, { + #[allow(deprecated)] pub fn instantiate( &self, deps: DepsMut, env: Env, info: MessageInfo, msg: InstantiateMsg, - ) -> Result { + ) -> Result, ContractError> { // no funds should be sent to this contract nonpayable(&info)?; // check sender is a contract let req = WasmQuery::ContractInfo { - contract_addr: info.sender.into(), + contract_addr: info.sender.to_string(), } .into(); let _res: ContractInfoResponse = deps @@ -48,59 +67,33 @@ where .query(&req) .map_err(|_| ContractError::Unauthorized {})?; - // cw721 instantiation - let info = CW721ContractInfoResponse { - name: msg.name, - symbol: msg.symbol, - }; - self.parent.contract_info.save(deps.storage, &info)?; - cw_ownable::initialize_owner(deps.storage, deps.api, Some(&msg.minter))?; - - // sg721 instantiation - if msg.collection_info.description.len() > MAX_DESCRIPTION_LENGTH as usize { - return Err(ContractError::DescriptionTooLong {}); - } - - let image = Url::parse(&msg.collection_info.image)?; - - if let Some(ref external_link) = msg.collection_info.external_link { - Url::parse(external_link)?; - } - - let royalty_info: Option = match msg.collection_info.royalty_info { - Some(royalty_info) => Some(RoyaltyInfo { - payment_address: deps.api.addr_validate(&royalty_info.payment_address)?, - share: share_validate(royalty_info.share)?, - }), - None => None, - }; - - deps.api.addr_validate(&msg.collection_info.creator)?; - - let collection_info = CollectionInfo { - creator: msg.collection_info.creator, - description: msg.collection_info.description, - image: msg.collection_info.image, - external_link: msg.collection_info.external_link, - explicit_content: msg.collection_info.explicit_content, - start_trading_time: msg.collection_info.start_trading_time, - royalty_info, - }; - - self.collection_info.save(deps.storage, &collection_info)?; + self.royalty_updated_at + .save(deps.storage, &env.block.time)?; self.frozen_collection_info.save(deps.storage, &false)?; - self.royalty_updated_at - .save(deps.storage, &env.block.time)?; + self.parent.instantiate( + deps, + &env, + &info, + msg.clone().into(), + CONTRACT_NAME, + CONTRACT_VERSION, + )?; + + if let Some(royalty_info) = msg.collection_info.royalty_info { + if royalty_info.share > Decimal::percent(MAX_ROYALTY_SHARE_PCT) { + share_validate(royalty_info.share)?; + } + } Ok(Response::new() .add_attribute("action", "instantiate") - .add_attribute("collection_name", info.name) - .add_attribute("collection_symbol", info.symbol) - .add_attribute("collection_creator", collection_info.creator) + .add_attribute("collection_name", msg.name) + .add_attribute("collection_symbol", msg.symbol) + .add_attribute("collection_creator", msg.collection_info.creator) .add_attribute("minter", msg.minter) - .add_attribute("image", image.to_string())) + .add_attribute("image", msg.collection_info.image.to_string())) } pub fn execute( @@ -108,48 +101,11 @@ where deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, - ) -> Result { + msg: ExecuteMsg, + ) -> Result, ContractError> { match msg { - ExecuteMsg::TransferNft { - recipient, - token_id, - } => self - .parent - .transfer_nft(deps, env, info, recipient, token_id) - .map_err(|e| e.into()), - ExecuteMsg::SendNft { - contract, - token_id, - msg, - } => self - .parent - .send_nft(deps, env, info, contract, token_id, msg) - .map_err(|e| e.into()), - ExecuteMsg::Approve { - spender, - token_id, - expires, - } => self - .parent - .approve(deps, env, info, spender, token_id, expires) - .map_err(|e| e.into()), - ExecuteMsg::Revoke { spender, token_id } => self - .parent - .revoke(deps, env, info, spender, token_id) - .map_err(|e| e.into()), - ExecuteMsg::ApproveAll { operator, expires } => self - .parent - .approve_all(deps, env, info, operator, expires) - .map_err(|e| e.into()), - ExecuteMsg::RevokeAll { operator } => self - .parent - .revoke_all(deps, env, info, operator) - .map_err(|e| e.into()), - ExecuteMsg::Burn { token_id } => self - .parent - .burn(deps, env, info, token_id) - .map_err(|e| e.into()), + // ---- sg721 specific msgs ---- + #[allow(deprecated)] ExecuteMsg::UpdateCollectionInfo { collection_info } => { self.update_collection_info(deps, env, info, collection_info) } @@ -157,82 +113,48 @@ where self.update_start_trading_time(deps, env, info, start_time) } ExecuteMsg::FreezeCollectionInfo {} => self.freeze_collection_info(deps, env, info), - ExecuteMsg::Mint { - token_id, - token_uri, - owner, - extension, - } => self.mint( - deps, - env, - info, - NftParams::NftData { - token_id, - owner, - token_uri, - extension, - }, - ), - ExecuteMsg::Extension { msg: _ } => todo!(), - sg721::ExecuteMsg::UpdateOwnership(msg) => self + // ---- cw721_base msgs ---- + msg => self .parent - .execute( - deps, - env, - info, - cw721_base::ExecuteMsg::UpdateOwnership(msg), - ) - .map_err(|e| ContractError::OwnershipUpdateError { - error: e.to_string(), - }), + .execute(deps, &env, &info, msg.into()) + .map_err(|e| e.into()), } } + #[allow(deprecated)] pub fn update_collection_info( &self, deps: DepsMut, env: Env, info: MessageInfo, collection_msg: UpdateCollectionInfoMsg, - ) -> Result { - let mut collection = self.collection_info.load(deps.storage)?; + ) -> Result, ContractError> { + let collection_info = self.parent.config.collection_metadata.load(deps.storage)?; if self.frozen_collection_info.load(deps.storage)? { return Err(ContractError::CollectionInfoFrozen {}); } // only creator can update collection info - if collection.creator != info.sender { + let creator = self.get_creator(deps.as_ref().storage)?; + if creator.is_none() || creator.unwrap() != info.sender { return Err(ContractError::Unauthorized {}); } - if let Some(new_creator) = collection_msg.creator { - deps.api.addr_validate(&new_creator)?; - collection.creator = new_creator; + if let Some(new_creator) = collection_msg.creator.clone() { + // TODO: for keeping logic as-is, creator is set right away, but it should use cw-ownable's Action::TransferOwnership + self.parent + .initialize_creator(deps.storage, deps.api, Some(new_creator.as_str()))?; } - collection.description = collection_msg - .description - .unwrap_or_else(|| collection.description.to_string()); - if collection.description.len() > MAX_DESCRIPTION_LENGTH as usize { - return Err(ContractError::DescriptionTooLong {}); - } - - collection.image = collection_msg - .image - .unwrap_or_else(|| collection.image.to_string()); - Url::parse(&collection.image)?; + // in this contract, extension is always present, so unwrap is safe + let collection_extension = collection_info.extension.unwrap(); - collection.external_link = collection_msg - .external_link - .unwrap_or_else(|| collection.external_link.as_ref().map(|s| s.to_string())); - if collection.external_link.as_ref().is_some() { - Url::parse(collection.external_link.as_ref().unwrap())?; + if collection_extension.description.len() > MAX_COLLECTION_DESCRIPTION_LENGTH as usize { + return Err(ContractError::DescriptionTooLong {}); } - collection.explicit_content = collection_msg.explicit_content; - - if let Some(Some(new_royalty_info_response)) = collection_msg.royalty_info { + if let Some(Some(_)) = collection_msg.royalty_info { let last_royalty_update = self.royalty_updated_at.load(deps.storage)?; if last_royalty_update.plus_seconds(24 * 60 * 60) > env.block.time { return Err(ContractError::InvalidRoyalties( @@ -240,36 +162,19 @@ where )); } - let new_royalty_info = RoyaltyInfo { - payment_address: deps - .api - .addr_validate(&new_royalty_info_response.payment_address)?, - share: share_validate(new_royalty_info_response.share)?, - }; - - if let Some(old_royalty_info) = collection.royalty_info { - if old_royalty_info.share < new_royalty_info.share { - let share_delta = new_royalty_info.share.abs_diff(old_royalty_info.share); - - if share_delta > Decimal::percent(MAX_SHARE_DELTA_PCT) { - return Err(ContractError::InvalidRoyalties(format!( - "Share increase cannot be greater than {MAX_SHARE_DELTA_PCT}%" - ))); - } - if new_royalty_info.share > Decimal::percent(MAX_ROYALTY_SHARE_PCT) { - return Err(ContractError::InvalidRoyalties(format!( - "Share cannot be greater than {MAX_ROYALTY_SHARE_PCT}%" - ))); - } - } - } - - collection.royalty_info = Some(new_royalty_info); self.royalty_updated_at .save(deps.storage, &env.block.time)?; } - self.collection_info.save(deps.storage, &collection)?; + let collection_extension: CollectionMetadataExtensionMsg = + collection_msg.into(); + let msg = CollectionMetadataMsg { + name: None, + symbol: None, + extension: Some(collection_extension), + }; + self.parent + .update_collection_metadata(deps, &info, &env, msg)?; let event = Event::new("update_collection_info").add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) @@ -280,15 +185,27 @@ where pub fn update_start_trading_time( &self, deps: DepsMut, - _env: Env, + env: Env, info: MessageInfo, start_time: Option, - ) -> Result { + ) -> Result, ContractError> { assert_minter_owner(deps.storage, &info.sender)?; - let mut collection_info = self.collection_info.load(deps.storage)?; - collection_info.start_trading_time = start_time; - self.collection_info.save(deps.storage, &collection_info)?; + let collection_info = self.parent.config.collection_metadata.load(deps.storage)?; + let msg = CollectionMetadataMsg { + name: None, + symbol: None, + extension: Some(CollectionMetadataExtensionMsg { + description: None, + image: None, + external_link: None, + explicit_content: None, + start_trading_time: start_time, + royalty_info: None, + }), + }; + self.parent + .update_collection_metadata(deps, &info, &env, msg)?; let event = Event::new("update_start_trading_time").add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) @@ -299,7 +216,7 @@ where deps: DepsMut, _env: Env, info: MessageInfo, - ) -> Result { + ) -> Result, ContractError> { let collection = self.query_collection_info(deps.as_ref())?; if collection.creator != info.sender { return Err(ContractError::Unauthorized {}); @@ -314,10 +231,10 @@ where pub fn mint( &self, deps: DepsMut, - _env: Env, + env: Env, info: MessageInfo, - nft_data: NftParams, - ) -> Result { + nft_data: NftParams, + ) -> Result, ContractError> { assert_minter_owner(deps.storage, &info.sender)?; let (token_id, owner, token_uri, extension) = match nft_data { NftParams::NftData { @@ -328,60 +245,51 @@ where } => (token_id, owner, token_uri, extension), }; - // create the token - let token = TokenInfo { - owner: deps.api.addr_validate(&owner)?, - approvals: vec![], - token_uri: token_uri.clone(), - extension, - }; - self.parent - .tokens - .update(deps.storage, &token_id, |old| match old { - Some(_) => Err(ContractError::Claimed {}), - None => Ok(token), - })?; - - self.parent.increment_tokens(deps.storage)?; - - let mut res = Response::new() - .add_attribute("action", "mint") - .add_attribute("minter", info.sender) - .add_attribute("owner", owner) - .add_attribute("token_id", token_id); - if let Some(token_uri) = token_uri { - res = res.add_attribute("token_uri", token_uri); - } - Ok(res) + Ok(self + .parent + .mint(deps, &env, &info, token_id, owner, token_uri, extension)?) } - pub fn query(&self, deps: Deps, env: Env, msg: QueryMsg) -> StdResult { + pub fn get_creator(&self, storage: &dyn Storage) -> Result, ContractError> { + // only creator can update collection info + let creator = self.parent.query_creator_ownership(storage)?.owner; + Ok(creator) + } + + pub fn query( + &self, + deps: Deps, + env: Env, + msg: QueryMsg, + ) -> Result { match msg { - QueryMsg::CollectionInfo {} => to_json_binary(&self.query_collection_info(deps)?), - _ => self.parent.query(deps, env, msg.into()), + QueryMsg::CollectionInfo {} => Ok(to_json_binary(&self.query_collection_info(deps)?)?), + _ => Ok(self.parent.query(deps, &env, msg.into())?), } } - pub fn query_collection_info(&self, deps: Deps) -> StdResult { - let info = self.collection_info.load(deps.storage)?; - - let royalty_info_res: Option = match info.royalty_info { - Some(royalty_info) => Some(RoyaltyInfoResponse { - payment_address: royalty_info.payment_address.to_string(), - share: royalty_info.share, - }), - None => None, + #[allow(deprecated)] + pub fn query_collection_info( + &self, + deps: Deps, + ) -> Result { + let collection_info = self.parent.config.collection_metadata.load(deps.storage)?; + + let creator = self.get_creator(deps.storage)?.map_or("none".to_string(), |c| c.to_string()); + // in this contract, extension is always present, so unwrap is safe + let collection_extension = collection_info.extension.unwrap(); + + let collection_info = CollectionInfoResponse { + creator, + description: collection_extension.description, + image: collection_extension.image, + external_link: collection_extension.external_link, + explicit_content: collection_extension.explicit_content, + start_trading_time: collection_extension.start_trading_time, + royalty_info: collection_extension.royalty_info.map(|r| r.into()), }; - Ok(CollectionInfoResponse { - creator: info.creator, - description: info.description, - image: info.image, - external_link: info.external_link, - explicit_content: info.explicit_content, - start_trading_time: info.start_trading_time, - royalty_info: royalty_info_res, - }) + Ok(collection_info) } pub fn migrate(mut deps: DepsMut, env: Env, _msg: Empty) -> Result { diff --git a/contracts/collections/sg721-base/src/error.rs b/contracts/collections/sg721-base/src/error.rs index 222f4ae5b..bc6b188e8 100644 --- a/contracts/collections/sg721-base/src/error.rs +++ b/contracts/collections/sg721-base/src/error.rs @@ -15,7 +15,7 @@ pub enum ContractError { Parse(#[from] ParseError), #[error("{0}")] - Base(#[from] cw721_base::ContractError), + Base(#[from] cw721_base::error::ContractError), #[error("Unauthorized")] Unauthorized {}, diff --git a/contracts/collections/sg721-base/src/lib.rs b/contracts/collections/sg721-base/src/lib.rs index 56e63d706..8086ce9f2 100644 --- a/contracts/collections/sg721-base/src/lib.rs +++ b/contracts/collections/sg721-base/src/lib.rs @@ -6,11 +6,22 @@ pub mod upgrades; pub use crate::error::ContractError; pub use crate::state::Sg721Contract; -use cosmwasm_std::Empty; -use cw721_base::Extension; +use cw721::{ + DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, RoyaltyInfo, +}; +use cw721_base::msg::CollectionMetadataExtensionMsg; +use cw721_base::{ + DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, NftMetadataMsg, +}; -pub type ExecuteMsg = sg721::ExecuteMsg; -pub type QueryMsg = cw721_base::QueryMsg; +pub type ExecuteMsg = sg721::ExecuteMsg< + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtensionMsg, +>; +pub type QueryMsg = cw721_base::msg::QueryMsg< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, +>; pub mod entry { use super::*; @@ -18,9 +29,8 @@ pub mod entry { #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; - use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult}; + use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult}; use cw2::set_contract_version; - use cw721_base::Extension; use sg721::InstantiateMsg; // version info for migration info @@ -36,7 +46,14 @@ pub mod entry { ) -> Result { set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - let res = Sg721Contract::::default().instantiate(deps, env, info, msg)?; + let res = Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::default() + .instantiate(deps, env, info, msg)?; Ok(res .add_attribute("contract_name", CONTRACT_NAME) @@ -50,11 +67,29 @@ pub mod entry { info: MessageInfo, msg: ExecuteMsg, ) -> Result { - Sg721Contract::::default().execute(deps, env, info, msg) + Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::default() + .execute(deps, env, info, msg) } #[cfg_attr(not(feature = "library"), entry_point)] - pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { - Sg721Contract::::default().query(deps, env, msg) + pub fn query( + deps: Deps, + env: Env, + msg: QueryMsg, + ) -> Result { + Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::default() + .query(deps, env, msg) } } diff --git a/contracts/collections/sg721-base/src/msg.rs b/contracts/collections/sg721-base/src/msg.rs index 2c88a7d27..e03964b8d 100644 --- a/contracts/collections/sg721-base/src/msg.rs +++ b/contracts/collections/sg721-base/src/msg.rs @@ -1,86 +1,54 @@ +use cw721::msg::RoyaltyInfoResponse; +use cw721::traits::Cw721State; +use cw721::CollectionMetadataExtension; +use cw721::DefaultOptionCollectionMetadataExtensionMsg; +use cw721::RoyaltyInfo; +use serde::de::DeserializeOwned; +use serde::Serialize; +use std::fmt::Debug; + use cosmwasm_schema::cw_serde; use cosmwasm_schema::QueryResponses; -use cosmwasm_std::{ - coin, Addr, BankMsg, Binary, Empty, Event, StdError, StdResult, Timestamp, Uint128, -}; -use cw721::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, ContractInfoResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, +use cosmwasm_std::{coin, Addr, BankMsg, Empty, Event, StdError, StdResult, Timestamp, Uint128}; +use cw721_base::{ + msg::{ + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, Cw721ExecuteMsg, MinterResponse, + NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, + QueryMsg as Cw721QueryMsg, TokensResponse, + }, + state::CollectionMetadata, }; -use cw721_base::msg::MinterResponse; -use cw721_base::msg::QueryMsg as Cw721QueryMsg; -use cw_ownable::cw_ownable_execute; -use cw_ownable::cw_ownable_query; -use cw_utils::Expiration; -use sg721::RoyaltyInfoResponse; +use cw_ownable::Ownership; use sg_std::{Response, SubMsg, NATIVE_DENOM}; -#[cw_ownable_execute] -#[cw_serde] -pub enum ExecuteMsg { - /// Transfer is a base message to move a token to another account without triggering actions - TransferNft { recipient: String, token_id: String }, - /// Send is a base message to transfer a token to a contract and trigger an action - /// on the receiving contract. - SendNft { - contract: String, - token_id: String, - msg: Binary, - }, - /// Allows operator to transfer / send the token from the owner's account. - /// If expiration is set, then this allowance has a time/height limit - Approve { - spender: String, - token_id: String, - expires: Option, - }, - /// Remove previously granted Approval - Revoke { spender: String, token_id: String }, - /// Allows operator to transfer / send any token from the owner's account. - /// If expiration is set, then this allowance has a time/height limit - ApproveAll { - operator: String, - expires: Option, - }, - /// Remove previously granted ApproveAll permission - RevokeAll { operator: String }, - - /// Mint a new NFT, can only be called by the contract minter - Mint { - /// Unique ID of the NFT - token_id: String, - /// The owner of the newly minter NFT - owner: String, - /// Universal resource identifier for this NFT - /// Should point to a JSON file that conforms to the ERC721 - /// Metadata JSON Schema - token_uri: Option, - /// Any custom extension used by this contract - extension: T, - }, - - /// Burn an NFT the sender has access to - Burn { token_id: String }, - - /// Extension msg - Extension { msg: E }, -} - -#[cw_ownable_query] #[derive(QueryResponses)] #[cw_serde] -pub enum QueryMsg { +pub enum QueryMsg< + // Return type of NFT metadata defined in `NftInfo` and `AllNftInfo`. + TNftMetadataExtension, + // Return type of collection metadata extension defined in `GetCollectionMetadata`. + TCollectionMetadataExtension, +> { + #[returns(CollectionInfoResponse)] + #[deprecated = "Please use GetCollectionMetadata instead"] + CollectionInfo {}, + + // ---- cw721 v0.19.0 msgs ---- + /// Return the owner of the given token, error if token does not exist #[returns(OwnerOfResponse)] OwnerOf { token_id: String, + /// unset or false will filter out expired approvals, you must set to true to see them include_expired: Option, }, + /// Return operator that can access all of the owner's tokens. #[returns(ApprovalResponse)] Approval { token_id: String, spender: String, include_expired: Option, }, + /// Return approvals that a token has #[returns(ApprovalsResponse)] Approvals { token_id: String, @@ -89,40 +57,108 @@ pub enum QueryMsg { #[returns(OperatorsResponse)] AllOperators { owner: String, + /// unset or false will filter out expired items, you must set to true to see them include_expired: Option, start_after: Option, limit: Option, }, + /// Total number of tokens issued #[returns(NumTokensResponse)] NumTokens {}, - #[returns(ContractInfoResponse)] + + #[deprecated(since = "0.19.0", note = "Please use GetCollectionMetadata instead")] + #[returns(CollectionMetadata)] + /// Deprecated: use GetCollectionMetadata instead! Will be removed in next release! ContractInfo {}, - #[returns(NftInfoResponse)] + + /// With MetaData Extension. + /// Returns top-level metadata about the contract + #[returns(CollectionMetadata)] + GetCollectionMetadata {}, + + #[deprecated(since = "0.19.0", note = "Please use GetMinterOwnership instead")] + #[returns(Ownership)] + /// Deprecated: use GetMinterOwnership instead! Will be removed in next release! + Ownership {}, + + /// Return the minter + #[deprecated(since = "0.19.0", note = "Please use GetMinterOwnership instead")] + #[returns(MinterResponse)] + /// Deprecated: use GetMinterOwnership instead! Will be removed in next release! + Minter {}, + + #[returns(Ownership)] + GetMinterOwnership {}, + + #[returns(Ownership)] + GetCreatorOwnership {}, + + /// With MetaData Extension. + /// Returns metadata about one particular token, based on *ERC721 Metadata JSON Schema* + /// but directly from the contract + #[returns(NftInfoResponse)] NftInfo { token_id: String }, - #[returns(AllNftInfoResponse)] + /// With MetaData Extension. + /// Returns the result of both `NftInfo` and `OwnerOf` as one query as an optimization + /// for clients + #[returns(AllNftInfoResponse)] AllNftInfo { token_id: String, + /// unset or false will filter out expired approvals, you must set to true to see them include_expired: Option, }, + + /// With Enumerable extension. + /// Returns all tokens owned by the given address, [] if unset. #[returns(TokensResponse)] Tokens { owner: String, start_after: Option, limit: Option, }, + /// With Enumerable extension. + /// Requires pagination. Lists all token_ids controlled by the contract. #[returns(TokensResponse)] AllTokens { start_after: Option, limit: Option, }, - #[returns(MinterResponse)] - Minter {}, - #[returns(CollectionInfoResponse)] - CollectionInfo {}, + + #[returns(Option)] + GetWithdrawAddress {}, + + // -- below queries, Extension and GetCollectionMetadataExtension, are just dummies, since type annotations are required for + // -- TNftMetadataExtension and TCollectionMetadataExtension, Error: + // -- "type annotations needed: cannot infer type for type parameter `TNftMetadataExtension` declared on the enum `Cw721QueryMsg`" + /// Use NftInfo instead. + /// No-op / NFT metadata query returning empty binary, needed for inferring type parameter during compile. + /// + /// Note: it may be extended in case there are use cases e.g. for specific NFT metadata query. + #[returns(())] + #[deprecated(since = "0.19.0", note = "Please use GetNftMetadata instead")] + Extension { msg: TNftMetadataExtension }, + + #[returns(())] + GetNftMetadata { msg: TNftMetadataExtension }, + + /// Use GetCollectionMetadata instead. + /// No-op / collection metadata extension query returning empty binary, needed for inferring type parameter during compile + /// + /// Note: it may be extended in case there are use cases e.g. for specific collection metadata query. + #[returns(())] + GetCollectionMetadataExtension { msg: TCollectionMetadataExtension }, } -impl From for Cw721QueryMsg { - fn from(msg: QueryMsg) -> Cw721QueryMsg { +impl + From> + for Cw721QueryMsg +where + TNftMetadataExtension: Cw721State, + TCollectionMetadataExtension: Cw721State, +{ + fn from( + msg: QueryMsg, + ) -> Cw721QueryMsg { match msg { QueryMsg::OwnerOf { token_id, @@ -160,6 +196,11 @@ impl From for Cw721QueryMsg { }, QueryMsg::NumTokens {} => Cw721QueryMsg::NumTokens {}, QueryMsg::ContractInfo {} => Cw721QueryMsg::ContractInfo {}, + QueryMsg::GetCollectionMetadata {} => Cw721QueryMsg::GetCollectionMetadata {}, + QueryMsg::Ownership {} => Cw721QueryMsg::Ownership {}, + QueryMsg::Minter {} => Cw721QueryMsg::Minter {}, + QueryMsg::GetMinterOwnership {} => Cw721QueryMsg::GetMinterOwnership {}, + QueryMsg::GetCreatorOwnership {} => Cw721QueryMsg::GetCreatorOwnership {}, QueryMsg::NftInfo { token_id } => Cw721QueryMsg::NftInfo { token_id }, QueryMsg::AllNftInfo { token_id, @@ -180,14 +221,13 @@ impl From for Cw721QueryMsg { QueryMsg::AllTokens { start_after, limit } => { Cw721QueryMsg::AllTokens { start_after, limit } } - QueryMsg::Minter {} => Cw721QueryMsg::Minter {}, - QueryMsg::Ownership {} => Cw721QueryMsg::Ownership {}, _ => unreachable!("cannot convert {:?} to Cw721QueryMsg", msg), } } } #[cw_serde] +#[deprecated = "Please use CollectionMetadata> instead"] pub struct CollectionInfoResponse { pub creator: String, pub description: String, diff --git a/contracts/collections/sg721-base/src/state.rs b/contracts/collections/sg721-base/src/state.rs index a3f5eed6c..56fe680fd 100644 --- a/contracts/collections/sg721-base/src/state.rs +++ b/contracts/collections/sg721-base/src/state.rs @@ -1,42 +1,121 @@ -use cosmwasm_std::{Empty, Timestamp}; +use cosmwasm_std::Timestamp; +use cw721::traits::{Cw721CustomMsg, Cw721State}; use cw_storage_plus::Item; use serde::{de::DeserializeOwned, Serialize}; -use sg721::{CollectionInfo, RoyaltyInfo}; use std::ops::Deref; -type Parent<'a, T> = cw721_base::Cw721Contract<'a, T, Empty, Empty, Empty>; -pub struct Sg721Contract<'a, T> -where - T: Serialize + DeserializeOwned + Clone, -{ - pub parent: Parent<'a, T>, - pub collection_info: Item<'a, CollectionInfo>, +type Parent< + 'a, + // Metadata defined in NftInfo (used for mint). + TNftMetadataExtension, + // Message passed for updating metadata. + TNftMetadataExtensionMsg, + // Extension defined in CollectionMetadata. + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + // Defines for `CosmosMsg::Custom` in response. Barely used, so `Empty` can be used. + TCustomResponseMsg, +> = cw721_base::Cw721Contract< + 'a, + TNftMetadataExtension, + TNftMetadataExtensionMsg, + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + TCustomResponseMsg, +>; +pub struct Sg721Contract< + 'a, + // Metadata defined in NftInfo (used for mint). + TNftMetadataExtension, + // Message passed for updating metadata. + TNftMetadataExtensionMsg, + // Extension defined in CollectionMetadata. + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + // Defines for `CosmosMsg::Custom` in response. Barely used, so `Empty` can be used. + TCustomResponseMsg, +> where + TNftMetadataExtension: Cw721State, + TNftMetadataExtensionMsg: Cw721CustomMsg, + TCollectionMetadataExtension: Cw721State, + TCollectionMetadataExtensionMsg: Cw721CustomMsg, +{ + pub parent: Parent< + 'a, + TNftMetadataExtension, + TNftMetadataExtensionMsg, + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + TCustomResponseMsg, + >, /// Instantiate set to false by the minter, then true by creator to freeze collection info pub frozen_collection_info: Item<'a, bool>, pub royalty_updated_at: Item<'a, Timestamp>, } -impl<'a, T> Default for Sg721Contract<'a, T> +impl< + 'a, + TNftMetadataExtension, + TNftMetadataExtensionMsg, + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + TCustomResponseMsg, + > Default + for Sg721Contract< + 'a, + TNftMetadataExtension, + TNftMetadataExtensionMsg, + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + TCustomResponseMsg, + > where - T: Serialize + DeserializeOwned + Clone, + TNftMetadataExtension: Cw721State, + TNftMetadataExtensionMsg: Cw721CustomMsg, + TCollectionMetadataExtension: Cw721State, + TCollectionMetadataExtensionMsg: Cw721CustomMsg, { fn default() -> Self { Sg721Contract { parent: cw721_base::Cw721Contract::default(), - collection_info: Item::new("collection_info"), frozen_collection_info: Item::new("frozen_collection_info"), royalty_updated_at: Item::new("royalty_updated_at"), } } } -impl<'a, T> Deref for Sg721Contract<'a, T> +impl< + 'a, + TNftMetadataExtension, + TNftMetadataExtensionMsg, + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + TCustomResponseMsg, + > Deref + for Sg721Contract< + 'a, + TNftMetadataExtension, + TNftMetadataExtensionMsg, + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + TCustomResponseMsg, + > where - T: Serialize + DeserializeOwned + Clone, + TNftMetadataExtension: Cw721State, + TNftMetadataExtensionMsg: Cw721CustomMsg, + TCollectionMetadataExtension: Cw721State, + TCollectionMetadataExtensionMsg: Cw721CustomMsg, { - type Target = Parent<'a, T>; + type Target = Parent< + 'a, + TNftMetadataExtension, + TNftMetadataExtensionMsg, + TCollectionMetadataExtension, + TCollectionMetadataExtensionMsg, + TCustomResponseMsg, + >; fn deref(&self) -> &Self::Target { &self.parent diff --git a/contracts/collections/sg721-base/src/upgrades/v3_0_0.rs b/contracts/collections/sg721-base/src/upgrades/v3_0_0.rs index f84165d50..c43e06815 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_0_0.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_0_0.rs @@ -1,14 +1,42 @@ -use crate::ContractError; +use crate::{ + entry::{CONTRACT_NAME, CONTRACT_VERSION}, + ContractError, Sg721Contract, +}; use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; -use cw721_base::Extension; +use cw721::{ + msg::Cw721MigrateMsg, DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, +}; +use cw721_base::execute::Cw721Execute; -pub fn upgrade(deps: DepsMut, _env: &Env, response: Response) -> Result { - let cw17_res = cw721_base::upgrades::v0_17::migrate::(deps) +pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result { + let contract = Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::default(); + let migrate_msg = Cw721MigrateMsg::WithUpdate { + minter: None, + creator: None, + }; + // cw721 migration allows all versions: 0.18. 0.17, 0.16 and older + let cw721_res = contract + .parent + .migrate( + deps, + env.clone(), + migrate_msg, + CONTRACT_NAME, + CONTRACT_VERSION, + ) .map_err(|e| ContractError::MigrationError(e.to_string()))?; let mut event = Event::new("migrate-3.0.0"); - event = event.add_attributes(cw17_res.attributes); + event = event.add_attributes(cw721_res.attributes); Ok(response.add_event(event)) } diff --git a/contracts/collections/sg721-base/src/upgrades/v3_1_0.rs b/contracts/collections/sg721-base/src/upgrades/v3_1_0.rs index 563ee3f23..77c65cbb9 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_1_0.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_1_0.rs @@ -1,19 +1,49 @@ -use crate::{ContractError, Sg721Contract}; +use crate::{ + entry::{CONTRACT_NAME, CONTRACT_VERSION}, + ContractError, Sg721Contract, +}; +use cw721_base::execute::Cw721Execute; -use cosmwasm_std::{DepsMut, Env, Event, Response}; -use cw721_base::Extension; +use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; +use cw721::{ + msg::Cw721MigrateMsg, DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, +}; pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result { - let contract = Sg721Contract::::default(); - + let contract = Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::default(); let royalty_updated_at = env.block.time.minus_seconds(60 * 60 * 24); // 24 hours ago contract .royalty_updated_at .save(deps.storage, &royalty_updated_at)?; - let event = Event::new("migrate-3.1.0") + let migrate_msg = Cw721MigrateMsg::WithUpdate { + minter: None, + creator: None, + }; + // cw721 migration allows all versions: 0.18. 0.17, 0.16 and older + let cw721_res = contract + .parent + .migrate( + deps, + env.clone(), + migrate_msg, + CONTRACT_NAME, + CONTRACT_VERSION, + ) + .map_err(|e| ContractError::MigrationError(e.to_string()))?; + + let mut event = Event::new("migrate-3.1.0") .add_attribute("royalty-updated", royalty_updated_at.to_string()); + event = event.add_attributes(cw721_res.attributes); Ok(response.add_event(event)) } diff --git a/contracts/collections/sg721-metadata-onchain/.cargo/config b/contracts/collections/sg721-metadata-onchain/.cargo/config deleted file mode 100644 index ab407a024..000000000 --- a/contracts/collections/sg721-metadata-onchain/.cargo/config +++ /dev/null @@ -1,4 +0,0 @@ -[alias] -wasm = "build --release --lib --target wasm32-unknown-unknown" -unit-test = "test --lib" -schema = "run --example schema" diff --git a/contracts/collections/sg721-metadata-onchain/Cargo.toml b/contracts/collections/sg721-metadata-onchain/Cargo.toml deleted file mode 100644 index 6a1f51856..000000000 --- a/contracts/collections/sg721-metadata-onchain/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "sg721-metadata-onchain" -authors = [ - "Shane Vitarana ", - "Larry Engineer ", -] -description = "Example extending SG721 NFT to store metadata on chain" -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 = [] - -[dependencies] -cosmwasm-schema = { workspace = true } -cosmwasm-std = { workspace = true } -cw2 = { workspace = true } -schemars = { workspace = true } -serde = { workspace = true } -sg721 = { workspace = true } -sg721-base = { workspace = true, features = ["library"] } -sg-metadata = { workspace = true } -sg-std = { workspace = true } -cw-ownable = { workspace = true } -cw721-base = { workspace = true, features = ["library"] } - -[dev-dependencies] -cw721 = { workspace = true } diff --git a/contracts/collections/sg721-metadata-onchain/examples/schema.rs b/contracts/collections/sg721-metadata-onchain/examples/schema.rs deleted file mode 100644 index 320136a0f..000000000 --- a/contracts/collections/sg721-metadata-onchain/examples/schema.rs +++ /dev/null @@ -1,48 +0,0 @@ -use std::env::current_dir; -use std::fs::create_dir_all; - -use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; - -use cw721::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, ContractInfoResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, -}; -use cw721_base::MinterResponse; -use sg721_base::msg::CollectionInfoResponse; -use sg721_metadata_onchain::{InstantiateMsg, QueryMsg}; -use sg_metadata::Metadata; - -fn main() { - let mut out_dir = current_dir().unwrap(); - out_dir.push("schema"); - create_dir_all(&out_dir).unwrap(); - remove_schemas(&out_dir).unwrap(); - - export_schema(&schema_for!(InstantiateMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); - export_schema_with_title( - &schema_for!(AllNftInfoResponse), - &out_dir, - "AllNftInfoResponse", - ); - export_schema(&schema_for!(ApprovalResponse), &out_dir); - export_schema(&schema_for!(ApprovalsResponse), &out_dir); - export_schema(&schema_for!(OperatorsResponse), &out_dir); - export_schema(&schema_for!(ContractInfoResponse), &out_dir); - export_schema(&schema_for!(MinterResponse), &out_dir); - export_schema_with_title( - &schema_for!(NftInfoResponse), - &out_dir, - "NftInfoResponse", - ); - export_schema(&schema_for!(NumTokensResponse), &out_dir); - export_schema(&schema_for!(OwnerOfResponse), &out_dir); - export_schema(&schema_for!(TokensResponse), &out_dir); - export_schema_with_title( - &schema_for!(OperatorsResponse), - &out_dir, - "AllOperatorsResponse", - ); - export_schema_with_title(&schema_for!(TokensResponse), &out_dir, "AllTokensResponse"); - export_schema(&schema_for!(CollectionInfoResponse), &out_dir); -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/all_nft_info_response.json b/contracts/collections/sg721-metadata-onchain/schema/all_nft_info_response.json deleted file mode 100644 index ea3074aa5..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/all_nft_info_response.json +++ /dev/null @@ -1,252 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllNftInfoResponse", - "type": "object", - "required": [ - "access", - "info" - ], - "properties": { - "access": { - "description": "Who can transfer the token", - "allOf": [ - { - "$ref": "#/definitions/OwnerOfResponse" - } - ] - }, - "info": { - "description": "Data on the token itself,", - "allOf": [ - { - "$ref": "#/definitions/NftInfoResponse_for_Metadata" - } - ] - } - }, - "additionalProperties": false, - "definitions": { - "Approval": { - "type": "object", - "required": [ - "expires", - "spender" - ], - "properties": { - "expires": { - "description": "When the Approval expires (maybe Expiration::never)", - "allOf": [ - { - "$ref": "#/definitions/Expiration" - } - ] - }, - "spender": { - "description": "Account that can transfer/send the token", - "type": "string" - } - }, - "additionalProperties": false - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] - }, - "Metadata": { - "description": "OpenSea metadata standard, used by Stargaze marketplace. See [this link](https://docs.opensea.io/docs/metadata-standards) for details.", - "type": "object", - "properties": { - "animation_url": { - "description": "A URL to a multi-media attachment for the item. The file extensions GLTF, GLB, WEBM, MP4, M4V, OGV, and OGG are supported, along with the audio-only extensions MP3, WAV, and OGA.\n\nAnimation_url also supports HTML pages, allowing you to build rich experiences and interactive NFTs using JavaScript canvas, WebGL, and more. Scripts and relative paths within the HTML page are now supported. However, access to browser extensions is not supported.", - "type": [ - "string", - "null" - ] - }, - "attributes": { - "description": "These are the attributes for the item, which will show up on the OpenSea page for the item.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Trait" - } - }, - "background_color": { - "description": "Background color of the item on OpenSea. Must be a six-character hexadecimal without a pre-pended #.", - "type": [ - "string", - "null" - ] - }, - "description": { - "description": "A human readable description of the item. Markdown is supported.", - "type": [ - "string", - "null" - ] - }, - "external_url": { - "description": "This is the URL that will appear below the asset's image on OpenSea and will allow users to leave OpenSea and view the item on your site.", - "type": [ - "string", - "null" - ] - }, - "image": { - "description": "This is the URL to the image of the item. Can be just about any type of image (including SVGs, which will be cached into PNGs by OpenSea), and can be [IPFS](https://github.com/ipfs/is-ipfs) URLs or paths. We recommend using a 350 x 350 image.", - "type": [ - "string", - "null" - ] - }, - "image_data": { - "description": "Raw SVG image data, if you want to generate images on the fly (not recommended). Only use this if you're not including the `image` parameter.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "Name of the item.", - "type": [ - "string", - "null" - ] - }, - "youtube_url": { - "description": "A URL to a YouTube video.", - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - }, - "NftInfoResponse_for_Metadata": { - "type": "object", - "required": [ - "extension" - ], - "properties": { - "extension": { - "description": "You can add any custom metadata here when you extend cw721-base", - "allOf": [ - { - "$ref": "#/definitions/Metadata" - } - ] - }, - "token_uri": { - "description": "Universal resource identifier for this NFT Should point to a JSON file that conforms to the ERC721 Metadata JSON Schema", - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - }, - "OwnerOfResponse": { - "type": "object", - "required": [ - "approvals", - "owner" - ], - "properties": { - "approvals": { - "description": "If set this address is approved to transfer/send the token as well", - "type": "array", - "items": { - "$ref": "#/definitions/Approval" - } - }, - "owner": { - "description": "Owner of the token", - "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" - } - ] - }, - "Trait": { - "description": "An attribute of the token as defined by the [OpenSea metadata standard](https://docs.opensea.io/docs/metadata-standards#attributes).", - "type": "object", - "required": [ - "trait_type", - "value" - ], - "properties": { - "display_type": { - "type": [ - "string", - "null" - ] - }, - "trait_type": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/all_operators_response.json b/contracts/collections/sg721-metadata-onchain/schema/all_operators_response.json deleted file mode 100644 index 5c88cf9c1..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/all_operators_response.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllOperatorsResponse", - "type": "object", - "required": [ - "operators" - ], - "properties": { - "operators": { - "type": "array", - "items": { - "$ref": "#/definitions/Approval" - } - } - }, - "additionalProperties": false, - "definitions": { - "Approval": { - "type": "object", - "required": [ - "expires", - "spender" - ], - "properties": { - "expires": { - "description": "When the Approval expires (maybe Expiration::never)", - "allOf": [ - { - "$ref": "#/definitions/Expiration" - } - ] - }, - "spender": { - "description": "Account that can transfer/send the token", - "type": "string" - } - }, - "additionalProperties": false - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "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" - } - ] - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/all_tokens_response.json b/contracts/collections/sg721-metadata-onchain/schema/all_tokens_response.json deleted file mode 100644 index 3925af750..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/all_tokens_response.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllTokensResponse", - "type": "object", - "required": [ - "tokens" - ], - "properties": { - "tokens": { - "description": "Contains all token_ids in lexicographical ordering If there are more than `limit`, use `start_after` in future queries to achieve pagination.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/approval_response.json b/contracts/collections/sg721-metadata-onchain/schema/approval_response.json deleted file mode 100644 index b29eab59e..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/approval_response.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ApprovalResponse", - "type": "object", - "required": [ - "approval" - ], - "properties": { - "approval": { - "$ref": "#/definitions/Approval" - } - }, - "additionalProperties": false, - "definitions": { - "Approval": { - "type": "object", - "required": [ - "expires", - "spender" - ], - "properties": { - "expires": { - "description": "When the Approval expires (maybe Expiration::never)", - "allOf": [ - { - "$ref": "#/definitions/Expiration" - } - ] - }, - "spender": { - "description": "Account that can transfer/send the token", - "type": "string" - } - }, - "additionalProperties": false - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "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" - } - ] - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/approvals_response.json b/contracts/collections/sg721-metadata-onchain/schema/approvals_response.json deleted file mode 100644 index 7cdac0015..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/approvals_response.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ApprovalsResponse", - "type": "object", - "required": [ - "approvals" - ], - "properties": { - "approvals": { - "type": "array", - "items": { - "$ref": "#/definitions/Approval" - } - } - }, - "additionalProperties": false, - "definitions": { - "Approval": { - "type": "object", - "required": [ - "expires", - "spender" - ], - "properties": { - "expires": { - "description": "When the Approval expires (maybe Expiration::never)", - "allOf": [ - { - "$ref": "#/definitions/Expiration" - } - ] - }, - "spender": { - "description": "Account that can transfer/send the token", - "type": "string" - } - }, - "additionalProperties": false - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "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" - } - ] - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/collection_info_response.json b/contracts/collections/sg721-metadata-onchain/schema/collection_info_response.json deleted file mode 100644 index 0e4e9c2d3..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/collection_info_response.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CollectionInfoResponse", - "type": "object", - "required": [ - "creator", - "description", - "image" - ], - "properties": { - "creator": { - "type": "string" - }, - "description": { - "type": "string" - }, - "explicit_content": { - "type": [ - "boolean", - "null" - ] - }, - "external_link": { - "type": [ - "string", - "null" - ] - }, - "image": { - "type": "string" - }, - "royalty_info": { - "anyOf": [ - { - "$ref": "#/definitions/RoyaltyInfoResponse" - }, - { - "type": "null" - } - ] - }, - "start_trading_time": { - "anyOf": [ - { - "$ref": "#/definitions/Timestamp" - }, - { - "type": "null" - } - ] - } - }, - "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" - }, - "RoyaltyInfoResponse": { - "type": "object", - "required": [ - "payment_address", - "share" - ], - "properties": { - "payment_address": { - "type": "string" - }, - "share": { - "$ref": "#/definitions/Decimal" - } - }, - "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" - } - ] - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/contract_info_response.json b/contracts/collections/sg721-metadata-onchain/schema/contract_info_response.json deleted file mode 100644 index 4a805a825..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/contract_info_response.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractInfoResponse", - "type": "object", - "required": [ - "name", - "symbol" - ], - "properties": { - "name": { - "type": "string" - }, - "symbol": { - "type": "string" - } - }, - "additionalProperties": false -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/instantiate_msg.json b/contracts/collections/sg721-metadata-onchain/schema/instantiate_msg.json deleted file mode 100644 index 734b45e87..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/instantiate_msg.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "collection_info", - "minter", - "name", - "symbol" - ], - "properties": { - "collection_info": { - "$ref": "#/definitions/CollectionInfo_for_RoyaltyInfoResponse" - }, - "minter": { - "type": "string" - }, - "name": { - "type": "string" - }, - "symbol": { - "type": "string" - } - }, - "additionalProperties": false, - "definitions": { - "CollectionInfo_for_RoyaltyInfoResponse": { - "type": "object", - "required": [ - "creator", - "description", - "image" - ], - "properties": { - "creator": { - "type": "string" - }, - "description": { - "type": "string" - }, - "explicit_content": { - "type": [ - "boolean", - "null" - ] - }, - "external_link": { - "type": [ - "string", - "null" - ] - }, - "image": { - "type": "string" - }, - "royalty_info": { - "anyOf": [ - { - "$ref": "#/definitions/RoyaltyInfoResponse" - }, - { - "type": "null" - } - ] - }, - "start_trading_time": { - "anyOf": [ - { - "$ref": "#/definitions/Timestamp" - }, - { - "type": "null" - } - ] - } - }, - "additionalProperties": false - }, - "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" - }, - "RoyaltyInfoResponse": { - "type": "object", - "required": [ - "payment_address", - "share" - ], - "properties": { - "payment_address": { - "type": "string" - }, - "share": { - "$ref": "#/definitions/Decimal" - } - }, - "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" - } - ] - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/minter_response.json b/contracts/collections/sg721-metadata-onchain/schema/minter_response.json deleted file mode 100644 index e79df37e8..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/minter_response.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MinterResponse", - "description": "Shows who can mint these tokens", - "type": "object", - "properties": { - "minter": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/nft_info_response.json b/contracts/collections/sg721-metadata-onchain/schema/nft_info_response.json deleted file mode 100644 index 8d5e6fda2..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/nft_info_response.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "NftInfoResponse", - "type": "object", - "required": [ - "extension" - ], - "properties": { - "extension": { - "description": "You can add any custom metadata here when you extend cw721-base", - "allOf": [ - { - "$ref": "#/definitions/Metadata" - } - ] - }, - "token_uri": { - "description": "Universal resource identifier for this NFT Should point to a JSON file that conforms to the ERC721 Metadata JSON Schema", - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false, - "definitions": { - "Metadata": { - "description": "OpenSea metadata standard, used by Stargaze marketplace. See [this link](https://docs.opensea.io/docs/metadata-standards) for details.", - "type": "object", - "properties": { - "animation_url": { - "description": "A URL to a multi-media attachment for the item. The file extensions GLTF, GLB, WEBM, MP4, M4V, OGV, and OGG are supported, along with the audio-only extensions MP3, WAV, and OGA.\n\nAnimation_url also supports HTML pages, allowing you to build rich experiences and interactive NFTs using JavaScript canvas, WebGL, and more. Scripts and relative paths within the HTML page are now supported. However, access to browser extensions is not supported.", - "type": [ - "string", - "null" - ] - }, - "attributes": { - "description": "These are the attributes for the item, which will show up on the OpenSea page for the item.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Trait" - } - }, - "background_color": { - "description": "Background color of the item on OpenSea. Must be a six-character hexadecimal without a pre-pended #.", - "type": [ - "string", - "null" - ] - }, - "description": { - "description": "A human readable description of the item. Markdown is supported.", - "type": [ - "string", - "null" - ] - }, - "external_url": { - "description": "This is the URL that will appear below the asset's image on OpenSea and will allow users to leave OpenSea and view the item on your site.", - "type": [ - "string", - "null" - ] - }, - "image": { - "description": "This is the URL to the image of the item. Can be just about any type of image (including SVGs, which will be cached into PNGs by OpenSea), and can be [IPFS](https://github.com/ipfs/is-ipfs) URLs or paths. We recommend using a 350 x 350 image.", - "type": [ - "string", - "null" - ] - }, - "image_data": { - "description": "Raw SVG image data, if you want to generate images on the fly (not recommended). Only use this if you're not including the `image` parameter.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "Name of the item.", - "type": [ - "string", - "null" - ] - }, - "youtube_url": { - "description": "A URL to a YouTube video.", - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - }, - "Trait": { - "description": "An attribute of the token as defined by the [OpenSea metadata standard](https://docs.opensea.io/docs/metadata-standards#attributes).", - "type": "object", - "required": [ - "trait_type", - "value" - ], - "properties": { - "display_type": { - "type": [ - "string", - "null" - ] - }, - "trait_type": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/num_tokens_response.json b/contracts/collections/sg721-metadata-onchain/schema/num_tokens_response.json deleted file mode 100644 index aff5850c8..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/num_tokens_response.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "NumTokensResponse", - "type": "object", - "required": [ - "count" - ], - "properties": { - "count": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/operators_response.json b/contracts/collections/sg721-metadata-onchain/schema/operators_response.json deleted file mode 100644 index 533a096dd..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/operators_response.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "OperatorsResponse", - "type": "object", - "required": [ - "operators" - ], - "properties": { - "operators": { - "type": "array", - "items": { - "$ref": "#/definitions/Approval" - } - } - }, - "additionalProperties": false, - "definitions": { - "Approval": { - "type": "object", - "required": [ - "expires", - "spender" - ], - "properties": { - "expires": { - "description": "When the Approval expires (maybe Expiration::never)", - "allOf": [ - { - "$ref": "#/definitions/Expiration" - } - ] - }, - "spender": { - "description": "Account that can transfer/send the token", - "type": "string" - } - }, - "additionalProperties": false - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "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" - } - ] - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/owner_of_response.json b/contracts/collections/sg721-metadata-onchain/schema/owner_of_response.json deleted file mode 100644 index abb9006d8..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/owner_of_response.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "OwnerOfResponse", - "type": "object", - "required": [ - "approvals", - "owner" - ], - "properties": { - "approvals": { - "description": "If set this address is approved to transfer/send the token as well", - "type": "array", - "items": { - "$ref": "#/definitions/Approval" - } - }, - "owner": { - "description": "Owner of the token", - "type": "string" - } - }, - "additionalProperties": false, - "definitions": { - "Approval": { - "type": "object", - "required": [ - "expires", - "spender" - ], - "properties": { - "expires": { - "description": "When the Approval expires (maybe Expiration::never)", - "allOf": [ - { - "$ref": "#/definitions/Expiration" - } - ] - }, - "spender": { - "description": "Account that can transfer/send the token", - "type": "string" - } - }, - "additionalProperties": false - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "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" - } - ] - }, - "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" - } - } -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/query_msg.json b/contracts/collections/sg721-metadata-onchain/schema/query_msg.json deleted file mode 100644 index 52c8dff4f..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/query_msg.json +++ /dev/null @@ -1,310 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "type": "object", - "required": [ - "owner_of" - ], - "properties": { - "owner_of": { - "type": "object", - "required": [ - "token_id" - ], - "properties": { - "include_expired": { - "type": [ - "boolean", - "null" - ] - }, - "token_id": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "approval" - ], - "properties": { - "approval": { - "type": "object", - "required": [ - "spender", - "token_id" - ], - "properties": { - "include_expired": { - "type": [ - "boolean", - "null" - ] - }, - "spender": { - "type": "string" - }, - "token_id": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "approvals" - ], - "properties": { - "approvals": { - "type": "object", - "required": [ - "token_id" - ], - "properties": { - "include_expired": { - "type": [ - "boolean", - "null" - ] - }, - "token_id": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "all_operators" - ], - "properties": { - "all_operators": { - "type": "object", - "required": [ - "owner" - ], - "properties": { - "include_expired": { - "type": [ - "boolean", - "null" - ] - }, - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "start_after": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "num_tokens" - ], - "properties": { - "num_tokens": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "contract_info" - ], - "properties": { - "contract_info": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "nft_info" - ], - "properties": { - "nft_info": { - "type": "object", - "required": [ - "token_id" - ], - "properties": { - "token_id": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "all_nft_info" - ], - "properties": { - "all_nft_info": { - "type": "object", - "required": [ - "token_id" - ], - "properties": { - "include_expired": { - "type": [ - "boolean", - "null" - ] - }, - "token_id": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "tokens" - ], - "properties": { - "tokens": { - "type": "object", - "required": [ - "owner" - ], - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "start_after": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "all_tokens" - ], - "properties": { - "all_tokens": { - "type": "object", - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "minter" - ], - "properties": { - "minter": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "collection_info" - ], - "properties": { - "collection_info": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Query the contract's ownership information", - "type": "object", - "required": [ - "ownership" - ], - "properties": { - "ownership": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] -} diff --git a/contracts/collections/sg721-metadata-onchain/schema/tokens_response.json b/contracts/collections/sg721-metadata-onchain/schema/tokens_response.json deleted file mode 100644 index 4728d37e2..000000000 --- a/contracts/collections/sg721-metadata-onchain/schema/tokens_response.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "TokensResponse", - "type": "object", - "required": [ - "tokens" - ], - "properties": { - "tokens": { - "description": "Contains all token_ids in lexicographical ordering If there are more than `limit`, use `start_after` in future queries to achieve pagination.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false -} diff --git a/contracts/collections/sg721-metadata-onchain/src/lib.rs b/contracts/collections/sg721-metadata-onchain/src/lib.rs deleted file mode 100644 index 33adf3417..000000000 --- a/contracts/collections/sg721-metadata-onchain/src/lib.rs +++ /dev/null @@ -1,207 +0,0 @@ -use cosmwasm_std::Empty; - -pub use sg721_base::ContractError; -use sg_metadata::Metadata; - -pub type Sg721MetadataContract<'a> = sg721_base::Sg721Contract<'a, Metadata>; -pub type InstantiateMsg = sg721::InstantiateMsg; -pub type ExecuteMsg = sg721::ExecuteMsg; -pub type QueryMsg = sg721_base::msg::QueryMsg; - -// version info for migration info -const CONTRACT_NAME: &str = "crates.io:sg721-metadata-onchain"; -const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); -pub const EARLIEST_VERSION: &str = "0.16.0"; -pub const TO_VERSION: &str = "3.0.0"; - -pub type Extension = Option; - -#[cfg(not(feature = "library"))] -pub mod entry { - use super::*; - - use cosmwasm_std::{ - entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdError, StdResult, - }; - - use sg721_base::{msg::QueryMsg, ContractError}; - - #[entry_point] - pub fn instantiate( - deps: DepsMut, - env: Env, - info: MessageInfo, - msg: InstantiateMsg, - ) -> Result { - cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - - let res = Sg721MetadataContract::default().instantiate(deps, env, info, msg)?; - - Ok(res - .add_attribute("contract_name", CONTRACT_NAME) - .add_attribute("contract_version", CONTRACT_VERSION)) - } - - #[entry_point] - pub fn execute( - deps: DepsMut, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, - ) -> Result { - Sg721MetadataContract::default().execute(deps, env, info, msg) - } - - #[entry_point] - pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { - Sg721MetadataContract::default().query(deps, env, msg) - } - - #[entry_point] - pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result { - // make sure the correct contract is being upgraded, and it's being - // upgraded from the correct version. - if CONTRACT_VERSION < EARLIEST_VERSION { - return Err( - StdError::generic_err("Cannot upgrade to a previous contract version").into(), - ); - } - if CONTRACT_VERSION > TO_VERSION { - return Err( - StdError::generic_err("Cannot upgrade to a previous contract version").into(), - ); - } - // if same version return - if CONTRACT_VERSION == TO_VERSION { - return Ok(Response::new()); - } - - // update contract version - cw2::set_contract_version(deps.storage, CONTRACT_NAME, TO_VERSION)?; - - // perform the upgrade - let cw17_res = cw721_base::upgrades::v0_17::migrate::(deps) - .map_err(|e| sg721_base::ContractError::MigrationError(e.to_string()))?; - let mut sgz_res = Response::new(); - sgz_res.attributes = cw17_res.attributes; - Ok(sgz_res) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - use cosmwasm_std::testing::{mock_env, mock_info, MockApi, MockQuerier, MockStorage}; - use cosmwasm_std::{ - from_json, to_json_binary, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, - QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, - }; - use cw721::Cw721Query; - use sg721::{CollectionInfo, ExecuteMsg, InstantiateMsg}; - use std::marker::PhantomData; - - const CREATOR: &str = "creator"; - - pub fn mock_deps() -> OwnedDeps { - OwnedDeps { - storage: MockStorage::default(), - api: MockApi::default(), - querier: CustomMockQuerier::new(MockQuerier::new(&[])), - custom_query_type: PhantomData, - } - } - - pub struct CustomMockQuerier { - base: MockQuerier, - } - - impl Querier for CustomMockQuerier { - fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { - let request: QueryRequest = match from_json(bin_request) { - Ok(v) => v, - Err(e) => { - return SystemResult::Err(SystemError::InvalidRequest { - error: format!("Parsing query request: {e}"), - request: bin_request.into(), - }) - } - }; - - self.handle_query(&request) - } - } - - impl CustomMockQuerier { - pub fn handle_query(&self, request: &QueryRequest) -> QuerierResult { - match &request { - QueryRequest::Wasm(WasmQuery::ContractInfo { contract_addr: _ }) => { - let mut response = ContractInfoResponse::default(); - response.code_id = 1; - response.creator = CREATOR.to_string(); - SystemResult::Ok(ContractResult::Ok(to_json_binary(&response).unwrap())) - } - _ => self.base.handle_query(request), - } - } - - pub fn new(base: MockQuerier) -> Self { - CustomMockQuerier { base } - } - } - - #[test] - fn use_metadata_extension() { - let mut deps = mock_deps(); - let contract = Sg721MetadataContract::default(); - - // instantiate contract - let info = mock_info(CREATOR, &[]); - let init_msg = InstantiateMsg { - name: "SpaceShips".to_string(), - symbol: "SPACE".to_string(), - minter: CREATOR.to_string(), - collection_info: CollectionInfo { - creator: CREATOR.to_string(), - description: "this is a test".to_string(), - image: "https://larry.engineer".to_string(), - external_link: None, - explicit_content: Some(false), - start_trading_time: None, - royalty_info: None, - }, - }; - contract - .instantiate(deps.as_mut(), mock_env(), info.clone(), init_msg) - .unwrap(); - - // mint token - let token_id = "Enterprise"; - let extension = Metadata { - description: Some("Spaceship with Warp Drive".into()), - name: Some("Starship USS Enterprise".to_string()), - ..Metadata::default() - }; - let mint_msg = ExecuteMsg::Mint { - token_id: token_id.to_string(), - owner: "john".to_string(), - token_uri: Some("https://starships.example.com/Starship/Enterprise.json".into()), - extension: extension.clone(), - }; - - contract - .execute(deps.as_mut(), mock_env(), info, mint_msg) - .unwrap(); - - // check token contains correct metadata - let res = contract - .parent - .nft_info(deps.as_ref(), token_id.into()) - .unwrap(); - assert_eq!( - res.token_uri, - Some("https://starships.example.com/Starship/Enterprise.json".into()) - ); - assert_eq!(res.extension, extension); - } -} diff --git a/contracts/collections/sg721-nt/examples/schema.rs b/contracts/collections/sg721-nt/examples/schema.rs index 28be4a0db..04bc938eb 100644 --- a/contracts/collections/sg721-nt/examples/schema.rs +++ b/contracts/collections/sg721-nt/examples/schema.rs @@ -5,11 +5,14 @@ use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, s use cosmwasm_std::Empty; -use cw721::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, ContractInfoResponse, Cw721QueryMsg, - NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::{ + msg::{ + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, Cw721QueryMsg, MinterResponse, + NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, + }, + ContractInfoResponse, }; -use cw721_base::MinterResponse; use sg721::InstantiateMsg; fn main() { @@ -19,7 +22,15 @@ fn main() { remove_schemas(&out_dir).unwrap(); export_schema(&schema_for!(InstantiateMsg), &out_dir); - export_schema(&schema_for!(Cw721QueryMsg), &out_dir); + export_schema( + &schema_for!( + Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + > + ), + &out_dir, + ); export_schema_with_title( &schema_for!(AllNftInfoResponse), &out_dir, diff --git a/contracts/collections/sg721-nt/src/lib.rs b/contracts/collections/sg721-nt/src/lib.rs index 38228800e..b444bfdd3 100644 --- a/contracts/collections/sg721-nt/src/lib.rs +++ b/contracts/collections/sg721-nt/src/lib.rs @@ -2,11 +2,26 @@ use cosmwasm_std::entry_point; pub mod msg; +use cosmwasm_std::Empty; +use cw721::{ + DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, +}; use cw721_base::Extension; use sg721::InstantiateMsg; use sg721_base::Sg721Contract; -pub type QueryMsg = sg721_base::msg::QueryMsg; -pub type Sg721NonTransferableContract<'a> = Sg721Contract<'a, Extension>; +pub type QueryMsg = sg721_base::msg::QueryMsg< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, +>; +pub type Sg721NonTransferableContract<'a> = Sg721Contract< + 'a, + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, +>; use sg721_base::msg::NftParams; // version info for migration info @@ -24,7 +39,8 @@ pub mod entry { use cosmwasm_std::{ Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdError, StdResult, }; - use cw721::Cw721Execute; + use cw721::msg::Cw721MigrateMsg; + use cw721_base::execute::Cw721Execute; use sg721_base::ContractError; #[entry_point] @@ -53,7 +69,7 @@ pub mod entry { match msg { ExecuteMsg::Burn { token_id } => Sg721NonTransferableContract::default() .parent - .burn(deps, env, info, token_id) + .burn_nft(deps, &env, &info, token_id) .map_err(|e| e.into()), ExecuteMsg::Mint { token_id, @@ -86,12 +102,12 @@ pub mod entry { } #[entry_point] - pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { + pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { Sg721NonTransferableContract::default().query(deps, env, msg) } #[entry_point] - pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result { + pub fn migrate(deps: DepsMut, env: Env, _msg: Empty) -> Result { // make sure the correct contract is being upgraded, and it's being // upgraded from the correct version. if CONTRACT_VERSION < EARLIEST_VERSION { @@ -113,10 +129,30 @@ pub mod entry { cw2::set_contract_version(deps.storage, CONTRACT_NAME, TO_VERSION)?; // perform the upgrade - let cw17_res = cw721_base::upgrades::v0_17::migrate::(deps) - .map_err(|e| sg721_base::ContractError::MigrationError(e.to_string()))?; + // cw721 migration allows all versions: 0.18. 0.17, 0.16 and older + let contract = Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::default(); + let migrate_msg = Cw721MigrateMsg::WithUpdate { + minter: None, + creator: None, + }; + let cw721_res = contract + .parent + .migrate( + deps, + env.clone(), + migrate_msg, + CONTRACT_NAME, + CONTRACT_VERSION, + ) + .map_err(|e| ContractError::MigrationError(e.to_string()))?; let mut sgz_res = Response::new(); - sgz_res.attributes = cw17_res.attributes; + sgz_res.attributes = cw721_res.attributes; Ok(sgz_res) } } diff --git a/contracts/collections/sg721-updatable/examples/schema.rs b/contracts/collections/sg721-updatable/examples/schema.rs index 44d07d85a..c13cc631f 100644 --- a/contracts/collections/sg721-updatable/examples/schema.rs +++ b/contracts/collections/sg721-updatable/examples/schema.rs @@ -4,12 +4,12 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; use cosmwasm_std::Empty; -pub use cw721::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, ContractInfoResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, -}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +pub use cw721_base::{ContractInfoResponse,msg::{ + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, NftInfoResponse, + NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, MinterResponse +}}; use cw721_base::Extension; -pub use cw721_base::MinterResponse; use sg721::InstantiateMsg; pub use sg721_base::msg::CollectionInfoResponse; use sg721_base::msg::QueryMsg; @@ -23,7 +23,10 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema(&schema_for!(QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >), &out_dir); export_schema(&schema_for!(CollectionInfoResponse), &out_dir); export_schema_with_title( &schema_for!(AllNftInfoResponse), diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index e48cb2e24..728a9363c 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -7,6 +7,10 @@ use cosmwasm_std::{Deps, StdResult}; #[cfg(not(feature = "library"))] use cosmwasm_std::{DepsMut, Env, Event, MessageInfo}; use cw2::set_contract_version; +use cw721::{ + DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, +}; use semver::Version; use sg721::InstantiateMsg; use sg721_base::msg::CollectionInfoResponse; @@ -19,7 +23,14 @@ use cw_utils::nonpayable; use sg1::checked_fair_burn; use sg721_base::ContractError::Unauthorized; use sg721_base::Sg721Contract; -pub type Sg721UpdatableContract<'a> = Sg721Contract<'a, Extension>; +pub type Sg721UpdatableContract<'a> = Sg721Contract< + 'a, + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, +>; const CONTRACT_NAME: &str = "crates.io:sg721-updatable"; const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -125,7 +136,7 @@ pub fn execute_update_token_metadata( } // Update token metadata - Sg721UpdatableContract::default().tokens.update( + Sg721UpdatableContract::default().config.nft_info.update( deps.storage, &token_id, |token| match token { @@ -237,7 +248,7 @@ mod tests { from_json, to_json_binary, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, }; - use cw721::Cw721Query; + use cw721_base::query::Cw721Query; use sg721::{CollectionInfo, InstantiateMsg}; use std::marker::PhantomData; @@ -349,24 +360,25 @@ mod tests { ); // Update token metadata - execute(deps.as_mut(), mock_env(), info.clone(), update_msg).unwrap(); + let env = mock_env(); + execute(deps.as_mut(), env.clone(), info.clone(), update_msg).unwrap(); // Check token contains updated metadata let res = contract .parent - .nft_info(deps.as_ref(), token_id.into()) + .query_nft_info(deps.as_ref(), &env, token_id.into()) .unwrap(); assert_eq!(res.token_uri, updated_token_uri); // Update token metadata with None token_uri - let update_msg = ExecuteMsg::::UpdateTokenMetadata { + let update_msg = ExecuteMsg::::UpdateTokenMetadata { token_id: token_id.to_string(), token_uri: None, }; execute(deps.as_mut(), mock_env(), info.clone(), update_msg).unwrap(); let res = contract .parent - .nft_info(deps.as_ref(), token_id.into()) + .query_nft_info(deps.as_ref(), &env, token_id.into()) .unwrap(); assert_eq!(res.token_uri, None); diff --git a/contracts/collections/sg721-updatable/src/lib.rs b/contracts/collections/sg721-updatable/src/lib.rs index 7d2f9c214..78cface3a 100644 --- a/contracts/collections/sg721-updatable/src/lib.rs +++ b/contracts/collections/sg721-updatable/src/lib.rs @@ -20,6 +20,7 @@ pub mod entry { }; use cosmwasm_std::{entry_point, to_json_binary, Empty}; use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult}; + use cw721::{DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg}; use cw721_base::Extension; #[entry_point] @@ -37,7 +38,7 @@ pub mod entry { deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg, ) -> Result { match msg { ExecuteMsg::FreezeTokenMetadata {} => execute_freeze_token_metadata(deps, env, info), @@ -53,12 +54,12 @@ pub mod entry { } #[entry_point] - pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { + pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { match msg { - QueryMsg::EnableUpdatable {} => to_json_binary(&query_enable_updatable(deps)?), - QueryMsg::EnableUpdatableFee {} => to_json_binary(&query_enable_updatable_fee()?), - QueryMsg::FreezeTokenMetadata {} => to_json_binary(&query_frozen_token_metadata(deps)?), - _ => Sg721UpdatableContract::default().query(deps, env, msg.into()), + QueryMsg::EnableUpdatable {} => Ok(to_json_binary(&query_enable_updatable(deps)?)?), + QueryMsg::EnableUpdatableFee {} => Ok(to_json_binary(&query_enable_updatable_fee()?)?), + QueryMsg::FreezeTokenMetadata {} => Ok(to_json_binary(&query_frozen_token_metadata(deps)?)?), + _ => Ok(Sg721UpdatableContract::default().query(deps, env, msg.into())?), } } diff --git a/contracts/collections/sg721-updatable/src/msg.rs b/contracts/collections/sg721-updatable/src/msg.rs index 47f6980f3..29b7d1051 100644 --- a/contracts/collections/sg721-updatable/src/msg.rs +++ b/contracts/collections/sg721-updatable/src/msg.rs @@ -1,13 +1,16 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::Binary; use cosmwasm_std::Timestamp; +use cw721::DefaultOptionCollectionMetadataExtension; +use cw721::DefaultOptionNftMetadataExtension; +use cw721::DefaultOptionNftMetadataExtensionMsg; use cw_utils::Expiration; use sg721::{RoyaltyInfoResponse, UpdateCollectionInfoMsg}; use sg721_base::msg::QueryMsg as Sg721QueryMsg; use sg721_base::ExecuteMsg as Sg721ExecuteMsg; #[cw_serde] -pub enum ExecuteMsg { +pub enum ExecuteMsg { /// Freeze token metadata so creator can no longer update token uris FreezeTokenMetadata {}, /// Creator calls can update token uris @@ -61,19 +64,21 @@ pub enum ExecuteMsg { /// Metadata JSON Schema token_uri: Option, /// Any custom extension used by this contract - extension: T, + extension: TNftMetadataExtensionMsg, }, Extension { - msg: E, + msg: TCollectionMetadataExtensionMsg, }, } -impl From> for Sg721ExecuteMsg +impl + From> for Sg721ExecuteMsg where - T: Clone + PartialEq + Into>, - Option: From, + TNftMetadataExtensionMsg: Clone + PartialEq + Into, { - fn from(msg: ExecuteMsg) -> Sg721ExecuteMsg { + fn from( + msg: ExecuteMsg, + ) -> Sg721ExecuteMsg { match msg { ExecuteMsg::TransferNft { recipient, @@ -177,8 +182,13 @@ pub enum QueryMsg { CollectionInfo {}, } -impl From for Sg721QueryMsg { - fn from(msg: QueryMsg) -> Sg721QueryMsg { +impl From + for Sg721QueryMsg +{ + fn from( + msg: QueryMsg, + ) -> Sg721QueryMsg + { match msg { QueryMsg::OwnerOf { token_id, diff --git a/contracts/minters/base-minter/src/contract.rs b/contracts/minters/base-minter/src/contract.rs index 195761eed..3b12ac339 100644 --- a/contracts/minters/base-minter/src/contract.rs +++ b/contracts/minters/base-minter/src/contract.rs @@ -10,6 +10,7 @@ use cosmwasm_std::{ Reply, Response, StdResult, SubMsg, Timestamp, WasmMsg, }; use cw2::set_contract_version; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_utils::{must_pay, nonpayable, parse_reply_instantiate_data}; use sg1::checked_fair_burn; use sg2::query::Sg2QueryMsg; @@ -121,7 +122,10 @@ pub fn execute_mint_sender( // Should mint and then list on the marketplace for secondary sales let collection_info: CollectionInfoResponse = deps.querier.query_wasm_smart( collection_address.clone(), - &Sg721QueryMsg::CollectionInfo {}, + &Sg721QueryMsg::CollectionInfo::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + > {}, )?; // allow only sg721 creator address to mint if collection_info.creator != info.sender { @@ -183,7 +187,7 @@ pub fn execute_update_start_trading_time( let collection_info: CollectionInfoResponse = deps.querier.query_wasm_smart( sg721_contract_addr.clone(), - &Sg721QueryMsg::CollectionInfo {}, + &Sg721QueryMsg::::CollectionInfo {}, )?; if info.sender != collection_info.creator { return Err(ContractError::Unauthorized( diff --git a/packages/sg721/Cargo.toml b/packages/sg721/Cargo.toml index 3e160be49..fd55a8469 100644 --- a/packages/sg721/Cargo.toml +++ b/packages/sg721/Cargo.toml @@ -32,7 +32,7 @@ cw721-base = { workspace = true, features = ["library"] } cw-utils = { workspace = true } serde = { workspace = true } thiserror = { workspace = true } -cw-ownable = "0.5.0" +cw-ownable = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/packages/sg721/src/lib.rs b/packages/sg721/src/lib.rs index d7008c68f..acf738e96 100644 --- a/packages/sg721/src/lib.rs +++ b/packages/sg721/src/lib.rs @@ -1,11 +1,49 @@ use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Binary, Decimal, Timestamp}; -use cw_ownable::cw_ownable_execute; +use cosmwasm_std::{Addr, Binary, Coin, Decimal, Timestamp}; +use cw721_base::{ + msg::{ + CollectionMetadataExtensionMsg, CollectionMetadataMsg, ExecuteMsg as Cw721ExecuteMsg, InstantiateMsg as Cw721InstantiateMsg + }, + state::{ + CollectionMetadata, CollectionMetadataExtension, + }, + DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, +}; +use cw_ownable::Action; use cw_utils::Expiration; -#[cw_ownable_execute] +pub type RoyaltyInfoResponse = cw721_base::msg::RoyaltyInfoResponse; +pub use cw721_base::state::RoyaltyInfo; + #[cw_serde] -pub enum ExecuteMsg { +pub enum ExecuteMsg< + // Message passed for updating metadata. + TNftMetadataExtensionMsg, + // Message passed for updating collection info extension. + TCollectionMetadataExtensionMsg, +> { + // ---- sg721 specific msgs ---- + /// Update specific collection info fields + #[deprecated = "Please use UpdateCollectionInfo instead"] + UpdateCollectionInfo { + collection_info: UpdateCollectionInfoMsg, + }, + /// Called by the minter to update trading start time + UpdateStartTradingTime(Option), + // Freeze collection info from further updates + FreezeCollectionInfo, + + // ---- cw721 v0.19.0 msgs ---- + #[deprecated(since = "0.19.0", note = "Please use UpdateMinterOwnership instead")] + /// Deprecated: use UpdateMinterOwnership instead! Will be removed in next release! + UpdateOwnership(Action), + UpdateMinterOwnership(Action), + UpdateCreatorOwnership(Action), + + /// The creator is the only one eligible to update `CollectionMetadata`. + UpdateCollectionMetadata { + collection_metadata: CollectionMetadataMsg, + }, /// Transfer is a base message to move a token to another account without triggering actions TransferNft { recipient: String, @@ -40,6 +78,7 @@ pub enum ExecuteMsg { RevokeAll { operator: String, }, + /// Mint a new NFT, can only be called by the contract minter Mint { /// Unique ID of the NFT @@ -51,27 +90,144 @@ pub enum ExecuteMsg { /// Metadata JSON Schema token_uri: Option, /// Any custom extension used by this contract - extension: T, + extension: TNftMetadataExtensionMsg, }, + /// Burn an NFT the sender has access to Burn { token_id: String, }, - /// Extension msg + + /// Metadata msg + #[deprecated(since = "0.19.0", note = "Please use UpdateNftMetadata instead")] + /// Deprecated: use UpdateNftMetadata instead! In previous release it was a no-op for customization in other contracts. Will be removed in next release! Extension { - msg: E, + msg: TNftMetadataExtensionMsg, }, - /// Update specific collection info fields - UpdateCollectionInfo { - collection_info: UpdateCollectionInfoMsg, + /// The creator is the only one eligible to update NFT's token uri and onchain metadata (`NftInfo.extension`). + /// NOTE: approvals and owner are not affected by this call, since they belong to the NFT owner. + UpdateNftInfo { + token_id: String, + token_uri: Option, + extension: TNftMetadataExtensionMsg, + }, + + /// Sets address to send withdrawn fees to. Only owner can call this. + SetWithdrawAddress { + address: String, + }, + /// Removes the withdraw address, so fees are sent to the contract. Only owner can call this. + RemoveWithdrawAddress {}, + /// Withdraw from the contract to the given address. Anyone can call this, + /// which is okay since withdraw address has been set by owner. + WithdrawFunds { + amount: Coin, }, - /// Called by the minter to update trading start time - UpdateStartTradingTime(Option), - // Freeze collection info from further updates - FreezeCollectionInfo, +} + +impl + From< + ExecuteMsg< + TNftMetadataExtensionMsg, + TCollectionMetadataExtensionMsg, + >, + > + for Cw721ExecuteMsg< + TNftMetadataExtensionMsg, + TCollectionMetadataExtensionMsg, + > +{ + fn from( + msg: ExecuteMsg< + TNftMetadataExtensionMsg, + TCollectionMetadataExtensionMsg, + >, + ) -> Self { + match msg { + // ---- sg721 msgs ---- + ExecuteMsg::UpdateCollectionInfo { collection_info } => { + panic!("not a cw721 msg") + } + ExecuteMsg::UpdateStartTradingTime(_) => panic!("not a cw721 msg"), + ExecuteMsg::FreezeCollectionInfo => panic!("not a cw721 msg"), + // ---- cw721 msgs ---- + ExecuteMsg::UpdateOwnership(action) => Cw721ExecuteMsg::UpdateOwnership(action), + ExecuteMsg::UpdateMinterOwnership(action) => { + Cw721ExecuteMsg::UpdateMinterOwnership(action) + } + ExecuteMsg::UpdateCreatorOwnership(action) => { + Cw721ExecuteMsg::UpdateCreatorOwnership(action) + } + ExecuteMsg::UpdateCollectionMetadata { + collection_metadata, + } => Cw721ExecuteMsg::UpdateCollectionMetadata { + collection_metadata, + }, + ExecuteMsg::TransferNft { + recipient, + token_id, + } => Cw721ExecuteMsg::TransferNft { + recipient, + token_id, + }, + ExecuteMsg::SendNft { + contract, + token_id, + msg, + } => Cw721ExecuteMsg::SendNft { + contract, + token_id, + msg, + }, + ExecuteMsg::Approve { + spender, + token_id, + expires, + } => Cw721ExecuteMsg::Approve { + spender, + token_id, + expires, + }, + ExecuteMsg::Revoke { spender, token_id } => { + Cw721ExecuteMsg::Revoke { spender, token_id } + } + ExecuteMsg::ApproveAll { operator, expires } => { + Cw721ExecuteMsg::ApproveAll { operator, expires } + } + ExecuteMsg::RevokeAll { operator } => Cw721ExecuteMsg::RevokeAll { operator }, + ExecuteMsg::Mint { + token_id, + owner, + token_uri, + extension, + } => Cw721ExecuteMsg::Mint { + token_id, + owner, + token_uri, + extension, + }, + ExecuteMsg::Burn { token_id } => Cw721ExecuteMsg::Burn { token_id }, + ExecuteMsg::Extension { msg } => Cw721ExecuteMsg::Extension { msg }, + ExecuteMsg::UpdateNftInfo { + token_id, + token_uri, + extension, + } => Cw721ExecuteMsg::UpdateNftInfo { + token_id, + token_uri, + extension, + }, + ExecuteMsg::SetWithdrawAddress { address } => { + Cw721ExecuteMsg::SetWithdrawAddress { address } + } + ExecuteMsg::RemoveWithdrawAddress {} => Cw721ExecuteMsg::RemoveWithdrawAddress {}, + ExecuteMsg::WithdrawFunds { amount } => Cw721ExecuteMsg::WithdrawFunds { amount }, + } + } } #[cw_serde] +#[deprecated = "Please use CollectionMetadata instead"] pub struct CollectionInfo { pub creator: String, pub description: String, @@ -82,7 +238,22 @@ pub struct CollectionInfo { pub royalty_info: Option, } +#[allow(deprecated)] +impl From> for DefaultOptionCollectionMetadataExtensionMsg { + fn from(info: CollectionInfo) -> Self { + Some(CollectionMetadataExtensionMsg { + description: Some(info.description), + image: Some(info.image), + external_link: info.external_link, + explicit_content: info.explicit_content, + start_trading_time: info.start_trading_time, + royalty_info: info.royalty_info, + }) + } +} + #[cw_serde] +#[deprecated = "Please use `UpdateCollectionMetadata` instead"] pub struct UpdateCollectionInfoMsg { pub description: Option, pub image: Option, @@ -92,32 +263,38 @@ pub struct UpdateCollectionInfoMsg { pub creator: Option, } -#[cw_serde] -pub struct RoyaltyInfo { - pub payment_address: Addr, - pub share: Decimal, -} - -// allows easy conversion from RoyaltyInfo to RoyaltyInfoResponse -impl RoyaltyInfo { - pub fn to_response(&self) -> RoyaltyInfoResponse { - RoyaltyInfoResponse { - payment_address: self.payment_address.to_string(), - share: self.share, +#[allow(deprecated)] +impl From> for CollectionMetadataExtensionMsg { + fn from(msg: UpdateCollectionInfoMsg) -> Self { + CollectionMetadataExtensionMsg { + description: msg.description, + image: msg.image, + external_link: msg.external_link.unwrap_or_default(), + explicit_content: msg.explicit_content, + royalty_info: msg.royalty_info.unwrap_or_default(), + start_trading_time: None, } } } -#[cw_serde] -pub struct RoyaltyInfoResponse { - pub payment_address: String, - pub share: Decimal, -} - #[cw_serde] pub struct InstantiateMsg { pub name: String, pub symbol: String, pub minter: String, + #[allow(deprecated)] pub collection_info: CollectionInfo, } + +impl From for Cw721InstantiateMsg { + fn from(msg: InstantiateMsg) -> Self { + Cw721InstantiateMsg { + name: msg.name, + symbol: msg.symbol, + minter: Some(msg.minter), + creator: None, // in case of none, sender is creator + collection_metadata_extension: msg.collection_info.into(), + withdraw_address: None, + } + } +} diff --git a/test-suite/Cargo.toml b/test-suite/Cargo.toml index 76e42728b..0de8ba3e5 100644 --- a/test-suite/Cargo.toml +++ b/test-suite/Cargo.toml @@ -60,7 +60,7 @@ base-factory = { workspace = true } base-minter = { workspace = true } sg721-nt = { workspace = true } sg-controllers = { workspace = true } -cw-ownable = "0.5.1" +cw-ownable = { workspace = true } serde = { workspace = true } anybuf = { workspace = true } diff --git a/test-suite/src/base_minter/tests/integration_tests.rs b/test-suite/src/base_minter/tests/integration_tests.rs index 77837ba70..3f4d3386d 100644 --- a/test-suite/src/base_minter/tests/integration_tests.rs +++ b/test-suite/src/base_minter/tests/integration_tests.rs @@ -9,7 +9,8 @@ use base_factory::msg::{BaseMinterCreateMsg, BaseUpdateParamsMsg, SudoMsg}; use base_minter::msg::{ConfigResponse, ExecuteMsg}; use cosmwasm_std::{coin, coins, Addr, Timestamp}; -use cw721::{Cw721ExecuteMsg, Cw721QueryMsg, OwnerOfResponse}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::msg::{Cw721ExecuteMsg, Cw721QueryMsg, OwnerOfResponse}; use cw_multi_test::Executor; use sg2::msg::Sg2ExecuteMsg; use sg2::query::{AllowedCollectionCodeIdsResponse, Sg2QueryMsg}; @@ -154,7 +155,10 @@ fn check_mint() { assert_eq!(res.collection_address, "contract2".to_string()); assert_eq!(res.config.mint_price.amount.u128(), MIN_MINT_PRICE); - let query_owner_msg = Cw721QueryMsg::OwnerOf { + let query_owner_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::OwnerOf { token_id: String::from("1"), include_expired: None, }; @@ -165,7 +169,10 @@ fn check_mint() { assert_eq!(res.owner, creator.to_string()); // make sure sg721-nt cannot be transferred - let transfer_msg = Cw721ExecuteMsg::TransferNft { + let transfer_msg = Cw721ExecuteMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::TransferNft { recipient: "adsf".to_string(), token_id: "1".to_string(), }; @@ -220,7 +227,13 @@ fn update_start_trading_time() { // confirm trading start time let res: CollectionInfoResponse = router .wrap() - .query_wasm_smart(collection_addr, &Sg721QueryMsg::CollectionInfo {}) + .query_wasm_smart( + collection_addr, + &Sg721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); assert_eq!(res.start_trading_time, Some(default_start_trading_time)); } diff --git a/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs b/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs index 90204b742..29c8976cd 100644 --- a/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs +++ b/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs @@ -1,5 +1,6 @@ use cosmwasm_std::{coins, Coin, Timestamp, Uint128}; -use cw721::{Cw721QueryMsg, NumTokensResponse, OwnerOfResponse}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::msg::{Cw721QueryMsg, NumTokensResponse, OwnerOfResponse}; use cw_multi_test::{BankSudo, Executor, SudoMsg}; use open_edition_factory::state::ParamsExtension; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; @@ -209,7 +210,10 @@ fn check_mint_revenues_distribution(num_tokens: Option, end_minter_time: Op ); // Should be owner of the token -> 2 - let query_owner_msg = Cw721QueryMsg::OwnerOf { + let query_owner_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::OwnerOf { token_id: String::from("2"), include_expired: None, }; @@ -221,7 +225,10 @@ fn check_mint_revenues_distribution(num_tokens: Option, end_minter_time: Op assert_eq!(res.owner, buyer.to_string()); // Check mint count - let num_tokens_msg = Cw721QueryMsg::NumTokens {}; + let num_tokens_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::NumTokens {}; let res: NumTokensResponse = router .wrap() .query_wasm_smart(collection_addr, &num_tokens_msg) diff --git a/test-suite/src/sg721_base/tests/integration_tests.rs b/test-suite/src/sg721_base/tests/integration_tests.rs index e266bc0c3..0698b989c 100644 --- a/test-suite/src/sg721_base/tests/integration_tests.rs +++ b/test-suite/src/sg721_base/tests/integration_tests.rs @@ -3,7 +3,7 @@ mod tests { use crate::common_setup::contract_boxes::App; use anyhow::Error; use cosmwasm_std::{coin, Addr}; - use cw721::NumTokensResponse; + use cw721_base::msg::NumTokensResponse; use cw_multi_test::{AppResponse, BankSudo, Executor, SudoMsg}; use sg2::msg::CreateMinterMsg; use sg2::tests::mock_collection_params; @@ -113,13 +113,15 @@ mod tests { let cosmos_msg = factory_contract.call_with_funds(msg, creation_fee).unwrap(); let res = app.execute(Addr::unchecked(ADMIN), cosmos_msg); + println!(">>>>> {:?}", res); assert!(res.is_ok()); (app, Addr::unchecked("contract2")) } mod init { - use cw721_base::MinterResponse; + use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; + use cw721_base::msg::MinterResponse; use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; @@ -133,7 +135,13 @@ mod tests { let res: NumTokensResponse = app .wrap() - .query_wasm_smart(contract, &QueryMsg::NumTokens {}) + .query_wasm_smart( + contract, + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::NumTokens {}, + ) .unwrap(); assert_eq!(res.count, 0); } @@ -187,7 +195,13 @@ mod tests { // query minter config to confirm base_token_uri got trimmed let res: MinterResponse = app .wrap() - .query_wasm_smart(contract, &QueryMsg::Minter {}) + .query_wasm_smart( + contract, + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Minter {}, + ) .unwrap(); let minter = res.minter; let minter = minter.unwrap(); @@ -214,7 +228,13 @@ mod tests { // query minter config to confirm base_token_uri got trimmed and starts with ipfs let res: MinterResponse = app .wrap() - .query_wasm_smart(contract, &QueryMsg::Minter {}) + .query_wasm_smart( + contract, + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Minter {}, + ) .unwrap(); let minter = res.minter.unwrap(); let res: ConfigResponse = app @@ -235,7 +255,13 @@ mod tests { let (app, contract) = custom_proper_instantiate(custom_create_minter_msg); let res: MinterResponse = app .wrap() - .query_wasm_smart(contract, &QueryMsg::Minter {}) + .query_wasm_smart( + contract, + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Minter {}, + ) .unwrap(); let minter = res.minter.unwrap(); let res: ConfigResponse = app @@ -248,6 +274,7 @@ mod tests { mod start_trading_time { use cosmwasm_std::{Decimal, Empty}; + use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use sg721::{RoyaltyInfoResponse, UpdateCollectionInfoMsg}; use crate::common_setup::{ @@ -305,7 +332,13 @@ mod tests { // default trading start time is start time + default trading start time offset let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract, &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract, + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); let default_start_time = mock_init_extension(None, None) .start_time @@ -450,7 +483,13 @@ mod tests { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract.clone(), &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); assert_eq!(res.royalty_info.unwrap(), royalty_info); @@ -474,7 +513,13 @@ mod tests { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract.clone(), &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); // check explicit content changed to true assert!(res.explicit_content.unwrap()); @@ -521,6 +566,7 @@ mod tests { use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; use cosmwasm_std::{Decimal, Response, Uint128}; + use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use sg2::msg::CollectionParams; use sg721::RoyaltyInfoResponse; use sg721_base::msg::{CollectionInfoResponse, QueryMsg}; @@ -531,7 +577,13 @@ mod tests { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract.clone(), &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); // payout 100stars, royalty share 10%, royalty payout 10stars @@ -573,7 +625,13 @@ mod tests { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract.clone(), &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); // payout 100stars, royalty share 0%, royalty payout 0stars @@ -614,7 +672,13 @@ mod tests { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract.clone(), &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); // payout 100stars, royalty share 91%, royalty payout fails @@ -655,7 +719,13 @@ mod tests { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract.clone(), &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); // payout 100stars, royalty share 1%, royalty payout 10stars @@ -694,7 +764,13 @@ mod tests { let res: CollectionInfoResponse = app .wrap() - .query_wasm_smart(contract.clone(), &QueryMsg::CollectionInfo {}) + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, + ) .unwrap(); // payout 100stars, royalty share none, royalty payout 0stars @@ -714,7 +790,8 @@ mod tests { mod ownership { use cosmwasm_std::Attribute; - use cw721_base::MinterResponse; + use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; + use cw721_base::msg::MinterResponse; use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; @@ -736,7 +813,13 @@ mod tests { // query minter config to confirm base_token_uri got trimmed let res: MinterResponse = app .wrap() - .query_wasm_smart(contract, &QueryMsg::Minter {}) + .query_wasm_smart( + contract, + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Minter {}, + ) .unwrap(); let minter = res.minter; let minter = minter.unwrap(); @@ -747,7 +830,7 @@ mod tests { let sg721_address = res.sg721_address; let update_ownership_msg: cw721ExecuteMsg = - cw721ExecuteMsg::UpdateOwnership(cw_ownable::Action::TransferOwnership { + cw721ExecuteMsg::UpdateMinterOwnership(cw_ownable::Action::TransferOwnership { new_owner: "new_owner".to_string(), expiry: None, }); @@ -757,17 +840,21 @@ mod tests { &update_ownership_msg, &[], ); - let attribute_owner_response = res.unwrap().events[1].clone().attributes[2].clone(); + // get attribute with key "pending_owner" + let attribute_minter_owner_response = res.unwrap().events[1].clone().attributes.iter().find(|x| x.key == "pending_owner").expect("pending_owner not found").clone(); let expected_attribute = Attribute { key: "pending_owner".to_string(), value: "new_owner".to_string(), }; - assert_eq!(attribute_owner_response, expected_attribute); + assert_eq!(attribute_minter_owner_response, expected_attribute); let res: cw_ownable::Ownership = app .wrap() .query_wasm_smart( sg721_address.clone(), - &sg721_base::msg::QueryMsg::Ownership {}, + &sg721_base::msg::QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::GetMinterOwnership {}, ) .unwrap(); let pending_owner = res.pending_owner; @@ -782,16 +869,22 @@ mod tests { &accept_ownership_msg, &[], ); - let pending_owner_response = res.unwrap().events[1].clone().attributes[2].clone(); + let attribute_minter_owner_response = res.unwrap().events[1].clone().attributes.iter().find(|x| x.key == "pending_owner").expect("pending_owner not found").clone(); let expected_pending_owner_response = Attribute { key: "pending_owner".to_string(), value: "none".to_string(), }; - assert_eq!(pending_owner_response, expected_pending_owner_response); + assert_eq!(attribute_minter_owner_response, expected_pending_owner_response); let res: cw_ownable::Ownership = app .wrap() - .query_wasm_smart(sg721_address, &sg721_base::msg::QueryMsg::Ownership {}) + .query_wasm_smart( + sg721_address, + &sg721_base::msg::QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::GetMinterOwnership {}, + ) .unwrap(); let expected_onwership_response = Ownership { @@ -806,7 +899,7 @@ mod tests { mod sg721_mutable { use crate::common_setup::contract_boxes::App; use cosmwasm_std::{coin, Addr}; - use cw721::NumTokensResponse; + use cw721::msg::NumTokensResponse; use cw_multi_test::{BankSudo, Executor, SudoMsg}; use sg2::tests::mock_collection_params; use sg721_updatable::msg::QueryMsg; diff --git a/test-suite/src/vending_minter/tests/address_limit.rs b/test-suite/src/vending_minter/tests/address_limit.rs index 8472edf0b..9d4deb795 100644 --- a/test-suite/src/vending_minter/tests/address_limit.rs +++ b/test-suite/src/vending_minter/tests/address_limit.rs @@ -11,7 +11,8 @@ use crate::common_setup::{ templates::vending_minter_template, }; use cosmwasm_std::{coin, coins, Coin, Timestamp, Uint128}; -use cw721::{Cw721QueryMsg, OwnerOfResponse, TokensResponse}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::msg::{Cw721QueryMsg, OwnerOfResponse, TokensResponse}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; @@ -348,7 +349,10 @@ fn mint_for_token_id_addr() { assert!(res.is_ok()); // get random mint token_id - let tokens_msg = Cw721QueryMsg::Tokens { + let tokens_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Tokens { owner: buyer.to_string(), start_after: None, limit: None, @@ -460,7 +464,7 @@ fn mint_for_token_id_addr() { .wrap() .query_wasm_smart( collection_addr, - &Cw721QueryMsg::OwnerOf { + &Cw721QueryMsg::::OwnerOf { token_id: 2.to_string(), include_expired: None, }, diff --git a/test-suite/src/vending_minter/tests/happy_unhappy.rs b/test-suite/src/vending_minter/tests/happy_unhappy.rs index 1585ce4e0..2dc368ae6 100644 --- a/test-suite/src/vending_minter/tests/happy_unhappy.rs +++ b/test-suite/src/vending_minter/tests/happy_unhappy.rs @@ -8,7 +8,8 @@ use cosmwasm_std::{ testing::{mock_dependencies_with_balance, mock_env, mock_info}, Api, Coin, Timestamp, Uint128, }; -use cw721::{Cw721QueryMsg, OwnerOfResponse}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::msg::{Cw721QueryMsg, OwnerOfResponse}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; @@ -149,7 +150,10 @@ fn happy_path() { // Check NFT owned by buyer // Random mint token_id 1 - let query_owner_msg = Cw721QueryMsg::OwnerOf { + let query_owner_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::OwnerOf { token_id: String::from("2"), include_expired: None, }; @@ -208,7 +212,7 @@ fn happy_path() { assert_eq!(0, minter_balance.len()); // Check that NFT is transferred - let query_owner_msg = Cw721QueryMsg::OwnerOf { + let query_owner_msg = Cw721QueryMsg::::OwnerOf { token_id: String::from("1"), include_expired: None, }; diff --git a/test-suite/src/vending_minter/tests/trading_time.rs b/test-suite/src/vending_minter/tests/trading_time.rs index 8d0436c3d..57cca5325 100644 --- a/test-suite/src/vending_minter/tests/trading_time.rs +++ b/test-suite/src/vending_minter/tests/trading_time.rs @@ -6,6 +6,7 @@ use crate::common_setup::setup_minter::vending_minter::setup::{ }; use crate::common_setup::templates::{vending_minter_with_app, vending_minter_with_start_time}; use cosmwasm_std::{coins, Addr, Timestamp}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; use sg721_base::msg::{CollectionInfoResponse, QueryMsg as Sg721QueryMsg}; @@ -281,7 +282,7 @@ fn update_start_trading_time() { .wrap() .query_wasm_smart( collection_addr.to_string(), - &Sg721QueryMsg::CollectionInfo {}, + &Sg721QueryMsg::::CollectionInfo {}, ) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/trading_time_updatable.rs b/test-suite/src/vending_minter/tests/trading_time_updatable.rs index ac3680c31..ac9dadf66 100644 --- a/test-suite/src/vending_minter/tests/trading_time_updatable.rs +++ b/test-suite/src/vending_minter/tests/trading_time_updatable.rs @@ -8,6 +8,7 @@ use crate::common_setup::templates::{ vending_minter_updatable_with_app, vending_minter_with_updatable_and_start_time, }; use cosmwasm_std::{coins, Addr, Timestamp}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; use sg721_base::msg::{CollectionInfoResponse, QueryMsg as Sg721QueryMsg}; @@ -287,7 +288,7 @@ fn update_start_trading_time() { .wrap() .query_wasm_smart( collection_addr.to_string(), - &Sg721QueryMsg::CollectionInfo {}, + &Sg721QueryMsg::::CollectionInfo {}, ) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/updatable.rs b/test-suite/src/vending_minter/tests/updatable.rs index af3d9be20..4a14ea2dc 100644 --- a/test-suite/src/vending_minter/tests/updatable.rs +++ b/test-suite/src/vending_minter/tests/updatable.rs @@ -1,5 +1,6 @@ use cosmwasm_std::{coins, Empty}; -use cw721::{Cw721QueryMsg, NftInfoResponse, TokensResponse}; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::msg::{Cw721QueryMsg, NftInfoResponse, TokensResponse}; use cw721_base::Extension; use cw_multi_test::Executor; use sg721_updatable::msg::ExecuteMsg as Sg721UpdatableExecMsg; @@ -33,7 +34,7 @@ fn update_token_metadata() { assert!(res.is_ok()); // query buyer token_id - let query_tokens_msg = Cw721QueryMsg::Tokens { + let query_tokens_msg = Cw721QueryMsg::::Tokens { owner: buyer.to_string(), start_after: None, limit: None, @@ -59,7 +60,7 @@ fn update_token_metadata() { .query_wasm_smart(collection_addr.clone(), &query_tokens_msg) .unwrap(); assert_eq!(res.tokens[0], token_id); - let query_token_msg = Cw721QueryMsg::NftInfo { token_id }; + let query_token_msg = Cw721QueryMsg::::NftInfo { token_id }; let res: NftInfoResponse = router .wrap() .query_wasm_smart(collection_addr, &query_token_msg) diff --git a/test-suite/src/vending_minter/tests/whitelist.rs b/test-suite/src/vending_minter/tests/whitelist.rs index 662ac47d6..a81e97b89 100644 --- a/test-suite/src/vending_minter/tests/whitelist.rs +++ b/test-suite/src/vending_minter/tests/whitelist.rs @@ -1,6 +1,7 @@ use cosmwasm_std::{coin, coins, Addr, Empty, Timestamp}; -use cw721::{Cw721QueryMsg, TokensResponse}; -use cw721_base::ExecuteMsg as Cw721ExecuteMsg; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::msg::ExecuteMsg as Cw721ExecuteMsg; +use cw721_base::msg::{Cw721QueryMsg, TokensResponse}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; @@ -277,7 +278,10 @@ fn whitelist_mint_count_query() { assert_eq!(res.address, buyer.to_string()); // get random mint token_id - let tokens_msg = Cw721QueryMsg::Tokens { + let tokens_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Tokens { owner: buyer.to_string(), start_after: None, limit: None, diff --git a/test-suite/src/vending_minter/tests/zero_mint_price.rs b/test-suite/src/vending_minter/tests/zero_mint_price.rs index 824976503..c1cd3f66d 100644 --- a/test-suite/src/vending_minter/tests/zero_mint_price.rs +++ b/test-suite/src/vending_minter/tests/zero_mint_price.rs @@ -10,7 +10,9 @@ use crate::common_setup::setup_minter::vending_minter::mock_params::{ }; use crate::common_setup::setup_minter::vending_minter::setup::vending_minter_code_ids; use cosmwasm_std::{coin, coins, Addr, Timestamp}; -use cw721::TokensResponse; +use cw721::DefaultOptionCollectionMetadataExtension; +use cw721::DefaultOptionNftMetadataExtension; +use cw721_base::msg::TokensResponse; use cw_multi_test::Executor; use sg2::msg::Sg2ExecuteMsg; use sg2::tests::{mock_collection_params, mock_collection_params_1}; @@ -100,7 +102,7 @@ fn zero_mint_price() { .wrap() .query_wasm_smart( sg721, - &sg721_base::msg::QueryMsg::Tokens { + &sg721_base::msg::QueryMsg::::Tokens { owner: buyer.to_string(), start_after: None, limit: None, From 67635de4724497d2b335d11399596ce95e150ba2 Mon Sep 17 00:00:00 2001 From: mr-t Date: Mon, 18 Mar 2024 18:44:23 +0100 Subject: [PATCH 02/20] fix tests --- Cargo.lock | 1496 ++++++++++------- Cargo.toml | 2 +- .../collections/sg721-base/src/contract.rs | 40 +- packages/sg2/src/tests.rs | 1 + packages/sg721/src/lib.rs | 3 +- .../base_minter/tests/integration_tests.rs | 1 + .../src/sg721_base/tests/integration_tests.rs | 42 +- 7 files changed, 964 insertions(+), 621 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ade1b2f55..570128309 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,43 +3,47 @@ version = 3 [[package]] -name = "aes" -version = "0.8.2" +name = "addr2line" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", + "gimli", ] [[package]] -name = "ahash" -version = "0.7.6" +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "getrandom", - "once_cell", - "version_check", + "cfg-if", + "cipher", + "cpufeatures", ] [[package]] name = "ahash" -version = "0.8.3" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "cfg-if", + "getrandom", "once_cell", "version_check", ] [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -52,15 +56,15 @@ checksum = "9a03eb4d55fa21466cac727930be07f82581223ee04bcaf61f934e98b7ecb859" [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "assert_matches" @@ -70,71 +74,114 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "async-channel" -version = "1.8.0" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 5.2.0", + "event-listener-strategy 0.5.0", "futures-core", + "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.5.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock", + "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand", - "futures-lite", + "fastrand 2.0.1", + "futures-lite 2.3.0", "slab", ] [[package]] name = "async-global-executor" -version = "2.3.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel", + "async-channel 2.2.0", "async-executor", - "async-io", - "async-lock", + "async-io 2.3.2", + "async-lock 3.3.0", "blocking", - "futures-lite", + "futures-lite 2.3.0", "once_cell", ] [[package]] name = "async-io" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", + "cfg-if", "concurrent-queue", - "futures-lite", - "libc", + "futures-lite 1.13.0", "log", "parking", - "polling", + "polling 2.8.0", + "rustix 0.37.27", "slab", - "socket2", + "socket2 0.4.10", "waker-fn", - "windows-sys 0.42.0", +] + +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.5.0", + "rustix 0.38.31", + "slab", + "tracing", + "windows-sys 0.52.0", ] [[package]] name = "async-lock" -version = "2.7.0" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" dependencies = [ - "event-listener", + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", ] [[package]] @@ -143,15 +190,15 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ - "async-channel", + "async-channel 1.9.0", "async-global-executor", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite", + "futures-lite 1.13.0", "gloo-timers", "kv-log-macro", "log", @@ -165,9 +212,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad445822218ce64be7a341abfb0b1ea43b5c23aa83902542a4542e78309d8e5e" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", @@ -176,37 +223,37 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4655ae1a7b0cdf149156f780c5bf3f1352bc53cbd9e0a361a7ef7b22947e965" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] name = "async-task" -version = "4.3.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.66" +version = "0.1.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] name = "atomic-waker" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atty" @@ -221,14 +268,13 @@ dependencies = [ [[package]] name = "auto_impl" -version = "1.0.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a8c1df849285fbacd587de7818cc7d13be6cd2cbcd47a04fb1801b0e2706e33" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] @@ -239,13 +285,13 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.11" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d8068b6ccb8b34db9de397c7043f91db8b4c66414952c6db944f238c4d3db3" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", - "bitflags", + "bitflags 1.3.2", "bytes", "futures-util", "http", @@ -267,9 +313,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2f958c80c248b34b9a877a643811be8dbca03ca5ba827f2b63baf3a81e5fc4e" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ "async-trait", "bytes", @@ -282,6 +328,21 @@ dependencies = [ "tower-service", ] +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base-factory" version = "3.5.0" @@ -365,9 +426,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -420,6 +481,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + [[package]] name = "bitvec" version = "0.17.4" @@ -469,7 +536,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", ] [[package]] @@ -478,7 +545,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", ] [[package]] @@ -492,67 +559,48 @@ dependencies = [ [[package]] name = "blocking" -version = "1.3.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel", - "async-lock", + "async-channel 2.2.0", + "async-lock 3.3.0", "async-task", - "atomic-waker", - "fastrand", - "futures-lite", + "fastrand 2.0.1", + "futures-io", + "futures-lite 2.3.0", + "piper", + "tracing", ] [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "borsh" -version = "0.10.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f9ca3698b2e4cb7c15571db0abc5551dca417a21ae8140460b50309bb2cc62" +checksum = "26d4d6dafc1a3bb54687538972158f07b2c948bc57d5890df22c0739098b3028" dependencies = [ "borsh-derive", - "hashbrown 0.13.2", + "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598b3eacc6db9c3ee57b22707ad8f6a8d2f6d442bfe24ffeb8cbb70ca59e6a35" -dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186b734fa1c9f6743e90c95d7233c9faab6360d1a96d4ffa19d9cfd1e9350f8a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b7ff1008316626f485991b960ade129253d4034014616b94f309a15366cc49" +checksum = "bf4918709cc4dd777ad2b6303ed03cb37f3ca0ccede8c1b0d28ac6db8f4710e0" dependencies = [ + "once_cell", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", + "syn_derive", ] [[package]] @@ -566,9 +614,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "byte-slice-cast" @@ -584,9 +632,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "bytecheck" -version = "0.6.10" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -595,9 +643,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.10" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", @@ -606,24 +654,24 @@ dependencies = [ [[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.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.0.79" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -631,13 +679,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ - "num-integer", "num-traits", ] @@ -698,7 +751,7 @@ dependencies = [ "bech32 0.7.3", "blake2", "digest 0.10.7", - "generic-array 0.14.6", + "generic-array 0.14.7", "hex", "ripemd", "serde", @@ -710,18 +763,18 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] [[package]] name = "config" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" +checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" dependencies = [ "async-trait", "json5", @@ -738,9 +791,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "convert_case" @@ -753,9 +806,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -763,9 +816,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cosm-orc" @@ -804,7 +857,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673d31bd830c0772d78545de20d975129b6ab2f7db4e4e9313c3b8777d319194" dependencies = [ - "prost 0.11.8", + "prost 0.11.9", "prost-types", "tendermint-proto", "tonic", @@ -833,12 +886,12 @@ dependencies = [ [[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.7", + "ecdsa 0.16.9", "ed25519-zebra", "k256 0.13.1", "rand_core 0.6.4", @@ -847,18 +900,18 @@ dependencies = [ [[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", @@ -869,9 +922,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", @@ -880,11 +933,11 @@ 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 0.21.4", + "base64 0.21.7", "bech32 0.9.1", "bnum", "cosmwasm-crypto", @@ -902,21 +955,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -930,7 +980,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", "rand_core 0.6.4", "subtle", "zeroize", @@ -938,11 +988,11 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", "rand_core 0.6.4", "subtle", "zeroize", @@ -954,7 +1004,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", "typenum", ] @@ -967,16 +1017,6 @@ dependencies = [ "sct", ] -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "ctr" version = "0.9.2" @@ -1002,7 +1042,7 @@ dependencies = [ [[package]] name = "cw-address-like" version = "1.0.4" -source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=multiple_ownership#d40ce97bc1cc0e4870591ba8bf4a6160b1ae8b00" +source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=main#28c1a09bfc6b4f1942fefe3eb0b50faf9d3b1523" dependencies = [ "cosmwasm-std", ] @@ -1024,9 +1064,9 @@ dependencies = [ [[package]] name = "cw-controllers" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d8edce4b78785f36413f67387e4be7d0cb7d032b5d4164bcc024f9c3f3f2ea" +checksum = "57de8d3761e46be863e3ac1eba8c8a976362a48c6abf240df1e26c3e421ee9e8" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1039,9 +1079,9 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.16.2" +version = "0.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2eb84554bbfa6b66736abcd6a9bfdf237ee0ecb83910f746dff7f799093c80a" +checksum = "127c7bb95853b8e828bdab97065c81cb5ddc20f7339180b61b2300565aaa99d1" dependencies = [ "anyhow", "cosmwasm-std", @@ -1058,9 +1098,9 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fff029689ae89127cf6d7655809a68d712f3edbdb9686c70b018ba438b26ca" +checksum = "cc392a5cb7e778e3f90adbf7faa43c4db7f35b6623224b08886d796718edb875" dependencies = [ "anyhow", "bech32 0.9.1", @@ -1068,7 +1108,7 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "derivative", - "itertools 0.12.0", + "itertools 0.12.1", "prost 0.12.3", "schemars", "serde", @@ -1079,7 +1119,7 @@ dependencies = [ [[package]] name = "cw-ownable" version = "0.6.0" -source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=multiple_ownership#d40ce97bc1cc0e4870591ba8bf4a6160b1ae8b00" +source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=main#28c1a09bfc6b4f1942fefe3eb0b50faf9d3b1523" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1093,7 +1133,7 @@ dependencies = [ [[package]] name = "cw-ownable-derive" version = "0.6.0" -source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=multiple_ownership#d40ce97bc1cc0e4870591ba8bf4a6160b1ae8b00" +source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=main#28c1a09bfc6b4f1942fefe3eb0b50faf9d3b1523" dependencies = [ "proc-macro2", "quote", @@ -1182,9 +1222,9 @@ dependencies = [ [[package]] name = "cw4" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a398696307efadaaa2d0850076f865fa706c959d493cb4203314f72be6b77a64" +checksum = "24754ff6e45f2a1c60adc409d9b2eb87666012c44021329141ffaab3388fccd2" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1195,13 +1235,13 @@ dependencies = [ [[package]] name = "cw4-group" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58db332c4039bec8ade6aaa1f5fff24b94b111f21134db172cd27fb2e7f0ceb6" +checksum = "9e24a22c3af54c52edf528673b420a67a1648be2c159b8ec778d2fbf543df24b" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-controllers 1.1.0", + "cw-controllers 1.1.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1239,7 +1279,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#a358c4c207894fb6fc73ff29c0723690eabadab4" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#f461266c9aa844e80e5ddaf5ddf7ff742f430d5d" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1257,7 +1297,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#a358c4c207894fb6fc73ff29c0723690eabadab4" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#f461266c9aa844e80e5ddaf5ddf7ff742f430d5d" dependencies = [ "cosmwasm-std", "cw-ownable", @@ -1286,6 +1326,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1323,7 +1372,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", ] [[package]] @@ -1346,9 +1395,9 @@ checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" [[package]] name = "dyn-clone" -version = "1.0.11" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "e2e" @@ -1388,16 +1437,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.7" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der 0.7.8", "digest 0.10.7", - "elliptic-curve 0.13.5", + "elliptic-curve 0.13.8", "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -1438,9 +1487,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "elliptic-curve" @@ -1453,7 +1502,7 @@ dependencies = [ "der 0.6.1", "digest 0.10.7", "ff 0.12.1", - "generic-array 0.14.6", + "generic-array 0.14.7", "group 0.12.1", "pkcs8 0.9.0", "rand_core 0.6.4", @@ -1464,19 +1513,19 @@ dependencies = [ [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct 0.2.0", - "crypto-bigint 0.5.3", + "crypto-bigint 0.5.5", "digest 0.10.7", "ff 0.13.0", - "generic-array 0.14.6", + "generic-array 0.14.7", "group 0.13.0", "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1 0.7.1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -1494,15 +1543,31 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "erased-serde" -version = "0.3.25" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2b0c2380453a92ea8b6c8e5f64ecaafccddde8ceab55ff7a8ac1029f894569" +checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" dependencies = [ "serde", ] +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "eth-keystore" version = "0.5.0" @@ -1522,7 +1587,7 @@ dependencies = [ "sha2 0.10.8", "sha3", "thiserror", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -1596,7 +1661,7 @@ dependencies = [ "convert_case", "elliptic-curve 0.12.3", "ethabi", - "generic-array 0.14.6", + "generic-array 0.14.7", "hex", "k256 0.11.6", "open-fastrlp", @@ -1637,11 +1702,53 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.2.0", + "pin-project-lite", +] + [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", @@ -1662,6 +1769,12 @@ dependencies = [ "instant", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "ff" version = "0.12.1" @@ -1733,9 +1846,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1748,9 +1861,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1758,15 +1871,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1775,17 +1888,17 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", + "fastrand 1.9.0", "futures-core", "futures-io", "memchr", @@ -1794,34 +1907,47 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.0.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] name = "futures-sink" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1846,9 +1972,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -1857,9 +1983,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1868,6 +1994,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "gloo-timers" version = "0.2.6" @@ -1904,9 +2036,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.16" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", @@ -1914,7 +2046,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -1927,26 +2059,22 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.6", + "ahash", ] [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "headers" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.13.1", - "bitflags", + "base64 0.21.7", "bytes", "headers-core", "http", @@ -1981,12 +2109,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -2005,9 +2130,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -2016,9 +2141,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -2033,9 +2158,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -2045,9 +2170,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.25" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -2060,7 +2185,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.6", "tokio", "tower-service", "tracing", @@ -2172,21 +2297,31 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + [[package]] name = "inout" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", ] [[package]] @@ -2198,6 +2333,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2218,24 +2364,24 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2271,18 +2417,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", - "ecdsa 0.16.7", - "elliptic-curve 0.13.5", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.8", - "signature 2.1.0", + "signature 2.2.0", ] [[package]] name = "keccak" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] @@ -2304,9 +2450,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.140" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "linked-hash-map" @@ -2314,33 +2460,44 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + [[package]] name = "log" -version = "0.4.17" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" dependencies = [ - "cfg-if", "value-bag", ] [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -2348,16 +2505,24 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -2370,6 +2535,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" @@ -2382,39 +2553,38 @@ dependencies = [ ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num-traits" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", - "num-traits", ] [[package]] -name = "num-traits" -version = "0.2.15" +name = "num_cpus" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "autocfg", + "hermit-abi 0.3.9", + "libc", ] [[package]] -name = "num_cpus" -version = "1.15.0" +name = "object" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ - "hermit-abi 0.2.6", - "libc", + "memchr", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2424,9 +2594,9 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[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 = "open-edition-factory" @@ -2512,9 +2682,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.4.0" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637935964ff85a605d114591d4d2c13c5d1ba2806dae97cea6bf180238a749ac" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", "bitvec 1.0.1", @@ -2526,11 +2696,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.1.4" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", "syn 1.0.109", @@ -2538,9 +2708,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "password-hash" @@ -2555,9 +2725,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pathdiff" @@ -2612,19 +2782,20 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.5.6" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cbd939b234e95d72bc393d51788aec68aeeb5d51e748ca08ff3aad58cb722f7" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.5.6" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a81186863f3d0a27340815be8f2078dd8050b14cd71913db9fbda795e5f707d7" +checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026" dependencies = [ "pest", "pest_generator", @@ -2632,22 +2803,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.6" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a1ef20bf3193c15ac345acb32e26b3dc3223aff4d77ae4fc5359567683796b" +checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] name = "pest_meta" -version = "2.5.6" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e3b284b1f13a20dc5ebc90aff59a51b8d7137c221131b52a7260c08cbc1cc80" +checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293" dependencies = [ "once_cell", "pest", @@ -2656,29 +2827,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -2686,6 +2857,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + [[package]] name = "pkcs8" version = "0.9.0" @@ -2703,25 +2885,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der 0.7.8", - "spki 0.7.2", + "spki 0.7.3", ] [[package]] name = "polling" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e1f879b2998099c2d69ab9605d145d5b661195627eccc680002c4918a7fb6fa" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ "autocfg", - "bitflags", + "bitflags 1.3.2", "cfg-if", "concurrent-queue", "libc", "log", "pin-project-lite", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] +[[package]] +name = "polling" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.31", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2730,9 +2932,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "primitive-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", @@ -2744,21 +2946,22 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "0.1.5" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "toml", + "once_cell", + "toml_edit 0.19.15", ] [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "once_cell", - "toml_edit", + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] @@ -2770,7 +2973,6 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", "version_check", ] @@ -2787,9 +2989,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -2806,12 +3008,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48e50df39172a3e7eb17e14642445da64996989bc212b583015435d39a58537" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive 0.11.8", + "prost-derive 0.11.9", ] [[package]] @@ -2839,9 +3041,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", @@ -2860,16 +3062,16 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] name = "prost-types" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "379119666929a1afd7a043aa6cf96fa67a6dce9af60c88095a4686dbce4c9c88" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" dependencies = [ - "prost 0.11.8", + "prost 0.11.9", ] [[package]] @@ -2960,9 +3162,21 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -2971,15 +3185,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rend" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] @@ -3037,28 +3251,32 @@ checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" dependencies = [ "block-buffer 0.9.0", "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug 0.3.1", ] [[package]] name = "rkyv" -version = "0.7.40" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c30f1d45d9aa61cbc8cd1eb87705470892289bb2d01943e7803b873a57404dc3" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" dependencies = [ + "bitvec 1.0.1", "bytecheck", + "bytes", "hashbrown 0.12.3", "ptr_meta", "rend", "rkyv_derive", "seahash", + "tinyvec", + "uuid 1.7.0", ] [[package]] name = "rkyv_derive" -version = "0.7.40" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff26ed6c7c4dfc2aa9480b86a60e3c7233543a270a680e10758a507c5a4ce476" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" dependencies = [ "proc-macro2", "quote", @@ -3093,7 +3311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" dependencies = [ "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "serde", ] @@ -3118,14 +3336,12 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.29.0" +version = "1.34.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b1b21b8760b0ef8ae5b43d40913ff711a2053cb7ff892a34facff7a6365375a" +checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df" dependencies = [ "arrayvec", "borsh", - "bytecheck", - "byteorder", "bytes", "num-traits", "rand", @@ -3134,12 +3350,45 @@ dependencies = [ "serde_json", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hex" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", +] + [[package]] name = "rustls" version = "0.19.1" @@ -3167,15 +3416,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "salsa20" @@ -3197,9 +3446,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.3.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "001cf62ece89779fd16105b5f515ad0e5cedcd5440d3dd806bb067978e7c3608" +checksum = "2ef2175c2907e7c8bc0a9c3f86aeb5ec1f3b275300ad58a44d0c3ae379a5e52e" dependencies = [ "cfg-if", "derive_more", @@ -3209,9 +3458,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.3.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "303959cf613a6f6efd19ed4b4ad5bf79966a13352716299ad532cfb115f4205c" +checksum = "634d9b8eb8fd61c5cdd3390d9b2132300a7e7618955b98b8416f118c1b4e144f" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -3221,11 +3470,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] @@ -3288,7 +3537,7 @@ checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ "base16ct 0.1.1", "der 0.6.1", - "generic-array 0.14.6", + "generic-array 0.14.7", "pkcs8 0.9.0", "subtle", "zeroize", @@ -3296,13 +3545,13 @@ dependencies = [ [[package]] name = "sec1" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct 0.2.0", "der 0.7.8", - "generic-array 0.14.6", + "generic-array 0.14.7", "pkcs8 0.10.2", "subtle", "zeroize", @@ -3310,11 +3559,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -3323,9 +3572,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -3333,15 +3582,15 @@ 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", ] @@ -3357,22 +3606,22 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.9" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" 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.53", ] [[package]] @@ -3388,9 +3637,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.112" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d1bd37ce2324cf3bf85e5a25f96eb4baf0d5aa6eba43e7ae8958870c4ec48ed" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -3399,13 +3648,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.11" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395627de918015623b32e7669714206363a7fc00382bf477e72c1f7533e8eafc" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] @@ -3430,7 +3679,7 @@ dependencies = [ "async-std", "cosmwasm-schema", "cosmwasm-std", - "cw-multi-test 0.20.0", + "cw-multi-test 0.20.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -3499,7 +3748,7 @@ checksum = "20744734b8049c64747bfb083bbc06a3c7204d1d34881ed3d89698e182aa9f97" dependencies = [ "anyhow", "cosmwasm-std", - "cw-multi-test 0.16.2", + "cw-multi-test 0.16.5", "schemars", "serde", "sg-std", @@ -3511,7 +3760,7 @@ version = "3.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-controllers 1.1.0", + "cw-controllers 1.1.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -3615,7 +3864,7 @@ version = "3.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-multi-test 0.20.0", + "cw-multi-test 0.20.1", "cw-ownable", "cw-utils 1.0.3", "cw721-base", @@ -3665,7 +3914,7 @@ version = "3.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-multi-test 0.20.0", + "cw-multi-test 0.20.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -3683,9 +3932,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -3714,7 +3963,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug 0.3.1", ] [[package]] @@ -3730,9 +3979,9 @@ dependencies = [ [[package]] name = "sha3" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ "digest 0.10.7", "keccak", @@ -3759,9 +4008,9 @@ dependencies = [ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -3775,23 +4024,33 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "spin" version = "0.5.2" @@ -3810,9 +4069,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der 0.7.8", @@ -3848,9 +4107,9 @@ dependencies = [ [[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" @@ -3874,9 +4133,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -3884,23 +4143,23 @@ dependencies = [ ] [[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.12.6" +name = "syn_derive" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" dependencies = [ + "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", - "unicode-xid", + "syn 2.0.53", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "tap" version = "1.0.1" @@ -3922,7 +4181,7 @@ dependencies = [ "k256 0.11.6", "num-traits", "once_cell", - "prost 0.11.8", + "prost 0.11.9", "prost-types", "ripemd160", "serde", @@ -3962,7 +4221,7 @@ dependencies = [ "flex-error", "num-derive", "num-traits", - "prost 0.11.8", + "prost 0.11.9", "prost-types", "serde", "serde_bytes", @@ -4000,24 +4259,24 @@ dependencies = [ "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", "walkdir", ] [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "test-context" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "055831a02a4f5aa28fede67f2902014273eb8c21b958ac5ebbd59b71ef30dbc3" +checksum = "b7b6965c21232186af0092233c18030fe607cfc3960dbabb209325272458eeea" dependencies = [ "async-trait", "futures", @@ -4026,12 +4285,12 @@ dependencies = [ [[package]] name = "test-context-macros" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901a55b0a7a06ebc4a674dcca925170da8e613fa3b163a1df804ed10afb154d" +checksum = "d506c7664333e246f564949bee4ed39062aa0f11918e6f5a95f553cdad65c274" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] @@ -4045,7 +4304,7 @@ dependencies = [ "base-minter", "cosmwasm-schema", "cosmwasm-std", - "cw-multi-test 0.20.0", + "cw-multi-test 0.20.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -4092,30 +4351,33 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] name = "time" -version = "0.3.20" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ + "deranged", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -4123,16 +4385,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -4162,20 +4425,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.26.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", "pin-project-lite", - "socket2", + "socket2 0.5.6", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -4190,13 +4452,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] @@ -4212,9 +4474,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.12" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -4223,9 +4485,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -4246,17 +4508,28 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.7" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc18466501acd8ac6a3f615dd29a3438f8ca6bb3b19537138b3106e575621274" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.2.5", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.2.5", "toml_datetime", "winnow", ] @@ -4281,8 +4554,8 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.11.8", - "prost-derive 0.11.8", + "prost 0.11.9", + "prost-derive 0.11.9", "tokio", "tokio-stream", "tokio-util", @@ -4301,7 +4574,7 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", - "indexmap", + "indexmap 1.9.3", "pin-project", "pin-project-lite", "rand", @@ -4327,11 +4600,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4339,20 +4611,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -4369,21 +4641,21 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uint" @@ -4399,30 +4671,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.11" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +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", ] [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-xid" @@ -4457,15 +4729,17 @@ dependencies = [ "serde", ] +[[package]] +name = "uuid" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" + [[package]] name = "value-bag" -version = "1.0.0-alpha.9" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" -dependencies = [ - "ctor", - "version_check", -] +checksum = "8fec26a25bd6fca441cdd0f769fd7f891bae119f996de31f86a5eddccef54c1d" [[package]] name = "vending-factory" @@ -4582,28 +4856,26 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" -version = "2.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", - "winapi", "winapi-util", ] [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -4615,9 +4887,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4625,24 +4897,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -4652,9 +4924,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4662,28 +4934,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -4764,9 +5036,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -4779,90 +5051,141 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows-targets", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" -version = "0.3.6" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d020b441f92996c80d94ae9166e8501e59c7bb56121189dc9eab3bd8216966" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -4887,21 +5210,20 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.3.3" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", - "synstructure", + "syn 2.0.53", ] diff --git a/Cargo.toml b/Cargo.toml index a006f27e3..e090ee284 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ sg-eth-airdrop = { version = "3.5.0", path = "contracts/sg-eth-airdrop test-suite = { version = "3.5.0", path = "test-suite" } semver = "1" -cw-ownable = { git = "https://github.com/public-awesome/cw-plus-plus.git", branch = "multiple_ownership"} # TODO: switch to official https://github.com/larry0x/cw-plus-plus once merged +cw-ownable = { git = "https://github.com/public-awesome/cw-plus-plus.git", branch = "main"} # TODO: switch to official https://github.com/larry0x/cw-plus-plus once merged anybuf = "0.3.0" [profile.release.package.sg721] diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 950b7b44f..1ffeb6c0d 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -1,27 +1,24 @@ -use std::fmt::Debug; - use cw721::msg::CollectionMetadataMsg; -use cw721::state::{MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_ROYALTY_SHARE_PCT}; +use cw721::state::{MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_ROYALTY_SHARE_PCT, MINTER}; use cw721::traits::{Cw721CustomMsg, Cw721State}; -use cw721_base::msg::{CollectionMetadataExtensionMsg, Cw721InstantiateMsg, RoyaltyInfoResponse}; -use cw721_base::state::NftInfo; +use cw721_base::msg::{CollectionMetadataExtensionMsg, RoyaltyInfoResponse}; use cw721_base::{ traits::StateFactory, DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, }; -use url::Url; use cosmwasm_std::{ to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Decimal, Deps, DepsMut, Empty, - Env, Event, MessageInfo, Response, StdError, StdResult, Storage, Timestamp, WasmQuery, + Env, Event, MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, }; -use cw721_base::{execute::Cw721Execute, query::Cw721Query, state::CollectionMetadata}; +use cw721_base::{execute::Cw721Execute, query::Cw721Query}; use cw_utils::nonpayable; -use serde::{de::DeserializeOwned, Serialize}; -use sg721::{CollectionInfo, ExecuteMsg, InstantiateMsg, RoyaltyInfo, UpdateCollectionInfoMsg}; +#[allow(deprecated)] +use sg721::{ExecuteMsg, InstantiateMsg, UpdateCollectionInfoMsg}; +#[allow(deprecated)] use crate::msg::{CollectionInfoResponse, NftParams, QueryMsg}; use crate::{ContractError, Sg721Contract}; @@ -135,18 +132,6 @@ where return Err(ContractError::CollectionInfoFrozen {}); } - // only creator can update collection info - let creator = self.get_creator(deps.as_ref().storage)?; - if creator.is_none() || creator.unwrap() != info.sender { - return Err(ContractError::Unauthorized {}); - } - - if let Some(new_creator) = collection_msg.creator.clone() { - // TODO: for keeping logic as-is, creator is set right away, but it should use cw-ownable's Action::TransferOwnership - self.parent - .initialize_creator(deps.storage, deps.api, Some(new_creator.as_str()))?; - } - // in this contract, extension is always present, so unwrap is safe let collection_extension = collection_info.extension.unwrap(); @@ -191,7 +176,6 @@ where ) -> Result, ContractError> { assert_minter_owner(deps.storage, &info.sender)?; - let collection_info = self.parent.config.collection_metadata.load(deps.storage)?; let msg = CollectionMetadataMsg { name: None, symbol: None, @@ -218,6 +202,7 @@ where info: MessageInfo, ) -> Result, ContractError> { let collection = self.query_collection_info(deps.as_ref())?; + #[allow(deprecated)] if collection.creator != info.sender { return Err(ContractError::Unauthorized {}); } @@ -263,6 +248,7 @@ where msg: QueryMsg, ) -> Result { match msg { + #[allow(deprecated)] QueryMsg::CollectionInfo {} => Ok(to_json_binary(&self.query_collection_info(deps)?)?), _ => Ok(self.parent.query(deps, &env, msg.into())?), } @@ -275,7 +261,9 @@ where ) -> Result { let collection_info = self.parent.config.collection_metadata.load(deps.storage)?; - let creator = self.get_creator(deps.storage)?.map_or("none".to_string(), |c| c.to_string()); + let creator = self + .get_creator(deps.storage)? + .map_or("none".to_string(), |c| c.to_string()); // in this contract, extension is always present, so unwrap is safe let collection_extension = collection_info.extension.unwrap(); @@ -342,7 +330,7 @@ pub fn share_validate(share: Decimal) -> Result { } pub fn get_owner_minter(storage: &mut dyn Storage) -> Result { - let ownership = cw_ownable::get_ownership(storage)?; + let ownership = MINTER.get_ownership(storage)?; match ownership.owner { Some(owner_value) => Ok(owner_value), None => Err(ContractError::MinterNotFound {}), @@ -350,7 +338,7 @@ pub fn get_owner_minter(storage: &mut dyn Storage) -> Result Result<(), ContractError> { - let res = cw_ownable::assert_owner(storage, sender); + let res = MINTER.assert_owner(storage, sender); match res { Ok(_) => Ok(()), Err(_) => Err(ContractError::UnauthorizedOwner {}), diff --git a/packages/sg2/src/tests.rs b/packages/sg2/src/tests.rs index ef0e42d7e..843181a83 100644 --- a/packages/sg2/src/tests.rs +++ b/packages/sg2/src/tests.rs @@ -3,6 +3,7 @@ use cosmwasm_std::Decimal; use cosmwasm_std::Timestamp; use sg721::{CollectionInfo, RoyaltyInfoResponse}; +#[allow(deprecated)] pub fn mock_collection_params() -> CollectionParams { CollectionParams { code_id: 1, diff --git a/packages/sg721/src/lib.rs b/packages/sg721/src/lib.rs index acf738e96..d392ea57c 100644 --- a/packages/sg721/src/lib.rs +++ b/packages/sg721/src/lib.rs @@ -260,6 +260,7 @@ pub struct UpdateCollectionInfoMsg { pub external_link: Option>, pub explicit_content: Option, pub royalty_info: Option>, + /// creator is ignore here, use `UpdateCreatorOwnership` instead pub creator: Option, } @@ -292,7 +293,7 @@ impl From for Cw721InstantiateMsg>>>>>> res {:?}", res); assert!(res.is_ok()); let creator_balances = router.wrap().query_all_balances(creator.clone()).unwrap(); diff --git a/test-suite/src/sg721_base/tests/integration_tests.rs b/test-suite/src/sg721_base/tests/integration_tests.rs index 0698b989c..8f060dadf 100644 --- a/test-suite/src/sg721_base/tests/integration_tests.rs +++ b/test-suite/src/sg721_base/tests/integration_tests.rs @@ -1,4 +1,5 @@ #[cfg(test)] +#[allow(deprecated)] mod tests { use crate::common_setup::contract_boxes::App; use anyhow::Error; @@ -113,7 +114,6 @@ mod tests { let cosmos_msg = factory_contract.call_with_funds(msg, creation_fee).unwrap(); let res = app.execute(Addr::unchecked(ADMIN), cosmos_msg); - println!(">>>>> {:?}", res); assert!(res.is_ok()); (app, Addr::unchecked("contract2")) @@ -349,7 +349,6 @@ mod tests { let (mut app, contract) = custom_proper_instantiate(custom_create_minter_msg); let creator = Addr::unchecked("creator".to_string()); - let new_creator = Addr::unchecked("new_creator".to_string()); // succeeds let res = app.execute_contract( @@ -493,13 +492,32 @@ mod tests { .unwrap(); assert_eq!(res.royalty_info.unwrap(), royalty_info); + // other cant update + let other = Addr::unchecked("other".to_string()); + let res = app.execute_contract( + other.clone(), + contract.clone(), + &Sg721ExecuteMsg::::UpdateCollectionInfo { + collection_info: UpdateCollectionInfoMsg { + creator: None, + description: Some(params.info.description.clone()), + image: Some(params.info.image.clone()), + external_link: Some(params.info.external_link.clone()), + explicit_content: Some(true), + royalty_info: None, + }, + }, + &[], + ); + assert!(res.is_err()); + // update explicit content with new creator let res = app.execute_contract( - creator, + creator.clone(), contract.clone(), &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { - creator: Some(new_creator.to_string()), + creator: Some(other.to_string()), // other is ignored description: Some(params.info.description.clone()), image: Some(params.info.image.clone()), external_link: Some(params.info.external_link.clone()), @@ -523,6 +541,18 @@ mod tests { .unwrap(); // check explicit content changed to true assert!(res.explicit_content.unwrap()); + // check creator is unchanged + let res: Ownership = app + .wrap() + .query_wasm_smart( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::GetCreatorOwnership { }, + ) + .unwrap(); + assert_eq!(res.owner, Some(creator.clone())); // freeze collection throw err if not creator let res = app.execute_contract( @@ -534,7 +564,7 @@ mod tests { assert!(res.is_err()); // freeze collection to prevent further updates let res = app.execute_contract( - new_creator.clone(), + creator.clone(), contract.clone(), &Sg721ExecuteMsg::::FreezeCollectionInfo {}, &[], @@ -543,7 +573,7 @@ mod tests { // trying to update collection after frozen should throw err let res = app.execute_contract( - new_creator, + creator, contract, &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { From 63d25461777c1cfc279c73ae8cd2dba76d6b6ac4 Mon Sep 17 00:00:00 2001 From: mr-t Date: Mon, 18 Mar 2024 18:47:37 +0100 Subject: [PATCH 03/20] fix tests --- contracts/minters/base-minter/src/contract.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/minters/base-minter/src/contract.rs b/contracts/minters/base-minter/src/contract.rs index 3b12ac339..752f7ec8a 100644 --- a/contracts/minters/base-minter/src/contract.rs +++ b/contracts/minters/base-minter/src/contract.rs @@ -16,6 +16,7 @@ use sg1::checked_fair_burn; use sg2::query::Sg2QueryMsg; use sg4::{QueryMsg, Status, StatusResponse, SudoMsg}; use sg721::{ExecuteMsg as Sg721ExecuteMsg, InstantiateMsg as Sg721InstantiateMsg}; +#[allow(deprecated)] use sg721_base::msg::{CollectionInfoResponse, QueryMsg as Sg721QueryMsg}; use sg_std::NATIVE_DENOM; use url::Url; @@ -25,6 +26,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); const INSTANTIATE_SG721_REPLY_ID: u64 = 1; #[cfg_attr(not(feature = "library"), entry_point)] +#[allow(deprecated)] pub fn instantiate( deps: DepsMut, env: Env, @@ -110,6 +112,7 @@ pub fn execute( } } +#[allow(deprecated)] pub fn execute_mint_sender( deps: DepsMut, info: MessageInfo, @@ -176,6 +179,7 @@ pub fn execute_mint_sender( .add_attribute("network_fee", network_fee.to_string())) } +#[allow(deprecated)] pub fn execute_update_start_trading_time( deps: DepsMut, env: Env, From ce3448b1f10f084ad20f1fa73a90db72cd9bd577 Mon Sep 17 00:00:00 2001 From: mr-t Date: Mon, 18 Mar 2024 19:04:40 +0100 Subject: [PATCH 04/20] fix payout_too_much_royalties: fees exceed payment --- contracts/collections/sg721-base/src/contract.rs | 16 ---------------- .../src/base_minter/tests/integration_tests.rs | 1 - .../src/sg721_base/tests/integration_tests.rs | 8 ++++---- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 1ffeb6c0d..d38cc2557 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -78,12 +78,6 @@ where CONTRACT_VERSION, )?; - if let Some(royalty_info) = msg.collection_info.royalty_info { - if royalty_info.share > Decimal::percent(MAX_ROYALTY_SHARE_PCT) { - share_validate(royalty_info.share)?; - } - } - Ok(Response::new() .add_attribute("action", "instantiate") .add_attribute("collection_name", msg.name) @@ -319,16 +313,6 @@ where } } -pub fn share_validate(share: Decimal) -> Result { - if share > Decimal::one() { - return Err(ContractError::InvalidRoyalties( - "Share cannot be greater than 100%".to_string(), - )); - } - - Ok(share) -} - pub fn get_owner_minter(storage: &mut dyn Storage) -> Result { let ownership = MINTER.get_ownership(storage)?; match ownership.owner { diff --git a/test-suite/src/base_minter/tests/integration_tests.rs b/test-suite/src/base_minter/tests/integration_tests.rs index 29bfe52bc..3f4d3386d 100644 --- a/test-suite/src/base_minter/tests/integration_tests.rs +++ b/test-suite/src/base_minter/tests/integration_tests.rs @@ -137,7 +137,6 @@ fn check_mint() { &[coin(MIN_MINT_PRICE, NATIVE_DENOM)], ); - println!(">>>>>>> res {:?}", res); assert!(res.is_ok()); let creator_balances = router.wrap().query_all_balances(creator.clone()).unwrap(); diff --git a/test-suite/src/sg721_base/tests/integration_tests.rs b/test-suite/src/sg721_base/tests/integration_tests.rs index 8f060dadf..f14202981 100644 --- a/test-suite/src/sg721_base/tests/integration_tests.rs +++ b/test-suite/src/sg721_base/tests/integration_tests.rs @@ -596,7 +596,7 @@ mod tests { use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; use cosmwasm_std::{Decimal, Response, Uint128}; - use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; + use cw721::{state::MAX_ROYALTY_SHARE_PCT, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use sg2::msg::CollectionParams; use sg721::RoyaltyInfoResponse; use sg721_base::msg::{CollectionInfoResponse, QueryMsg}; @@ -691,7 +691,7 @@ mod tests { explicit_content: Some(false), royalty_info: Some(RoyaltyInfoResponse { payment_address: "creator".to_string(), - share: Decimal::percent(91), + share: Decimal::percent(MAX_ROYALTY_SHARE_PCT), }), }, ..mock_collection_params() @@ -711,13 +711,13 @@ mod tests { ) .unwrap(); - // payout 100stars, royalty share 91%, royalty payout fails + // payout 100stars, royalty share 10% (MAX_ROYALTY_SHARE_PCT), royalty payout fails // fees exceed payment let payment = Uint128::from(100000000u128); let res = res.royalty_payout( contract, payment, - Uint128::from(10000000u128), + Uint128::from(91000000u128), // 91stars None, &mut Response::default(), ); From 99978306ada8c5a1ec5718f7b85ba4031d908321 Mon Sep 17 00:00:00 2001 From: mr-t Date: Mon, 18 Mar 2024 19:45:50 +0100 Subject: [PATCH 05/20] #[allow(deprecated)] --- .../collections/sg721-base/src/contract.rs | 4 ++-- contracts/collections/sg721-base/src/lib.rs | 7 +++--- contracts/collections/sg721-base/src/msg.rs | 14 +++++------- contracts/collections/sg721-base/src/state.rs | 1 - .../collections/sg721-nt/examples/schema.rs | 5 ++++- contracts/collections/sg721-nt/src/lib.rs | 22 ++++++++++--------- contracts/collections/sg721-nt/src/msg.rs | 4 ++++ .../sg721-updatable/examples/schema.rs | 11 +++++++--- .../sg721-updatable/src/contract.rs | 6 ++++- .../collections/sg721-updatable/src/lib.rs | 3 +-- .../collections/sg721-updatable/src/msg.rs | 7 ++++++ .../open-edition-minter/src/contract.rs | 1 + .../open-edition-minter/src/helpers.rs | 4 ++-- .../vending-minter-merkle-wl/src/contract.rs | 8 +++++-- .../vending-minter-wl-flex/src/contract.rs | 5 +++-- .../minters/vending-minter/src/contract.rs | 8 +++++-- e2e/src/helpers/helper.rs | 2 ++ .../helpers/open_edition_minter_helpers.rs | 2 ++ e2e/src/tests/sg721_test.rs | 2 ++ packages/sg2/src/msg.rs | 3 +++ packages/sg2/src/tests.rs | 5 +++++ packages/sg721/src/lib.rs | 12 +++++----- .../base_minter/tests/integration_tests.rs | 3 +++ .../setup_minter/base_minter/setup.rs | 1 + .../setup_minter/open_edition_minter/setup.rs | 1 + .../setup_minter/vending_minter/setup.rs | 1 + .../tests/frozen_factory.rs | 1 + .../vending_minter/tests/allowed_code_ids.rs | 1 + .../vending_minter/tests/frozen_factory.rs | 1 + .../src/vending_minter/tests/happy_unhappy.rs | 1 + .../vending_minter/tests/ibc_asset_mint.rs | 2 ++ .../src/vending_minter/tests/trading_time.rs | 2 ++ .../tests/trading_time_updatable.rs | 3 +++ .../src/vending_minter/tests/updatable.rs | 3 +-- .../vending_minter/tests/zero_mint_price.rs | 3 +++ 35 files changed, 111 insertions(+), 48 deletions(-) diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index d38cc2557..e7680da28 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -1,5 +1,5 @@ use cw721::msg::CollectionMetadataMsg; -use cw721::state::{MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_ROYALTY_SHARE_PCT, MINTER}; +use cw721::state::{MAX_COLLECTION_DESCRIPTION_LENGTH, MINTER}; use cw721::traits::{Cw721CustomMsg, Cw721State}; use cw721_base::msg::{CollectionMetadataExtensionMsg, RoyaltyInfoResponse}; use cw721_base::{ @@ -8,7 +8,7 @@ use cw721_base::{ }; use cosmwasm_std::{ - to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Decimal, Deps, DepsMut, Empty, + to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Deps, DepsMut, Empty, Env, Event, MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, }; diff --git a/contracts/collections/sg721-base/src/lib.rs b/contracts/collections/sg721-base/src/lib.rs index 8086ce9f2..8fb5e2831 100644 --- a/contracts/collections/sg721-base/src/lib.rs +++ b/contracts/collections/sg721-base/src/lib.rs @@ -7,11 +7,10 @@ pub mod upgrades; pub use crate::error::ContractError; pub use crate::state::Sg721Contract; use cw721::{ - DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, RoyaltyInfo, + DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, }; -use cw721_base::msg::CollectionMetadataExtensionMsg; use cw721_base::{ - DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, NftMetadataMsg, + DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, }; pub type ExecuteMsg = sg721::ExecuteMsg< @@ -29,7 +28,7 @@ pub mod entry { #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; - use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult}; + use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response}; use cw2::set_contract_version; use sg721::InstantiateMsg; diff --git a/contracts/collections/sg721-base/src/msg.rs b/contracts/collections/sg721-base/src/msg.rs index e03964b8d..7e4842186 100644 --- a/contracts/collections/sg721-base/src/msg.rs +++ b/contracts/collections/sg721-base/src/msg.rs @@ -1,18 +1,12 @@ use cw721::msg::RoyaltyInfoResponse; use cw721::traits::Cw721State; -use cw721::CollectionMetadataExtension; -use cw721::DefaultOptionCollectionMetadataExtensionMsg; -use cw721::RoyaltyInfo; -use serde::de::DeserializeOwned; -use serde::Serialize; -use std::fmt::Debug; use cosmwasm_schema::cw_serde; use cosmwasm_schema::QueryResponses; use cosmwasm_std::{coin, Addr, BankMsg, Empty, Event, StdError, StdResult, Timestamp, Uint128}; use cw721_base::{ msg::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, Cw721ExecuteMsg, MinterResponse, + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, QueryMsg as Cw721QueryMsg, TokensResponse, }, @@ -23,12 +17,14 @@ use sg_std::{Response, SubMsg, NATIVE_DENOM}; #[derive(QueryResponses)] #[cw_serde] +#[allow(deprecated)] pub enum QueryMsg< // Return type of NFT metadata defined in `NftInfo` and `AllNftInfo`. TNftMetadataExtension, // Return type of collection metadata extension defined in `GetCollectionMetadata`. TCollectionMetadataExtension, > { + #[allow(deprecated)] #[returns(CollectionInfoResponse)] #[deprecated = "Please use GetCollectionMetadata instead"] CollectionInfo {}, @@ -156,6 +152,7 @@ where TNftMetadataExtension: Cw721State, TCollectionMetadataExtension: Cw721State, { + #[allow(deprecated)] fn from( msg: QueryMsg, ) -> Cw721QueryMsg { @@ -227,7 +224,7 @@ where } #[cw_serde] -#[deprecated = "Please use CollectionMetadata> instead"] +#[deprecated = "Please use `CollectionMetadata>` instead"] pub struct CollectionInfoResponse { pub creator: String, pub description: String, @@ -238,6 +235,7 @@ pub struct CollectionInfoResponse { pub royalty_info: Option, } +#[allow(deprecated)] impl CollectionInfoResponse { pub fn royalty_payout( &self, diff --git a/contracts/collections/sg721-base/src/state.rs b/contracts/collections/sg721-base/src/state.rs index 56fe680fd..34599e0af 100644 --- a/contracts/collections/sg721-base/src/state.rs +++ b/contracts/collections/sg721-base/src/state.rs @@ -1,7 +1,6 @@ use cosmwasm_std::Timestamp; use cw721::traits::{Cw721CustomMsg, Cw721State}; use cw_storage_plus::Item; -use serde::{de::DeserializeOwned, Serialize}; use std::ops::Deref; diff --git a/contracts/collections/sg721-nt/examples/schema.rs b/contracts/collections/sg721-nt/examples/schema.rs index 04bc938eb..bf80b1c31 100644 --- a/contracts/collections/sg721-nt/examples/schema.rs +++ b/contracts/collections/sg721-nt/examples/schema.rs @@ -5,7 +5,8 @@ use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, s use cosmwasm_std::Empty; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{state::CollectionMetadata, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +#[allow(deprecated)] use cw721_base::{ msg::{ AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, Cw721QueryMsg, MinterResponse, @@ -46,7 +47,9 @@ fn main() { export_schema(&schema_for!(ApprovalResponse), &out_dir); export_schema(&schema_for!(ApprovalsResponse), &out_dir); export_schema(&schema_for!(OperatorsResponse), &out_dir); + #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); + export_schema(&schema_for!(CollectionMetadata), &out_dir); export_schema_with_title( &schema_for!(NftInfoResponse), &out_dir, diff --git a/contracts/collections/sg721-nt/src/lib.rs b/contracts/collections/sg721-nt/src/lib.rs index b444bfdd3..d2de4a768 100644 --- a/contracts/collections/sg721-nt/src/lib.rs +++ b/contracts/collections/sg721-nt/src/lib.rs @@ -7,7 +7,6 @@ use cw721::{ DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, }; -use cw721_base::Extension; use sg721::InstantiateMsg; use sg721_base::Sg721Contract; pub type QueryMsg = sg721_base::msg::QueryMsg< @@ -37,7 +36,7 @@ pub mod entry { use crate::msg::ExecuteMsg; use cosmwasm_std::{ - Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdError, StdResult, + Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdError, }; use cw721::msg::Cw721MigrateMsg; use cw721_base::execute::Cw721Execute; @@ -64,7 +63,7 @@ pub mod entry { deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg, ) -> Result { match msg { ExecuteMsg::Burn { token_id } => Sg721NonTransferableContract::default() @@ -76,17 +75,20 @@ pub mod entry { token_uri, owner, extension, - } => Sg721NonTransferableContract::default().mint( - deps, - env, - info, - NftParams::NftData { + } => { + let nft_data = NftParams::NftData { token_id, owner, token_uri, extension, - }, - ), + }; + Sg721NonTransferableContract::default().mint( + deps, + env, + info, + nft_data, + ) + }, ExecuteMsg::UpdateCollectionInfo { new_collection_info, } => Sg721NonTransferableContract::default().update_collection_info( diff --git a/contracts/collections/sg721-nt/src/msg.rs b/contracts/collections/sg721-nt/src/msg.rs index e4f8d141e..cbaf4ac69 100644 --- a/contracts/collections/sg721-nt/src/msg.rs +++ b/contracts/collections/sg721-nt/src/msg.rs @@ -1,9 +1,11 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +#[allow(deprecated)] use sg721::{RoyaltyInfoResponse, UpdateCollectionInfoMsg}; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[allow(deprecated)] pub enum ExecuteMsg { /// Mint a new NFT, can only be called by the contract minter Mint { @@ -21,7 +23,9 @@ pub enum ExecuteMsg { /// Burn an NFT the sender has access to Burn { token_id: String }, /// Update collection info + #[allow(deprecated)] UpdateCollectionInfo { + #[allow(deprecated)] new_collection_info: UpdateCollectionInfoMsg, }, /// Freeze collection info from further updates diff --git a/contracts/collections/sg721-updatable/examples/schema.rs b/contracts/collections/sg721-updatable/examples/schema.rs index c13cc631f..e9e52254b 100644 --- a/contracts/collections/sg721-updatable/examples/schema.rs +++ b/contracts/collections/sg721-updatable/examples/schema.rs @@ -4,13 +4,14 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; use cosmwasm_std::Empty; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{state::CollectionMetadata, CollectionMetadataExtension, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, RoyaltyInfo}; +#[allow(deprecated)] pub use cw721_base::{ContractInfoResponse,msg::{ AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, MinterResponse }}; -use cw721_base::Extension; use sg721::InstantiateMsg; +#[allow(deprecated)] pub use sg721_base::msg::CollectionInfoResponse; use sg721_base::msg::QueryMsg; use sg721_updatable::msg::ExecuteMsg; @@ -22,12 +23,14 @@ fn main() { remove_schemas(&out_dir).unwrap(); export_schema(&schema_for!(InstantiateMsg), &out_dir); - export_schema(&schema_for!(ExecuteMsg), &out_dir); + export_schema(&schema_for!(ExecuteMsg), &out_dir); export_schema(&schema_for!(QueryMsg::< DefaultOptionNftMetadataExtension, DefaultOptionCollectionMetadataExtension, >), &out_dir); + #[allow(deprecated)] export_schema(&schema_for!(CollectionInfoResponse), &out_dir); + export_schema(&schema_for!(CollectionMetadata>), &out_dir); export_schema_with_title( &schema_for!(AllNftInfoResponse), &out_dir, @@ -42,7 +45,9 @@ fn main() { export_schema(&schema_for!(MinterResponse), &out_dir); export_schema(&schema_for!(ApprovalResponse), &out_dir); export_schema(&schema_for!(ApprovalsResponse), &out_dir); + #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); + export_schema(&schema_for!(CollectionMetadata), &out_dir); export_schema_with_title( &schema_for!(NftInfoResponse), &out_dir, diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index 728a9363c..0c74a0aee 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -13,12 +13,12 @@ use cw721::{ }; use semver::Version; use sg721::InstantiateMsg; +#[allow(deprecated)] use sg721_base::msg::CollectionInfoResponse; use crate::msg::{EnableUpdatableResponse, FrozenTokenMetadataResponse}; use crate::state::ENABLE_UPDATABLE; -use cw721_base::Extension; use cw_utils::nonpayable; use sg1::checked_fair_burn; use sg721_base::ContractError::Unauthorized; @@ -59,6 +59,7 @@ pub fn _instantiate( Ok(res) } +#[allow(deprecated)] pub fn execute_enable_updatable( deps: DepsMut, _env: Env, @@ -87,6 +88,7 @@ pub fn execute_enable_updatable( .add_attribute("enabled", "true")) } +#[allow(deprecated)] pub fn execute_freeze_token_metadata( deps: DepsMut, _env: Env, @@ -107,6 +109,7 @@ pub fn execute_freeze_token_metadata( .add_attribute("frozen", "true")) } +#[allow(deprecated)] pub fn execute_update_token_metadata( deps: DepsMut, _env: Env, @@ -238,6 +241,7 @@ pub fn _migrate(mut deps: DepsMut, env: Env, _msg: Empty) -> Result { Burn { token_id: String, }, + #[allow(deprecated)] UpdateCollectionInfo { + #[allow(deprecated)] collection_info: UpdateCollectionInfoMsg, }, UpdateStartTradingTime(Option), @@ -114,6 +117,7 @@ where ExecuteMsg::RevokeAll { operator } => Sg721ExecuteMsg::RevokeAll { operator }, ExecuteMsg::Burn { token_id } => Sg721ExecuteMsg::Burn { token_id }, ExecuteMsg::UpdateCollectionInfo { collection_info } => { + #[allow(deprecated)] Sg721ExecuteMsg::UpdateCollectionInfo { collection_info } } ExecuteMsg::FreezeCollectionInfo {} => Sg721ExecuteMsg::FreezeCollectionInfo {}, @@ -225,6 +229,7 @@ impl From limit, }, QueryMsg::NumTokens {} => Sg721QueryMsg::NumTokens {}, + #[allow(deprecated)] QueryMsg::ContractInfo {} => Sg721QueryMsg::ContractInfo {}, QueryMsg::NftInfo { token_id } => Sg721QueryMsg::NftInfo { token_id }, QueryMsg::AllNftInfo { @@ -246,7 +251,9 @@ impl From QueryMsg::AllTokens { start_after, limit } => { Sg721QueryMsg::AllTokens { start_after, limit } } + #[allow(deprecated)] QueryMsg::Minter {} => Sg721QueryMsg::Minter {}, + #[allow(deprecated)] QueryMsg::CollectionInfo {} => Sg721QueryMsg::CollectionInfo {}, _ => unreachable!("cannot convert {:?} to Sg721QueryMsg", msg), } diff --git a/contracts/minters/open-edition-minter/src/contract.rs b/contracts/minters/open-edition-minter/src/contract.rs index 8c5d645df..cb43aaac3 100644 --- a/contracts/minters/open-edition-minter/src/contract.rs +++ b/contracts/minters/open-edition-minter/src/contract.rs @@ -33,6 +33,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); const INSTANTIATE_SG721_REPLY_ID: u64 = 1; #[cfg_attr(not(feature = "library"), entry_point)] +#[allow(deprecated)] pub fn instantiate( deps: DepsMut, env: Env, diff --git a/contracts/minters/open-edition-minter/src/helpers.rs b/contracts/minters/open-edition-minter/src/helpers.rs index f8773d74a..39bb54ed3 100644 --- a/contracts/minters/open-edition-minter/src/helpers.rs +++ b/contracts/minters/open-edition-minter/src/helpers.rs @@ -3,7 +3,7 @@ use cosmwasm_std::{ to_json_binary, Addr, Coin, ContractInfoResponse, CosmosMsg, CustomQuery, Empty, Querier, QuerierWrapper, StdError, StdResult, WasmMsg, WasmQuery, }; -use cw721_base::Extension; +use cw721_base::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use sg721::ExecuteMsg as Sg721ExecuteMsg; use sg_metadata::Metadata; @@ -84,7 +84,7 @@ pub fn mint_nft_msg( } else { CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: sg721_address.to_string(), - msg: to_json_binary(&Sg721ExecuteMsg::::Mint { + msg: to_json_binary(&Sg721ExecuteMsg::::Mint { token_id, owner: recipient_addr.to_string(), token_uri, diff --git a/contracts/minters/vending-minter-merkle-wl/src/contract.rs b/contracts/minters/vending-minter-merkle-wl/src/contract.rs index b763a1ceb..8758da350 100644 --- a/contracts/minters/vending-minter-merkle-wl/src/contract.rs +++ b/contracts/minters/vending-minter-merkle-wl/src/contract.rs @@ -16,7 +16,7 @@ use cosmwasm_std::{ Timestamp, Uint128, WasmMsg, }; use cw2::set_contract_version; -use cw721_base::Extension; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use rand_core::{RngCore, SeedableRng}; use rand_xoshiro::Xoshiro128PlusPlus; @@ -49,6 +49,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); const INSTANTIATE_SG721_REPLY_ID: u64 = 1; #[cfg_attr(not(feature = "library"), entry_point)] +#[allow(deprecated)] pub fn instantiate( deps: DepsMut, env: Env, @@ -703,7 +704,10 @@ fn _execute_mint( }; // Create mint msgs - let mint_msg = Sg721ExecuteMsg::::Mint { + let mint_msg = Sg721ExecuteMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Mint { token_id: mintable_token_mapping.token_id.to_string(), owner: recipient_addr.to_string(), token_uri: Some(format!( diff --git a/contracts/minters/vending-minter-wl-flex/src/contract.rs b/contracts/minters/vending-minter-wl-flex/src/contract.rs index f6201ae51..aead8fbf8 100644 --- a/contracts/minters/vending-minter-wl-flex/src/contract.rs +++ b/contracts/minters/vending-minter-wl-flex/src/contract.rs @@ -15,7 +15,7 @@ use cosmwasm_std::{ Timestamp, Uint128, WasmMsg, }; use cw2::set_contract_version; -use cw721_base::Extension; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use rand_core::{RngCore, SeedableRng}; use rand_xoshiro::Xoshiro128PlusPlus; @@ -49,6 +49,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); const INSTANTIATE_SG721_REPLY_ID: u64 = 1; #[cfg_attr(not(feature = "library"), entry_point)] +#[allow(deprecated)] pub fn instantiate( deps: DepsMut, env: Env, @@ -673,7 +674,7 @@ fn _execute_mint( }; // Create mint msgs - let mint_msg = Sg721ExecuteMsg::::Mint { + let mint_msg = Sg721ExecuteMsg::::Mint { token_id: mintable_token_mapping.token_id.to_string(), owner: recipient_addr.to_string(), token_uri: Some(format!( diff --git a/contracts/minters/vending-minter/src/contract.rs b/contracts/minters/vending-minter/src/contract.rs index 09dd34006..60c70384b 100644 --- a/contracts/minters/vending-minter/src/contract.rs +++ b/contracts/minters/vending-minter/src/contract.rs @@ -16,7 +16,7 @@ use cosmwasm_std::{ Timestamp, Uint128, WasmMsg, }; use cw2::set_contract_version; -use cw721_base::Extension; +use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use rand_core::{RngCore, SeedableRng}; use rand_xoshiro::Xoshiro128PlusPlus; @@ -48,6 +48,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); const INSTANTIATE_SG721_REPLY_ID: u64 = 1; #[cfg_attr(not(feature = "library"), entry_point)] +#[allow(deprecated)] pub fn instantiate( deps: DepsMut, env: Env, @@ -680,7 +681,10 @@ fn _execute_mint( }; // Create mint msgs - let mint_msg = Sg721ExecuteMsg::::Mint { + let mint_msg = Sg721ExecuteMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Mint { token_id: mintable_token_mapping.token_id.to_string(), owner: recipient_addr.to_string(), token_uri: Some(format!( diff --git a/e2e/src/helpers/helper.rs b/e2e/src/helpers/helper.rs index 299d06a14..0a1249abd 100644 --- a/e2e/src/helpers/helper.rs +++ b/e2e/src/helpers/helper.rs @@ -10,6 +10,7 @@ use sg2::{ msg::{CollectionParams, CreateMinterMsg}, MinterParams, }; +#[allow(deprecated)] use sg721::CollectionInfo; use vending_factory::{ msg::{InstantiateMsg, VendingMinterInitMsgExtension}, @@ -98,6 +99,7 @@ pub fn create_minter_msg( code_id: chain.orc.contract_map.code_id(SG721_NAME).unwrap(), name: "Collection".to_string(), symbol: "SYM".to_string(), + #[allow(deprecated)] info: CollectionInfo { creator: creator_addr, description: "Description".to_string(), diff --git a/e2e/src/helpers/open_edition_minter_helpers.rs b/e2e/src/helpers/open_edition_minter_helpers.rs index 51ae64282..d2d316423 100644 --- a/e2e/src/helpers/open_edition_minter_helpers.rs +++ b/e2e/src/helpers/open_edition_minter_helpers.rs @@ -11,6 +11,7 @@ use sg2::{ msg::{CollectionParams, CreateMinterMsg}, MinterParams, }; +#[allow(deprecated)] use sg721::CollectionInfo; // contract names used by cosm-orc to register stored code ids / instantiated addresses: @@ -104,6 +105,7 @@ pub fn create_minter_msg( code_id: code_id.unwrap_or_else(|| chain.orc.contract_map.code_id(SG721_NAME).unwrap()), name: "Collection".to_string(), symbol: "SYM".to_string(), + #[allow(deprecated)] info: CollectionInfo { creator: creator_addr, description: "Description".to_string(), diff --git a/e2e/src/tests/sg721_test.rs b/e2e/src/tests/sg721_test.rs index 51befd07e..09ef5bfa9 100644 --- a/e2e/src/tests/sg721_test.rs +++ b/e2e/src/tests/sg721_test.rs @@ -1,6 +1,7 @@ use assert_matches::assert_matches; use cosm_orc::orchestrator::error::CosmwasmError::TxError; use cosm_orc::orchestrator::error::ProcessError; +#[allow(deprecated)] use sg721::{CollectionInfo, InstantiateMsg}; use test_context::test_context; @@ -20,6 +21,7 @@ fn test_unauthorized_sg721_instantiation(chain: &mut Chain) { name: "Collection Name".to_string(), symbol: "COL".to_string(), minter: user_addr.to_string(), + #[allow(deprecated)] collection_info: CollectionInfo { creator: user_addr.to_string(), description: "Description".to_string(), diff --git a/packages/sg2/src/msg.rs b/packages/sg2/src/msg.rs index 434563b45..f5281f2cb 100644 --- a/packages/sg2/src/msg.rs +++ b/packages/sg2/src/msg.rs @@ -1,5 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::Coin; +#[allow(deprecated)] use sg721::{CollectionInfo, RoyaltyInfoResponse}; #[cw_serde] @@ -9,11 +10,13 @@ pub struct CreateMinterMsg { } #[cw_serde] +#[allow(deprecated)] pub struct CollectionParams { /// The collection code id pub code_id: u64, pub name: String, pub symbol: String, + #[allow(deprecated)] pub info: CollectionInfo, } diff --git a/packages/sg2/src/tests.rs b/packages/sg2/src/tests.rs index 843181a83..97abcd046 100644 --- a/packages/sg2/src/tests.rs +++ b/packages/sg2/src/tests.rs @@ -1,6 +1,7 @@ use crate::msg::CollectionParams; use cosmwasm_std::Decimal; use cosmwasm_std::Timestamp; +#[allow(deprecated)] use sg721::{CollectionInfo, RoyaltyInfoResponse}; #[allow(deprecated)] @@ -29,6 +30,7 @@ pub fn mock_collection_params_1(start_trading_time: Option) -> Collec code_id: 1, name: "Collection Name".to_string(), symbol: "COL".to_string(), + #[allow(deprecated)] info: CollectionInfo { creator: "creator".to_string(), description: String::from("Stargaze Monkeys"), @@ -49,6 +51,7 @@ pub fn mock_curator_payment_address(start_trading_time: Option) -> Co code_id: 1, name: String::from("Test Coin"), symbol: String::from("TEST"), + #[allow(deprecated)] info: CollectionInfo { creator: "creator".to_string(), description: String::from("Stargaze Monkeys"), @@ -69,6 +72,7 @@ pub fn mock_collection_params_high_fee(start_trading_time: Option) -> code_id: 1, name: String::from("Test Coin"), symbol: String::from("TEST"), + #[allow(deprecated)] info: CollectionInfo { creator: "creator".to_string(), description: String::from("Stargaze Monkeys"), @@ -91,6 +95,7 @@ pub fn mock_collection_two(start_trading_time: Option) -> CollectionP code_id: 1, name: String::from("Test Collection 2"), symbol: String::from("TEST 2"), + #[allow(deprecated)] info: CollectionInfo { creator: "creator".to_string(), description: String::from("Stargaze Monkeys 2"), diff --git a/packages/sg721/src/lib.rs b/packages/sg721/src/lib.rs index d392ea57c..8e74f8014 100644 --- a/packages/sg721/src/lib.rs +++ b/packages/sg721/src/lib.rs @@ -1,13 +1,10 @@ use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Binary, Coin, Decimal, Timestamp}; +use cosmwasm_std::{Binary, Coin, Timestamp}; use cw721_base::{ msg::{ CollectionMetadataExtensionMsg, CollectionMetadataMsg, ExecuteMsg as Cw721ExecuteMsg, InstantiateMsg as Cw721InstantiateMsg }, - state::{ - CollectionMetadata, CollectionMetadataExtension, - }, - DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtensionMsg, }; use cw_ownable::Action; use cw_utils::Expiration; @@ -26,6 +23,7 @@ pub enum ExecuteMsg< /// Update specific collection info fields #[deprecated = "Please use UpdateCollectionInfo instead"] UpdateCollectionInfo { + #[allow(deprecated)] collection_info: UpdateCollectionInfoMsg, }, /// Called by the minter to update trading start time @@ -137,6 +135,7 @@ impl TCollectionMetadataExtensionMsg, > { + #[allow(deprecated)] fn from( msg: ExecuteMsg< TNftMetadataExtensionMsg, @@ -145,7 +144,7 @@ impl ) -> Self { match msg { // ---- sg721 msgs ---- - ExecuteMsg::UpdateCollectionInfo { collection_info } => { + ExecuteMsg::UpdateCollectionInfo { collection_info: _ } => { panic!("not a cw721 msg") } ExecuteMsg::UpdateStartTradingTime(_) => panic!("not a cw721 msg"), @@ -287,6 +286,7 @@ pub struct InstantiateMsg { pub collection_info: CollectionInfo, } +#[allow(deprecated)] impl From for Cw721InstantiateMsg { fn from(msg: InstantiateMsg) -> Self { Cw721InstantiateMsg { diff --git a/test-suite/src/base_minter/tests/integration_tests.rs b/test-suite/src/base_minter/tests/integration_tests.rs index 3f4d3386d..1fe6e2c99 100644 --- a/test-suite/src/base_minter/tests/integration_tests.rs +++ b/test-suite/src/base_minter/tests/integration_tests.rs @@ -16,6 +16,7 @@ use sg2::msg::Sg2ExecuteMsg; use sg2::query::{AllowedCollectionCodeIdsResponse, Sg2QueryMsg}; use sg2::tests::mock_collection_params_1; use sg4::QueryMsg; +#[allow(deprecated)] use sg721_base::msg::{CollectionInfoResponse, QueryMsg as Sg721QueryMsg}; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; @@ -27,6 +28,7 @@ fn init() { } #[test] +#[allow(deprecated)] fn update_code_id() { let sg721_code_id = 7u64; let bmt = base_minter_with_specified_sg721(1, sg721_code_id); @@ -186,6 +188,7 @@ fn check_mint() { } #[test] +#[allow(deprecated)] fn update_start_trading_time() { let bmt = base_minter_with_sg721(1); let (mut router, creator, buyer) = (bmt.router, bmt.accts.creator, bmt.accts.buyer); diff --git a/test-suite/src/common_setup/setup_minter/base_minter/setup.rs b/test-suite/src/common_setup/setup_minter/base_minter/setup.rs index cb3424d1e..35907767e 100644 --- a/test-suite/src/common_setup/setup_minter/base_minter/setup.rs +++ b/test-suite/src/common_setup/setup_minter/base_minter/setup.rs @@ -55,6 +55,7 @@ pub fn base_minter_sg721_collection_code_ids(router: &mut App) -> CodeIds { } // Upload contract code and instantiate minter contract +#[allow(deprecated)] pub fn setup_minter_contract(setup_params: MinterSetupParams) -> MinterCollectionResponse { let minter_code_id = setup_params.minter_code_id; let router = setup_params.router; diff --git a/test-suite/src/common_setup/setup_minter/open_edition_minter/setup.rs b/test-suite/src/common_setup/setup_minter/open_edition_minter/setup.rs index 488d13e49..073b63e8b 100644 --- a/test-suite/src/common_setup/setup_minter/open_edition_minter/setup.rs +++ b/test-suite/src/common_setup/setup_minter/open_edition_minter/setup.rs @@ -50,6 +50,7 @@ pub fn build_init_msg( } // Upload contract code and instantiate open edition minter contract +#[allow(deprecated)] pub fn setup_open_edition_minter_contract( setup_params: OpenEditionMinterSetupParams, ) -> MinterCollectionResponse { diff --git a/test-suite/src/common_setup/setup_minter/vending_minter/setup.rs b/test-suite/src/common_setup/setup_minter/vending_minter/setup.rs index a4884b789..9ad1d621d 100644 --- a/test-suite/src/common_setup/setup_minter/vending_minter/setup.rs +++ b/test-suite/src/common_setup/setup_minter/vending_minter/setup.rs @@ -36,6 +36,7 @@ pub fn build_init_msg( } // Upload contract code and instantiate minter contract +#[allow(deprecated)] pub fn setup_minter_contract(setup_params: MinterSetupParams) -> MinterCollectionResponse { let minter_code_id = setup_params.minter_code_id; let router = setup_params.router; diff --git a/test-suite/src/open_edition_minter/tests/frozen_factory.rs b/test-suite/src/open_edition_minter/tests/frozen_factory.rs index 8081a900a..a393b9f64 100644 --- a/test-suite/src/open_edition_minter/tests/frozen_factory.rs +++ b/test-suite/src/open_edition_minter/tests/frozen_factory.rs @@ -17,6 +17,7 @@ use crate::common_setup::setup_minter::open_edition_minter::mock_params::mock_cr use crate::common_setup::templates::open_edition_minter_custom_template; #[test] +#[allow(deprecated)] fn frozen_factory_cannot_create_new_minters() { let params_extension = ParamsExtension { max_token_limit: 10, diff --git a/test-suite/src/vending_minter/tests/allowed_code_ids.rs b/test-suite/src/vending_minter/tests/allowed_code_ids.rs index 3fa0f1389..2dd7779de 100644 --- a/test-suite/src/vending_minter/tests/allowed_code_ids.rs +++ b/test-suite/src/vending_minter/tests/allowed_code_ids.rs @@ -23,6 +23,7 @@ fn init() { } #[test] +#[allow(deprecated)] fn update_code_id() { let sg721_code_id = 7u64; diff --git a/test-suite/src/vending_minter/tests/frozen_factory.rs b/test-suite/src/vending_minter/tests/frozen_factory.rs index 9b2e6ec55..062ac6cd8 100644 --- a/test-suite/src/vending_minter/tests/frozen_factory.rs +++ b/test-suite/src/vending_minter/tests/frozen_factory.rs @@ -15,6 +15,7 @@ use vending_factory::msg::{ }; #[test] +#[allow(deprecated)] fn frozen_factory_cannot_create_new_minters() { let vt = vending_minter_template(2); let (mut router, creator, _) = (vt.router, vt.accts.creator, vt.accts.buyer); diff --git a/test-suite/src/vending_minter/tests/happy_unhappy.rs b/test-suite/src/vending_minter/tests/happy_unhappy.rs index 2dc368ae6..780bfcf7d 100644 --- a/test-suite/src/vending_minter/tests/happy_unhappy.rs +++ b/test-suite/src/vending_minter/tests/happy_unhappy.rs @@ -23,6 +23,7 @@ const ADMIN_MINT_PRICE: u128 = 0; const MAX_TOKEN_LIMIT: u32 = 10000; #[test] +#[allow(deprecated)] fn initialization() { let mut deps = mock_dependencies_with_balance(&coins(2, "token")); diff --git a/test-suite/src/vending_minter/tests/ibc_asset_mint.rs b/test-suite/src/vending_minter/tests/ibc_asset_mint.rs index 661605737..af988bc63 100644 --- a/test-suite/src/vending_minter/tests/ibc_asset_mint.rs +++ b/test-suite/src/vending_minter/tests/ibc_asset_mint.rs @@ -58,6 +58,7 @@ fn mint_with_ibc_asset() { } #[test] +#[allow(deprecated)] fn denom_mismatch_creating_minter() { // create factory w NATIVE_DENOM, then try creating a minter w different denom let denom = "ibc/asset"; @@ -133,6 +134,7 @@ fn wl_denom_mismatch() { } #[test] +#[allow(deprecated)] fn wl_denom_mint() { // create factory, minter, wl w custom denom, then try mint let denom = "ibc/asset"; diff --git a/test-suite/src/vending_minter/tests/trading_time.rs b/test-suite/src/vending_minter/tests/trading_time.rs index 57cca5325..655f163bc 100644 --- a/test-suite/src/vending_minter/tests/trading_time.rs +++ b/test-suite/src/vending_minter/tests/trading_time.rs @@ -9,6 +9,7 @@ use cosmwasm_std::{coins, Addr, Timestamp}; use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; +#[allow(deprecated)] use sg721_base::msg::{CollectionInfoResponse, QueryMsg as Sg721QueryMsg}; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; use vending_minter::msg::{ExecuteMsg, QueryMsg, StartTimeResponse}; @@ -228,6 +229,7 @@ fn invalid_trading_time_during_init() { ); } #[test] +#[allow(deprecated)] fn update_start_trading_time() { let mut router = custom_mock_app(); setup_block_time(&mut router, GENESIS_MINT_START_TIME - 1, None); diff --git a/test-suite/src/vending_minter/tests/trading_time_updatable.rs b/test-suite/src/vending_minter/tests/trading_time_updatable.rs index ac9dadf66..5f87ef8d0 100644 --- a/test-suite/src/vending_minter/tests/trading_time_updatable.rs +++ b/test-suite/src/vending_minter/tests/trading_time_updatable.rs @@ -11,6 +11,7 @@ use cosmwasm_std::{coins, Addr, Timestamp}; use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; +#[allow(deprecated)] use sg721_base::msg::{CollectionInfoResponse, QueryMsg as Sg721QueryMsg}; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; use vending_minter::msg::{ExecuteMsg, QueryMsg, StartTimeResponse}; @@ -19,6 +20,7 @@ use vending_minter::ContractError; const MINT_PRICE: u128 = 100_000_000; #[test] +#[allow(deprecated)] fn before_start_time() { let vt: crate::common_setup::msg::MinterTemplateResponse = vending_minter_with_updatable_and_start_time( @@ -234,6 +236,7 @@ fn invalid_trading_time_during_init() { ); } #[test] +#[allow(deprecated)] fn update_start_trading_time() { let mut router = custom_mock_app(); setup_block_time(&mut router, GENESIS_MINT_START_TIME - 1, None); diff --git a/test-suite/src/vending_minter/tests/updatable.rs b/test-suite/src/vending_minter/tests/updatable.rs index 4a14ea2dc..6da98b30a 100644 --- a/test-suite/src/vending_minter/tests/updatable.rs +++ b/test-suite/src/vending_minter/tests/updatable.rs @@ -1,7 +1,6 @@ use cosmwasm_std::{coins, Empty}; use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; use cw721_base::msg::{Cw721QueryMsg, NftInfoResponse, TokensResponse}; -use cw721_base::Extension; use cw_multi_test::Executor; use sg721_updatable::msg::ExecuteMsg as Sg721UpdatableExecMsg; use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM}; @@ -61,7 +60,7 @@ fn update_token_metadata() { .unwrap(); assert_eq!(res.tokens[0], token_id); let query_token_msg = Cw721QueryMsg::::NftInfo { token_id }; - let res: NftInfoResponse = router + let res: NftInfoResponse = router .wrap() .query_wasm_smart(collection_addr, &query_token_msg) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/zero_mint_price.rs b/test-suite/src/vending_minter/tests/zero_mint_price.rs index c1cd3f66d..db2dc954b 100644 --- a/test-suite/src/vending_minter/tests/zero_mint_price.rs +++ b/test-suite/src/vending_minter/tests/zero_mint_price.rs @@ -23,6 +23,7 @@ use vending_minter::msg::ExecuteMsg; const MINT_PRICE: u128 = 0; #[test] +#[allow(deprecated)] fn zero_mint_price() { let num_tokens = 2; let mut app = custom_mock_app(); @@ -113,6 +114,7 @@ fn zero_mint_price() { } #[test] +#[allow(deprecated)] fn zero_wl_mint_price() { let num_tokens = 2; let mut app = custom_mock_app(); @@ -209,6 +211,7 @@ fn zero_wl_mint_price() { } #[test] +#[allow(deprecated)] fn zero_wl_mint_errs_with_min_mint_factory() { let num_tokens = 2; let min_mint_price: u128 = 100_000_000; From cb9eb6aaaba1f682f2f025fada7a6cfe7ac20aa1 Mon Sep 17 00:00:00 2001 From: mr-t Date: Mon, 18 Mar 2024 19:56:54 +0100 Subject: [PATCH 06/20] cleanup --- .../collections/sg721-base/examples/schema.rs | 6 +-- .../collections/sg721-base/src/contract.rs | 4 +- contracts/collections/sg721-base/src/lib.rs | 8 +--- contracts/collections/sg721-base/src/msg.rs | 11 +++-- .../collections/sg721-nt/examples/schema.rs | 16 ++++--- contracts/collections/sg721-nt/src/lib.rs | 13 ++---- .../sg721-updatable/examples/schema.rs | 46 +++++++++++++------ .../sg721-updatable/src/contract.rs | 16 ++++--- .../collections/sg721-updatable/src/lib.rs | 13 ++++-- .../collections/sg721-updatable/src/msg.rs | 3 +- contracts/minters/base-minter/src/contract.rs | 23 +++++++--- .../open-edition-minter/src/contract.rs | 10 ++-- .../open-edition-minter/src/helpers.rs | 5 +- .../vending-minter-wl-flex/src/contract.rs | 5 +- packages/sg721/src/lib.rs | 26 ++++------- .../src/sg721_base/tests/integration_tests.rs | 28 +++++++++-- .../src/vending_minter/tests/address_limit.rs | 5 +- .../src/vending_minter/tests/happy_unhappy.rs | 5 +- .../src/vending_minter/tests/trading_time.rs | 5 +- .../tests/trading_time_updatable.rs | 5 +- .../src/vending_minter/tests/updatable.rs | 12 ++++- .../vending_minter/tests/zero_mint_price.rs | 5 +- 22 files changed, 169 insertions(+), 101 deletions(-) diff --git a/contracts/collections/sg721-base/examples/schema.rs b/contracts/collections/sg721-base/examples/schema.rs index 41e155f83..8916f2be1 100644 --- a/contracts/collections/sg721-base/examples/schema.rs +++ b/contracts/collections/sg721-base/examples/schema.rs @@ -3,8 +3,6 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; -use cosmwasm_std::Empty; - use cw721_base::{ msg::{ AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, @@ -36,7 +34,7 @@ fn main() { &out_dir, ); export_schema_with_title( - &schema_for!(AllNftInfoResponse), + &schema_for!(AllNftInfoResponse), &out_dir, "AllNftInfoResponse", ); @@ -55,7 +53,7 @@ fn main() { &out_dir, ); export_schema_with_title( - &schema_for!(NftInfoResponse), + &schema_for!(NftInfoResponse), &out_dir, "NftInfoResponse", ); diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index e7680da28..47daff3c2 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -8,8 +8,8 @@ use cw721_base::{ }; use cosmwasm_std::{ - to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Deps, DepsMut, Empty, - Env, Event, MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, + to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Deps, DepsMut, Empty, Env, + Event, MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, }; use cw721_base::{execute::Cw721Execute, query::Cw721Query}; diff --git a/contracts/collections/sg721-base/src/lib.rs b/contracts/collections/sg721-base/src/lib.rs index 8fb5e2831..492d72db4 100644 --- a/contracts/collections/sg721-base/src/lib.rs +++ b/contracts/collections/sg721-base/src/lib.rs @@ -6,12 +6,8 @@ pub mod upgrades; pub use crate::error::ContractError; pub use crate::state::Sg721Contract; -use cw721::{ - DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, -}; -use cw721_base::{ - DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, -}; +use cw721::{DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg}; +use cw721_base::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; pub type ExecuteMsg = sg721::ExecuteMsg< DefaultOptionNftMetadataExtensionMsg, diff --git a/contracts/collections/sg721-base/src/msg.rs b/contracts/collections/sg721-base/src/msg.rs index 7e4842186..661b1f324 100644 --- a/contracts/collections/sg721-base/src/msg.rs +++ b/contracts/collections/sg721-base/src/msg.rs @@ -3,14 +3,15 @@ use cw721::traits::Cw721State; use cosmwasm_schema::cw_serde; use cosmwasm_schema::QueryResponses; -use cosmwasm_std::{coin, Addr, BankMsg, Empty, Event, StdError, StdResult, Timestamp, Uint128}; +use cosmwasm_std::{coin, Addr, BankMsg, Event, StdError, StdResult, Timestamp, Uint128}; use cw721_base::{ msg::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, - NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, - QueryMsg as Cw721QueryMsg, TokensResponse, + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, + NumTokensResponse, OperatorsResponse, OwnerOfResponse, QueryMsg as Cw721QueryMsg, + TokensResponse, }, state::CollectionMetadata, + DefaultOptionCollectionMetadataExtensionMsg, }; use cw_ownable::Ownership; use sg_std::{Response, SubMsg, NATIVE_DENOM}; @@ -63,7 +64,7 @@ pub enum QueryMsg< NumTokens {}, #[deprecated(since = "0.19.0", note = "Please use GetCollectionMetadata instead")] - #[returns(CollectionMetadata)] + #[returns(CollectionMetadata)] /// Deprecated: use GetCollectionMetadata instead! Will be removed in next release! ContractInfo {}, diff --git a/contracts/collections/sg721-nt/examples/schema.rs b/contracts/collections/sg721-nt/examples/schema.rs index bf80b1c31..dc3f0f21a 100644 --- a/contracts/collections/sg721-nt/examples/schema.rs +++ b/contracts/collections/sg721-nt/examples/schema.rs @@ -3,9 +3,10 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; -use cosmwasm_std::Empty; - -use cw721::{state::CollectionMetadata, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{ + state::CollectionMetadata, DefaultOptionCollectionMetadataExtension, + DefaultOptionNftMetadataExtension, +}; #[allow(deprecated)] use cw721_base::{ msg::{ @@ -33,7 +34,7 @@ fn main() { &out_dir, ); export_schema_with_title( - &schema_for!(AllNftInfoResponse), + &schema_for!(AllNftInfoResponse), &out_dir, "AllNftInfoResponse", ); @@ -49,9 +50,12 @@ fn main() { export_schema(&schema_for!(OperatorsResponse), &out_dir); #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); - export_schema(&schema_for!(CollectionMetadata), &out_dir); + export_schema( + &schema_for!(CollectionMetadata), + &out_dir, + ); export_schema_with_title( - &schema_for!(NftInfoResponse), + &schema_for!(NftInfoResponse), &out_dir, "NftInfoResponse", ); diff --git a/contracts/collections/sg721-nt/src/lib.rs b/contracts/collections/sg721-nt/src/lib.rs index d2de4a768..385ec03db 100644 --- a/contracts/collections/sg721-nt/src/lib.rs +++ b/contracts/collections/sg721-nt/src/lib.rs @@ -35,9 +35,7 @@ pub mod entry { use super::*; use crate::msg::ExecuteMsg; - use cosmwasm_std::{ - Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdError, - }; + use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdError}; use cw721::msg::Cw721MigrateMsg; use cw721_base::execute::Cw721Execute; use sg721_base::ContractError; @@ -82,13 +80,8 @@ pub mod entry { token_uri, extension, }; - Sg721NonTransferableContract::default().mint( - deps, - env, - info, - nft_data, - ) - }, + Sg721NonTransferableContract::default().mint(deps, env, info, nft_data) + } ExecuteMsg::UpdateCollectionInfo { new_collection_info, } => Sg721NonTransferableContract::default().update_collection_info( diff --git a/contracts/collections/sg721-updatable/examples/schema.rs b/contracts/collections/sg721-updatable/examples/schema.rs index e9e52254b..775d8d7c4 100644 --- a/contracts/collections/sg721-updatable/examples/schema.rs +++ b/contracts/collections/sg721-updatable/examples/schema.rs @@ -3,13 +3,18 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; -use cosmwasm_std::Empty; -use cw721::{state::CollectionMetadata, CollectionMetadataExtension, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, RoyaltyInfo}; +use cw721::{ + state::CollectionMetadata, CollectionMetadataExtension, + DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, RoyaltyInfo, +}; #[allow(deprecated)] -pub use cw721_base::{ContractInfoResponse,msg::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, MinterResponse -}}; +pub use cw721_base::{ + msg::{ + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, + NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, + }, + ContractInfoResponse, +}; use sg721::InstantiateMsg; #[allow(deprecated)] pub use sg721_base::msg::CollectionInfoResponse; @@ -23,16 +28,24 @@ fn main() { remove_schemas(&out_dir).unwrap(); export_schema(&schema_for!(InstantiateMsg), &out_dir); - export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, - >), &out_dir); + export_schema( + &schema_for!(ExecuteMsg), + &out_dir, + ); + export_schema( + &schema_for!( + QueryMsg:: + ), + &out_dir, + ); #[allow(deprecated)] export_schema(&schema_for!(CollectionInfoResponse), &out_dir); - export_schema(&schema_for!(CollectionMetadata>), &out_dir); + export_schema( + &schema_for!(CollectionMetadata>), + &out_dir, + ); export_schema_with_title( - &schema_for!(AllNftInfoResponse), + &schema_for!(AllNftInfoResponse), &out_dir, "AllNftInfoResponse", ); @@ -47,9 +60,12 @@ fn main() { export_schema(&schema_for!(ApprovalsResponse), &out_dir); #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); - export_schema(&schema_for!(CollectionMetadata), &out_dir); + export_schema( + &schema_for!(CollectionMetadata), + &out_dir, + ); export_schema_with_title( - &schema_for!(NftInfoResponse), + &schema_for!(NftInfoResponse), &out_dir, "NftInfoResponse", ); diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index 0c74a0aee..8504fb48f 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -139,17 +139,16 @@ pub fn execute_update_token_metadata( } // Update token metadata - Sg721UpdatableContract::default().config.nft_info.update( - deps.storage, - &token_id, - |token| match token { + Sg721UpdatableContract::default() + .config + .nft_info + .update(deps.storage, &token_id, |token| match token { Some(mut token_info) => { token_info.token_uri = token_uri.clone(); Ok(token_info) } None => Err(ContractError::TokenIdNotFound {}), - }, - )?; + })?; let mut event = Event::new("update_update_token_metadata") .add_attribute("sender", info.sender) @@ -375,7 +374,10 @@ mod tests { assert_eq!(res.token_uri, updated_token_uri); // Update token metadata with None token_uri - let update_msg = ExecuteMsg::::UpdateTokenMetadata { + let update_msg = ExecuteMsg::< + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtensionMsg, + >::UpdateTokenMetadata { token_id: token_id.to_string(), token_uri: None, }; diff --git a/contracts/collections/sg721-updatable/src/lib.rs b/contracts/collections/sg721-updatable/src/lib.rs index 10d500e14..9243106fa 100644 --- a/contracts/collections/sg721-updatable/src/lib.rs +++ b/contracts/collections/sg721-updatable/src/lib.rs @@ -20,7 +20,9 @@ pub mod entry { }; use cosmwasm_std::{entry_point, to_json_binary, Empty}; use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response}; - use cw721::{DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg}; + use cw721::{ + DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, + }; #[entry_point] pub fn instantiate( @@ -37,7 +39,10 @@ pub mod entry { deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg< + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtensionMsg, + >, ) -> Result { match msg { ExecuteMsg::FreezeTokenMetadata {} => execute_freeze_token_metadata(deps, env, info), @@ -57,7 +62,9 @@ pub mod entry { match msg { QueryMsg::EnableUpdatable {} => Ok(to_json_binary(&query_enable_updatable(deps)?)?), QueryMsg::EnableUpdatableFee {} => Ok(to_json_binary(&query_enable_updatable_fee()?)?), - QueryMsg::FreezeTokenMetadata {} => Ok(to_json_binary(&query_frozen_token_metadata(deps)?)?), + QueryMsg::FreezeTokenMetadata {} => { + Ok(to_json_binary(&query_frozen_token_metadata(deps)?)?) + } _ => Ok(Sg721UpdatableContract::default().query(deps, env, msg.into())?), } } diff --git a/contracts/collections/sg721-updatable/src/msg.rs b/contracts/collections/sg721-updatable/src/msg.rs index aba6e2bfb..4cdd17555 100644 --- a/contracts/collections/sg721-updatable/src/msg.rs +++ b/contracts/collections/sg721-updatable/src/msg.rs @@ -116,7 +116,8 @@ where } ExecuteMsg::RevokeAll { operator } => Sg721ExecuteMsg::RevokeAll { operator }, ExecuteMsg::Burn { token_id } => Sg721ExecuteMsg::Burn { token_id }, - ExecuteMsg::UpdateCollectionInfo { collection_info } => { + ExecuteMsg::UpdateCollectionInfo { collection_info } => + { #[allow(deprecated)] Sg721ExecuteMsg::UpdateCollectionInfo { collection_info } } diff --git a/contracts/minters/base-minter/src/contract.rs b/contracts/minters/base-minter/src/contract.rs index 752f7ec8a..e50862a03 100644 --- a/contracts/minters/base-minter/src/contract.rs +++ b/contracts/minters/base-minter/src/contract.rs @@ -2,7 +2,6 @@ use crate::error::ContractError; use crate::msg::{ConfigResponse, ExecuteMsg}; use crate::state::{increment_token_index, Config, COLLECTION_ADDRESS, CONFIG, STATUS}; use base_factory::msg::{BaseMinterCreateMsg, ParamsResponse}; -use base_factory::state::Extension; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ @@ -10,7 +9,10 @@ use cosmwasm_std::{ Reply, Response, StdResult, SubMsg, Timestamp, WasmMsg, }; use cw2::set_contract_version; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{ + DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, +}; use cw_utils::{must_pay, nonpayable, parse_reply_instantiate_data}; use sg1::checked_fair_burn; use sg2::query::Sg2QueryMsg; @@ -159,7 +161,10 @@ pub fn execute_mint_sender( checked_fair_burn(&info, network_fee.u128(), None, &mut res)?; // Create mint msgs - let mint_msg = Sg721ExecuteMsg::::Mint { + let mint_msg = Sg721ExecuteMsg::< + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtensionMsg, + >::Mint { token_id: increment_token_index(deps.storage)?.to_string(), owner: info.sender.to_string(), token_uri: Some(token_uri.clone()), @@ -191,7 +196,10 @@ pub fn execute_update_start_trading_time( let collection_info: CollectionInfoResponse = deps.querier.query_wasm_smart( sg721_contract_addr.clone(), - &Sg721QueryMsg::::CollectionInfo {}, + &Sg721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, )?; if info.sender != collection_info.creator { return Err(ContractError::Unauthorized( @@ -212,9 +220,10 @@ pub fn execute_update_start_trading_time( // execute sg721 contract let msg = WasmMsg::Execute { contract_addr: sg721_contract_addr.to_string(), - msg: to_json_binary( - &Sg721ExecuteMsg::::UpdateStartTradingTime(start_time), - )?, + msg: to_json_binary(&Sg721ExecuteMsg::< + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtensionMsg, + >::UpdateStartTradingTime(start_time))?, funds: vec![], }; diff --git a/contracts/minters/open-edition-minter/src/contract.rs b/contracts/minters/open-edition-minter/src/contract.rs index cb43aaac3..ad54b8786 100644 --- a/contracts/minters/open-edition-minter/src/contract.rs +++ b/contracts/minters/open-edition-minter/src/contract.rs @@ -15,6 +15,9 @@ use cosmwasm_std::{ MessageInfo, Order, Reply, ReplyOn, Response, StdError, StdResult, SubMsg, Timestamp, WasmMsg, }; use cw2::set_contract_version; +use cw721_base::{ + DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, +}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use open_edition_factory::msg::{OpenEditionMinterCreateMsg, ParamsResponse}; use open_edition_factory::types::NftMetadataType; @@ -600,9 +603,10 @@ pub fn execute_update_start_trading_time( // execute sg721 contract let msg = WasmMsg::Execute { contract_addr: sg721_contract_addr.to_string(), - msg: to_json_binary(&Sg721ExecuteMsg::::UpdateStartTradingTime( - start_time, - ))?, + msg: to_json_binary(&Sg721ExecuteMsg::< + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtensionMsg, + >::UpdateStartTradingTime(start_time))?, funds: vec![], }; diff --git a/contracts/minters/open-edition-minter/src/helpers.rs b/contracts/minters/open-edition-minter/src/helpers.rs index 39bb54ed3..302bf084d 100644 --- a/contracts/minters/open-edition-minter/src/helpers.rs +++ b/contracts/minters/open-edition-minter/src/helpers.rs @@ -84,7 +84,10 @@ pub fn mint_nft_msg( } else { CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: sg721_address.to_string(), - msg: to_json_binary(&Sg721ExecuteMsg::::Mint { + msg: to_json_binary(&Sg721ExecuteMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Mint { token_id, owner: recipient_addr.to_string(), token_uri, diff --git a/contracts/minters/vending-minter-wl-flex/src/contract.rs b/contracts/minters/vending-minter-wl-flex/src/contract.rs index aead8fbf8..b6ab4cd73 100644 --- a/contracts/minters/vending-minter-wl-flex/src/contract.rs +++ b/contracts/minters/vending-minter-wl-flex/src/contract.rs @@ -674,7 +674,10 @@ fn _execute_mint( }; // Create mint msgs - let mint_msg = Sg721ExecuteMsg::::Mint { + let mint_msg = Sg721ExecuteMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Mint { token_id: mintable_token_mapping.token_id.to_string(), owner: recipient_addr.to_string(), token_uri: Some(format!( diff --git a/packages/sg721/src/lib.rs b/packages/sg721/src/lib.rs index 8e74f8014..cf47625d8 100644 --- a/packages/sg721/src/lib.rs +++ b/packages/sg721/src/lib.rs @@ -2,7 +2,8 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{Binary, Coin, Timestamp}; use cw721_base::{ msg::{ - CollectionMetadataExtensionMsg, CollectionMetadataMsg, ExecuteMsg as Cw721ExecuteMsg, InstantiateMsg as Cw721InstantiateMsg + CollectionMetadataExtensionMsg, CollectionMetadataMsg, ExecuteMsg as Cw721ExecuteMsg, + InstantiateMsg as Cw721InstantiateMsg, }, DefaultOptionCollectionMetadataExtensionMsg, }; @@ -124,24 +125,11 @@ pub enum ExecuteMsg< } impl - From< - ExecuteMsg< - TNftMetadataExtensionMsg, - TCollectionMetadataExtensionMsg, - >, - > - for Cw721ExecuteMsg< - TNftMetadataExtensionMsg, - TCollectionMetadataExtensionMsg, - > + From> + for Cw721ExecuteMsg { #[allow(deprecated)] - fn from( - msg: ExecuteMsg< - TNftMetadataExtensionMsg, - TCollectionMetadataExtensionMsg, - >, - ) -> Self { + fn from(msg: ExecuteMsg) -> Self { match msg { // ---- sg721 msgs ---- ExecuteMsg::UpdateCollectionInfo { collection_info: _ } => { @@ -264,7 +252,9 @@ pub struct UpdateCollectionInfoMsg { } #[allow(deprecated)] -impl From> for CollectionMetadataExtensionMsg { +impl From> + for CollectionMetadataExtensionMsg +{ fn from(msg: UpdateCollectionInfoMsg) -> Self { CollectionMetadataExtensionMsg { description: msg.description, diff --git a/test-suite/src/sg721_base/tests/integration_tests.rs b/test-suite/src/sg721_base/tests/integration_tests.rs index f14202981..4d4730bd5 100644 --- a/test-suite/src/sg721_base/tests/integration_tests.rs +++ b/test-suite/src/sg721_base/tests/integration_tests.rs @@ -549,7 +549,7 @@ mod tests { &QueryMsg::< DefaultOptionNftMetadataExtension, DefaultOptionCollectionMetadataExtension, - >::GetCreatorOwnership { }, + >::GetCreatorOwnership {}, ) .unwrap(); assert_eq!(res.owner, Some(creator.clone())); @@ -596,7 +596,10 @@ mod tests { use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; use cosmwasm_std::{Decimal, Response, Uint128}; - use cw721::{state::MAX_ROYALTY_SHARE_PCT, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; + use cw721::{ + state::MAX_ROYALTY_SHARE_PCT, DefaultOptionCollectionMetadataExtension, + DefaultOptionNftMetadataExtension, + }; use sg2::msg::CollectionParams; use sg721::RoyaltyInfoResponse; use sg721_base::msg::{CollectionInfoResponse, QueryMsg}; @@ -871,7 +874,13 @@ mod tests { &[], ); // get attribute with key "pending_owner" - let attribute_minter_owner_response = res.unwrap().events[1].clone().attributes.iter().find(|x| x.key == "pending_owner").expect("pending_owner not found").clone(); + let attribute_minter_owner_response = res.unwrap().events[1] + .clone() + .attributes + .iter() + .find(|x| x.key == "pending_owner") + .expect("pending_owner not found") + .clone(); let expected_attribute = Attribute { key: "pending_owner".to_string(), value: "new_owner".to_string(), @@ -899,12 +908,21 @@ mod tests { &accept_ownership_msg, &[], ); - let attribute_minter_owner_response = res.unwrap().events[1].clone().attributes.iter().find(|x| x.key == "pending_owner").expect("pending_owner not found").clone(); + let attribute_minter_owner_response = res.unwrap().events[1] + .clone() + .attributes + .iter() + .find(|x| x.key == "pending_owner") + .expect("pending_owner not found") + .clone(); let expected_pending_owner_response = Attribute { key: "pending_owner".to_string(), value: "none".to_string(), }; - assert_eq!(attribute_minter_owner_response, expected_pending_owner_response); + assert_eq!( + attribute_minter_owner_response, + expected_pending_owner_response + ); let res: cw_ownable::Ownership = app .wrap() diff --git a/test-suite/src/vending_minter/tests/address_limit.rs b/test-suite/src/vending_minter/tests/address_limit.rs index 9d4deb795..628c90de7 100644 --- a/test-suite/src/vending_minter/tests/address_limit.rs +++ b/test-suite/src/vending_minter/tests/address_limit.rs @@ -464,7 +464,10 @@ fn mint_for_token_id_addr() { .wrap() .query_wasm_smart( collection_addr, - &Cw721QueryMsg::::OwnerOf { + &Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::OwnerOf { token_id: 2.to_string(), include_expired: None, }, diff --git a/test-suite/src/vending_minter/tests/happy_unhappy.rs b/test-suite/src/vending_minter/tests/happy_unhappy.rs index 780bfcf7d..93c373507 100644 --- a/test-suite/src/vending_minter/tests/happy_unhappy.rs +++ b/test-suite/src/vending_minter/tests/happy_unhappy.rs @@ -213,7 +213,10 @@ fn happy_path() { assert_eq!(0, minter_balance.len()); // Check that NFT is transferred - let query_owner_msg = Cw721QueryMsg::::OwnerOf { + let query_owner_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::OwnerOf { token_id: String::from("1"), include_expired: None, }; diff --git a/test-suite/src/vending_minter/tests/trading_time.rs b/test-suite/src/vending_minter/tests/trading_time.rs index 655f163bc..eda6e6707 100644 --- a/test-suite/src/vending_minter/tests/trading_time.rs +++ b/test-suite/src/vending_minter/tests/trading_time.rs @@ -284,7 +284,10 @@ fn update_start_trading_time() { .wrap() .query_wasm_smart( collection_addr.to_string(), - &Sg721QueryMsg::::CollectionInfo {}, + &Sg721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, ) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/trading_time_updatable.rs b/test-suite/src/vending_minter/tests/trading_time_updatable.rs index 5f87ef8d0..3d5d3ff12 100644 --- a/test-suite/src/vending_minter/tests/trading_time_updatable.rs +++ b/test-suite/src/vending_minter/tests/trading_time_updatable.rs @@ -291,7 +291,10 @@ fn update_start_trading_time() { .wrap() .query_wasm_smart( collection_addr.to_string(), - &Sg721QueryMsg::::CollectionInfo {}, + &Sg721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::CollectionInfo {}, ) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/updatable.rs b/test-suite/src/vending_minter/tests/updatable.rs index 6da98b30a..0e61f2cec 100644 --- a/test-suite/src/vending_minter/tests/updatable.rs +++ b/test-suite/src/vending_minter/tests/updatable.rs @@ -33,7 +33,10 @@ fn update_token_metadata() { assert!(res.is_ok()); // query buyer token_id - let query_tokens_msg = Cw721QueryMsg::::Tokens { + let query_tokens_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Tokens { owner: buyer.to_string(), start_after: None, limit: None, @@ -59,7 +62,12 @@ fn update_token_metadata() { .query_wasm_smart(collection_addr.clone(), &query_tokens_msg) .unwrap(); assert_eq!(res.tokens[0], token_id); - let query_token_msg = Cw721QueryMsg::::NftInfo { token_id }; + let query_token_msg = Cw721QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::NftInfo { + token_id, + }; let res: NftInfoResponse = router .wrap() .query_wasm_smart(collection_addr, &query_token_msg) diff --git a/test-suite/src/vending_minter/tests/zero_mint_price.rs b/test-suite/src/vending_minter/tests/zero_mint_price.rs index db2dc954b..eafa10caf 100644 --- a/test-suite/src/vending_minter/tests/zero_mint_price.rs +++ b/test-suite/src/vending_minter/tests/zero_mint_price.rs @@ -103,7 +103,10 @@ fn zero_mint_price() { .wrap() .query_wasm_smart( sg721, - &sg721_base::msg::QueryMsg::::Tokens { + &sg721_base::msg::QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::Tokens { owner: buyer.to_string(), start_after: None, limit: None, From c2ffe15894c3aa09cc987b01fbb601183fd3eea0 Mon Sep 17 00:00:00 2001 From: mr-t Date: Tue, 19 Mar 2024 15:26:35 +0100 Subject: [PATCH 07/20] migrating is always possible, no version check needed --- .../collections/sg721-base/src/contract.rs | 21 ++++++------- .../sg721-base/src/upgrades/mod.rs | 4 +-- .../upgrades/{v3_0_0.rs => v3_0_0_ownable.rs} | 31 +++++++++++-------- ...{v3_1_0.rs => v3_1_0_royalty_timestamp.rs} | 26 +++++----------- .../sg721-updatable/src/contract.rs | 20 ++++++------ .../collections/sg721-updatable/src/lib.rs | 7 ++++- 6 files changed, 53 insertions(+), 56 deletions(-) rename contracts/collections/sg721-base/src/upgrades/{v3_0_0.rs => v3_0_0_ownable.rs} (52%) rename contracts/collections/sg721-base/src/upgrades/{v3_1_0.rs => v3_1_0_royalty_timestamp.rs} (65%) diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 47daff3c2..d471a851c 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -1,4 +1,4 @@ -use cw721::msg::CollectionMetadataMsg; +use cw721::msg::{CollectionMetadataMsg, Cw721MigrateMsg}; use cw721::state::{MAX_COLLECTION_DESCRIPTION_LENGTH, MINTER}; use cw721::traits::{Cw721CustomMsg, Cw721State}; use cw721_base::msg::{CollectionMetadataExtensionMsg, RoyaltyInfoResponse}; @@ -274,7 +274,11 @@ where Ok(collection_info) } - pub fn migrate(mut deps: DepsMut, env: Env, _msg: Empty) -> Result { + pub fn migrate( + mut deps: DepsMut, + env: Env, + msg: Cw721MigrateMsg, + ) -> Result { let prev_contract_version = cw2::get_contract_version(deps.storage)?; let valid_contract_names = vec![CONTRACT_NAME.to_string()]; @@ -289,15 +293,10 @@ where let mut response = Response::new(); - #[allow(clippy::cmp_owned)] - if prev_contract_version.version < "3.0.0".to_string() { - response = crate::upgrades::v3_0_0::upgrade(deps.branch(), &env, response)?; - } - - #[allow(clippy::cmp_owned)] - if prev_contract_version.version < "3.1.0".to_string() { - response = crate::upgrades::v3_1_0::upgrade(deps.branch(), &env, response)?; - } + // these upgrades can always be called. migration is only executed in case new stores are empty! It is safe calling these on any version. + response = crate::upgrades::v3_0_0_ownable::upgrade(deps.branch(), &env, response, msg)?; + response = + crate::upgrades::v3_1_0_royalty_timestamp::upgrade(deps.branch(), &env, response)?; cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; diff --git a/contracts/collections/sg721-base/src/upgrades/mod.rs b/contracts/collections/sg721-base/src/upgrades/mod.rs index 63b702401..4fdfdd640 100644 --- a/contracts/collections/sg721-base/src/upgrades/mod.rs +++ b/contracts/collections/sg721-base/src/upgrades/mod.rs @@ -1,2 +1,2 @@ -pub mod v3_0_0; -pub mod v3_1_0; +pub mod v3_0_0_ownable; +pub mod v3_1_0_royalty_timestamp; diff --git a/contracts/collections/sg721-base/src/upgrades/v3_0_0.rs b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs similarity index 52% rename from contracts/collections/sg721-base/src/upgrades/v3_0_0.rs rename to contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs index c43e06815..358076eda 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_0_0.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs @@ -11,7 +11,22 @@ use cw721::{ }; use cw721_base::execute::Cw721Execute; -pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result { +/// Migrates cw721 states: +/// (1) legacy creator and minter migration, now using cw-ownable +/// - v0.15 and v0.16: dedicated minter store +/// - v0.17 and v0.18: minter stored using cw-ownable +/// (2) legacy contract info migration -> collection metadata +/// - before v0.19 there was only contract info +/// - now we have collection metadata with optional extension +/// (3) optional creator and minter reset (as passed in Cw721MigrateMsg::WithUpdate) +/// +/// Note: migration is only executed in case new stores are empty! It is safe calling these on any version. +pub fn upgrade( + deps: DepsMut, + env: &Env, + response: Response, + msg: Cw721MigrateMsg, +) -> Result { let contract = Sg721Contract::< DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, @@ -19,20 +34,10 @@ pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result::default(); - let migrate_msg = Cw721MigrateMsg::WithUpdate { - minter: None, - creator: None, - }; - // cw721 migration allows all versions: 0.18. 0.17, 0.16 and older + // cw721 migration covers these versions: 0.18. 0.17, 0.16 and 0.15 let cw721_res = contract .parent - .migrate( - deps, - env.clone(), - migrate_msg, - CONTRACT_NAME, - CONTRACT_VERSION, - ) + .migrate(deps, env.clone(), msg, CONTRACT_NAME, CONTRACT_VERSION) .map_err(|e| ContractError::MigrationError(e.to_string()))?; let mut event = Event::new("migrate-3.0.0"); diff --git a/contracts/collections/sg721-base/src/upgrades/v3_1_0.rs b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs similarity index 65% rename from contracts/collections/sg721-base/src/upgrades/v3_1_0.rs rename to contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs index 77c65cbb9..faccb7eed 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_1_0.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs @@ -19,31 +19,19 @@ pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result::default(); + // check whether royalty timestamp already exists + let royalty_updated_at = contract.royalty_updated_at.may_load(deps.storage)?; + if let Some(_) = royalty_updated_at { + // already migrated + return Ok(response); + } let royalty_updated_at = env.block.time.minus_seconds(60 * 60 * 24); // 24 hours ago contract .royalty_updated_at .save(deps.storage, &royalty_updated_at)?; - let migrate_msg = Cw721MigrateMsg::WithUpdate { - minter: None, - creator: None, - }; - // cw721 migration allows all versions: 0.18. 0.17, 0.16 and older - let cw721_res = contract - .parent - .migrate( - deps, - env.clone(), - migrate_msg, - CONTRACT_NAME, - CONTRACT_VERSION, - ) - .map_err(|e| ContractError::MigrationError(e.to_string()))?; - - let mut event = Event::new("migrate-3.1.0") + let event = Event::new("migrate-3.1.0") .add_attribute("royalty-updated", royalty_updated_at.to_string()); - event = event.add_attributes(cw721_res.attributes); - Ok(response.add_event(event)) } diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index 8504fb48f..ba840d86c 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -7,6 +7,7 @@ use cosmwasm_std::{Deps, StdResult}; #[cfg(not(feature = "library"))] use cosmwasm_std::{DepsMut, Env, Event, MessageInfo}; use cw2::set_contract_version; +use cw721::msg::Cw721MigrateMsg; use cw721::{ DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, @@ -173,7 +174,11 @@ pub fn query_frozen_token_metadata(deps: Deps) -> StdResult Result { +pub fn _migrate( + mut deps: DepsMut, + env: Env, + msg: Cw721MigrateMsg, +) -> Result { let prev_contract_info = cw2::get_contract_version(deps.storage)?; let prev_contract_name: String = prev_contract_info.contract; let prev_contract_version: Version = prev_contract_info @@ -216,15 +221,10 @@ pub fn _migrate(mut deps: DepsMut, env: Env, _msg: Empty) -> Result Result { + pub fn migrate( + deps: DepsMut, + env: Env, + msg: Cw721MigrateMsg, + ) -> Result { _migrate(deps, env, msg) } } From 3d71f983db358ded82cc0a8e8b66f8f77fb8dae9 Mon Sep 17 00:00:00 2001 From: mr-t Date: Tue, 19 Mar 2024 15:46:16 +0100 Subject: [PATCH 08/20] remove redundant contract name and version migration --- contracts/collections/sg721-base/src/contract.rs | 2 -- contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index d471a851c..6e7e8fcb3 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -298,8 +298,6 @@ where response = crate::upgrades::v3_1_0_royalty_timestamp::upgrade(deps.branch(), &env, response)?; - cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - response = response.add_event( Event::new("migrate") .add_attribute("from_name", prev_contract_version.contract) diff --git a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs index 358076eda..bb5c968de 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs @@ -19,6 +19,7 @@ use cw721_base::execute::Cw721Execute; /// - before v0.19 there was only contract info /// - now we have collection metadata with optional extension /// (3) optional creator and minter reset (as passed in Cw721MigrateMsg::WithUpdate) +/// (4) contract name and version /// /// Note: migration is only executed in case new stores are empty! It is safe calling these on any version. pub fn upgrade( From abd5cf1eeea7dcd4698a19c7bd9e4d784d8899bd Mon Sep 17 00:00:00 2001 From: mr-t Date: Tue, 19 Mar 2024 15:48:33 +0100 Subject: [PATCH 09/20] rename --- contracts/collections/sg721-base/src/contract.rs | 7 ++++++- contracts/collections/sg721-base/src/upgrades/mod.rs | 2 +- ...wnable.rs => v3_0_0_ownable_and_collection_metadata.rs} | 0 contracts/collections/sg721-updatable/src/contract.rs | 7 ++++++- 4 files changed, 13 insertions(+), 3 deletions(-) rename contracts/collections/sg721-base/src/upgrades/{v3_0_0_ownable.rs => v3_0_0_ownable_and_collection_metadata.rs} (100%) diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 6e7e8fcb3..b5947821b 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -294,7 +294,12 @@ where let mut response = Response::new(); // these upgrades can always be called. migration is only executed in case new stores are empty! It is safe calling these on any version. - response = crate::upgrades::v3_0_0_ownable::upgrade(deps.branch(), &env, response, msg)?; + response = crate::upgrades::v3_0_0_ownable_and_collection_metadata::upgrade( + deps.branch(), + &env, + response, + msg, + )?; response = crate::upgrades::v3_1_0_royalty_timestamp::upgrade(deps.branch(), &env, response)?; diff --git a/contracts/collections/sg721-base/src/upgrades/mod.rs b/contracts/collections/sg721-base/src/upgrades/mod.rs index 4fdfdd640..f94441bb9 100644 --- a/contracts/collections/sg721-base/src/upgrades/mod.rs +++ b/contracts/collections/sg721-base/src/upgrades/mod.rs @@ -1,2 +1,2 @@ -pub mod v3_0_0_ownable; +pub mod v3_0_0_ownable_and_collection_metadata; pub mod v3_1_0_royalty_timestamp; diff --git a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs similarity index 100% rename from contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable.rs rename to contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index ba840d86c..fc283b984 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -222,7 +222,12 @@ pub fn _migrate( let mut response = Response::new(); // these upgrades can always be called. migration is only executed in case new stores are empty! It is safe calling these on any version. - response = sg721_base::upgrades::v3_0_0_ownable::upgrade(deps.branch(), &env, response, msg)?; + response = sg721_base::upgrades::v3_0_0_ownable_and_collection_metadata::upgrade( + deps.branch(), + &env, + response, + msg, + )?; response = sg721_base::upgrades::v3_1_0_royalty_timestamp::upgrade(deps.branch(), &env, response)?; From ee316f2987942093fd825df95ab86221981a1ffe Mon Sep 17 00:00:00 2001 From: mr-t Date: Tue, 19 Mar 2024 15:55:42 +0100 Subject: [PATCH 10/20] cleanup --- .../v3_0_0_ownable_and_collection_metadata.rs | 1 + .../src/upgrades/v3_1_0_royalty_timestamp.rs | 11 +++-------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs index bb5c968de..eb4315775 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs @@ -18,6 +18,7 @@ use cw721_base::execute::Cw721Execute; /// (2) legacy contract info migration -> collection metadata /// - before v0.19 there was only contract info /// - now we have collection metadata with optional extension +/// - here it is migrated to the new format with empty extension /// (3) optional creator and minter reset (as passed in Cw721MigrateMsg::WithUpdate) /// (4) contract name and version /// diff --git a/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs index faccb7eed..878740ea7 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs @@ -1,14 +1,9 @@ -use crate::{ - entry::{CONTRACT_NAME, CONTRACT_VERSION}, - ContractError, Sg721Contract, -}; -use cw721_base::execute::Cw721Execute; +use crate::{ContractError, Sg721Contract}; use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; use cw721::{ - msg::Cw721MigrateMsg, DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, }; pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result { From d073690b5b09316a9fa1301233baf01b7cbdaa3a Mon Sep 17 00:00:00 2001 From: mr-t Date: Wed, 20 Mar 2024 22:18:06 +0100 Subject: [PATCH 11/20] migrate collection info (sg721) to collection metadata (cw721) --- Cargo.lock | 455 ++++++++++++++---- Cargo.toml | 7 + .../collections/sg721-base/src/contract.rs | 10 +- contracts/collections/sg721-base/src/lib.rs | 17 + .../sg721-base/src/upgrades/mod.rs | 1 + .../src/upgrades/v3_1_0_royalty_timestamp.rs | 2 +- .../upgrades/v3_8_0_collection_metadata.rs | 57 +++ .../collections/sg721-updatable/src/lib.rs | 2 +- packages/sg2/Cargo.toml | 22 +- packages/sg2/src/tests.rs | 22 + test-suite/Cargo.toml | 72 +-- test-suite/src/common_setup/contract_boxes.rs | 36 +- .../vending_minter/mock_params.rs | 53 ++ .../src/sg721_base/tests/integration_tests.rs | 145 +++++- 14 files changed, 743 insertions(+), 158 deletions(-) create mode 100644 contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs diff --git a/Cargo.lock b/Cargo.lock index 570128309..001c5be29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,9 +41,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -158,7 +158,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.5.0", - "rustix 0.38.31", + "rustix 0.38.32", "slab", "tracing", "windows-sys 0.52.0", @@ -355,8 +355,26 @@ dependencies = [ "schemars", "serde", "sg-std", - "sg1", - "sg2", + "sg1 3.5.0", + "sg2 3.5.0", + "thiserror", +] + +[[package]] +name = "base-factory" +version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "schemars", + "serde", + "sg-std", + "sg1 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg2 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "thiserror", ] @@ -364,22 +382,22 @@ dependencies = [ name = "base-minter" version = "3.5.0" dependencies = [ - "base-factory", + "base-factory 3.5.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", "schemars", "serde", "sg-std", - "sg1", - "sg2", - "sg4", - "sg721", - "sg721-base", + "sg1 3.5.0", + "sg2 3.5.0", + "sg4 3.5.0", + "sg721 3.5.0", + "sg721-base 3.5.0", "thiserror", "url", ] @@ -483,9 +501,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -1039,6 +1057,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "cw-address-like" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451a4691083a88a3c0630a8a88799e9d4cd6679b7ce8ff22b8da2873ff31d380" +dependencies = [ + "cosmwasm-std", +] + [[package]] name = "cw-address-like" version = "1.0.4" @@ -1116,6 +1143,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-ownable" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093dfb4520c48b5848274dd88ea99e280a04bc08729603341c7fb0d758c74321" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-address-like 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-ownable-derive 0.5.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "thiserror", +] + [[package]] name = "cw-ownable" version = "0.6.0" @@ -1123,13 +1165,24 @@ source = "git+https://github.com/public-awesome/cw-plus-plus.git?branch=main#28c dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-address-like", - "cw-ownable-derive", + "cw-address-like 1.0.4 (git+https://github.com/public-awesome/cw-plus-plus.git?branch=main)", + "cw-ownable-derive 0.6.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "thiserror", ] +[[package]] +name = "cw-ownable-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d3bf2e0f341bb6cc100d7d441d31cf713fbd3ce0c511f91e79f14b40a889af" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "cw-ownable-derive" version = "0.6.0" @@ -1251,6 +1304,19 @@ dependencies = [ "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" version = "0.16.0" @@ -1279,28 +1345,64 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#f461266c9aa844e80e5ddaf5ddf7ff742f430d5d" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#3661bb74e649ec588095d9de9b61536870a0637b" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-ownable", + "cw-ownable 0.6.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721 0.16.0", + "cw721 0.16.0 (git+https://github.com/CosmWasm/cw-nfts?tag=v0.16.0)", "schemars", "serde", "thiserror", "url", ] +[[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 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721-base" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da518d9f68bfda7d972cbaca2e8fcf04651d0edc3de72b04ae2bcd9289c81614" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-ownable 0.5.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.16.0", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#f461266c9aa844e80e5ddaf5ddf7ff742f430d5d" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#3661bb74e649ec588095d9de9b61536870a0637b" dependencies = [ "cosmwasm-std", - "cw-ownable", + "cw-ownable 0.6.0", "cw2 1.1.2", "cw721 0.19.0", "serde", @@ -1415,12 +1517,12 @@ dependencies = [ "serde", "serde_json", "sg-metadata", - "sg2", - "sg721", - "sg721-base", + "sg2 3.5.0", + "sg721 3.5.0", + "sg721-base 3.5.0", "test-context", - "vending-factory", - "vending-minter", + "vending-factory 3.5.0", + "vending-minter 3.5.0", ] [[package]] @@ -2602,7 +2704,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" name = "open-edition-factory" version = "3.5.0" dependencies = [ - "base-factory", + "base-factory 3.5.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 1.2.0", @@ -2610,9 +2712,9 @@ dependencies = [ "cw2 1.1.2", "sg-metadata", "sg-std", - "sg1", - "sg2", - "sg721", + "sg1 3.5.0", + "sg2 3.5.0", + "sg721 3.5.0", "thiserror", ] @@ -2625,16 +2727,16 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721-base", + "cw721-base 0.19.0", "open-edition-factory", "semver", "serde", "sg-metadata", "sg-std", - "sg1", - "sg2", - "sg4", - "sg721", + "sg1 3.5.0", + "sg2 3.5.0", + "sg4 3.5.0", + "sg721 3.5.0", "thiserror", "url", ] @@ -2913,7 +3015,7 @@ dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite", - "rustix 0.38.31", + "rustix 0.38.32", "tracing", "windows-sys 0.52.0", ] @@ -3269,7 +3371,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.7.0", + "uuid 1.8.0", ] [[package]] @@ -3378,11 +3480,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys 0.4.13", @@ -3694,15 +3796,15 @@ dependencies = [ "serde", "sg-multi-test", "sg-std", - "sg-whitelist", - "sg1", - "sg2", - "sg721-base", + "sg-whitelist 3.5.0", + "sg1 3.5.0", + "sg2 3.5.0", + "sg721-base 3.5.0", "sha2 0.10.8", "sha3", "thiserror", - "vending-factory", - "vending-minter", + "vending-factory 3.5.0", + "vending-minter 3.5.0", "whitelist-immutable", ] @@ -3800,7 +3902,25 @@ dependencies = [ "schemars", "serde", "sg-std", - "sg1", + "sg1 3.5.0", + "thiserror", +] + +[[package]] +name = "sg-whitelist" +version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "rust_decimal", + "schemars", + "serde", + "sg-std", + "sg1 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "thiserror", ] @@ -3817,13 +3937,26 @@ dependencies = [ "schemars", "serde", "sg-std", - "sg1", + "sg1 3.5.0", + "thiserror", +] + +[[package]] +name = "sg1" +version = "3.5.0" +dependencies = [ + "anybuf", + "cosmwasm-std", + "cw-utils 1.0.3", + "serde", + "sg-std", "thiserror", ] [[package]] name = "sg1" version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" dependencies = [ "anybuf", "cosmwasm-std", @@ -3843,7 +3976,24 @@ dependencies = [ "cw-utils 1.0.3", "schemars", "serde", - "sg721", + "sg2 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg721 3.5.0", + "sg721 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "thiserror", +] + +[[package]] +name = "sg2" +version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "sg721 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "thiserror", ] @@ -3858,6 +4008,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sg4" +version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "sg721" version = "3.5.0" @@ -3865,9 +4027,23 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test 0.20.1", - "cw-ownable", + "cw-ownable 0.6.0", + "cw-utils 1.0.3", + "cw721-base 0.19.0", + "serde", + "thiserror", +] + +[[package]] +name = "sg721" +version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-ownable 0.5.1", "cw-utils 1.0.3", - "cw721-base", + "cw721-base 0.18.0", "serde", "thiserror", ] @@ -3878,15 +4054,35 @@ version = "3.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-ownable", + "cw-ownable 0.6.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", + "serde", + "sg-std", + "sg721 3.5.0", + "thiserror", + "url", +] + +[[package]] +name = "sg721-base" +version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-ownable 0.5.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", "serde", "sg-std", - "sg721", + "sg721 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "thiserror", "url", ] @@ -3900,12 +4096,12 @@ dependencies = [ "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", "schemars", "serde", "sg-std", - "sg721", - "sg721-base", + "sg721 3.5.0", + "sg721-base 3.5.0", ] [[package]] @@ -3919,14 +4115,14 @@ dependencies = [ "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", "schemars", "semver", "serde", "sg-std", - "sg1", - "sg721", - "sg721-base", + "sg1 3.5.0", + "sg721 3.5.0", + "sg721-base 3.5.0", "thiserror", ] @@ -4300,19 +4496,19 @@ dependencies = [ "anybuf", "anyhow", "async-std", - "base-factory", + "base-factory 3.5.0", "base-minter", "cosmwasm-schema", "cosmwasm-std", "cw-multi-test 0.20.1", - "cw-ownable", + "cw-ownable 0.6.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw4", "cw4-group", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", "ethers-core", "ethers-signers", "eyre", @@ -4330,20 +4526,25 @@ dependencies = [ "sg-multi-test", "sg-splits", "sg-std", - "sg-whitelist", - "sg1", - "sg2", - "sg4", - "sg721", - "sg721-base", + "sg-whitelist 3.5.0", + "sg1 3.5.0", + "sg2 3.5.0", + "sg2 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg4 3.5.0", + "sg721 3.5.0", + "sg721 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg721-base 3.5.0", + "sg721-base 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "sg721-nt", "sg721-updatable", "sha2 0.10.8", "shuffle", "thiserror", "url", - "vending-factory", - "vending-minter", + "vending-factory 3.5.0", + "vending-factory 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "vending-minter 3.5.0", + "vending-minter 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "vending-minter-merkle-wl", "whitelist-immutable", "whitelist-mtree", @@ -4731,21 +4932,41 @@ dependencies = [ [[package]] name = "uuid" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" [[package]] name = "value-bag" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec26a25bd6fca441cdd0f769fd7f891bae119f996de31f86a5eddccef54c1d" +checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8" + +[[package]] +name = "vending-factory" +version = "3.5.0" +dependencies = [ + "base-factory 3.5.0", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "schemars", + "serde", + "sg-std", + "sg1 3.5.0", + "sg2 3.5.0", + "sg721 3.5.0", + "thiserror", +] [[package]] name = "vending-factory" version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" dependencies = [ - "base-factory", + "base-factory 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 1.2.0", @@ -4754,9 +4975,9 @@ dependencies = [ "schemars", "serde", "sg-std", - "sg1", - "sg2", - "sg721", + "sg1 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg2 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg721 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "thiserror", ] @@ -4770,23 +4991,53 @@ dependencies = [ "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", + "rand_core 0.6.4", + "rand_xoshiro", + "schemars", + "semver", + "serde", + "sg-std", + "sg-whitelist 3.5.0", + "sg1 3.5.0", + "sg2 3.5.0", + "sg4 3.5.0", + "sg721 3.5.0", + "sha2 0.10.8", + "shuffle", + "thiserror", + "url", + "vending-factory 3.5.0", +] + +[[package]] +name = "vending-minter" +version = "3.5.0" +source = "git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db#b584245bcc7ff07d9b384df1ccc4e3e2466d92db" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", "rand_core 0.6.4", "rand_xoshiro", "schemars", "semver", "serde", "sg-std", - "sg-whitelist", - "sg1", - "sg2", - "sg4", - "sg721", + "sg-whitelist 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg1 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg2 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg4 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", + "sg721 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", "sha2 0.10.8", "shuffle", "thiserror", "url", - "vending-factory", + "vending-factory 3.5.0 (git+https://github.com/public-awesome/launchpad?rev=b584245bcc7ff07d9b384df1ccc4e3e2466d92db)", ] [[package]] @@ -4799,23 +5050,23 @@ dependencies = [ "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", "rand_core 0.6.4", "rand_xoshiro", "schemars", "semver", "serde", "sg-std", - "sg-whitelist", - "sg1", - "sg2", - "sg4", - "sg721", + "sg-whitelist 3.5.0", + "sg1 3.5.0", + "sg2 3.5.0", + "sg4 3.5.0", + "sg721 3.5.0", "sha2 0.10.8", "shuffle", "thiserror", "url", - "vending-factory", + "vending-factory 3.5.0", "whitelist-mtree", ] @@ -4829,7 +5080,7 @@ dependencies = [ "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.19.0", - "cw721-base", + "cw721-base 0.19.0", "rand_core 0.6.4", "rand_xoshiro", "schemars", @@ -4837,15 +5088,15 @@ dependencies = [ "serde", "sg-std", "sg-whitelist-flex", - "sg1", - "sg2", - "sg4", - "sg721", + "sg1 3.5.0", + "sg2 3.5.0", + "sg4 3.5.0", + "sg721 3.5.0", "sha2 0.10.8", "shuffle", "thiserror", "url", - "vending-factory", + "vending-factory 3.5.0", ] [[package]] @@ -4993,7 +5244,7 @@ dependencies = [ "schemars", "serde", "sg-std", - "sg-whitelist", + "sg-whitelist 3.5.0", "thiserror", ] @@ -5013,7 +5264,7 @@ dependencies = [ "serde", "serde_json", "sg-std", - "sg1", + "sg1 3.5.0", "thiserror", "url", ] diff --git a/Cargo.toml b/Cargo.toml index e090ee284..3d52edd07 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,9 +37,14 @@ serde = { version = "1.0", default-features = false, features = ["deri serde_json = "1.0" sg1 = { version = "3.5.0", path = "packages/sg1" } sg2 = { version = "3.5.0", path = "packages/sg2" } +# NOTE: `v3.8.0-prerelease` contains commit for switch to new cw721 with collection metadata +# This is needed for testing legacy migration from collection info -> collection metadata +sg2-v3-8-0-prerelease = { git = "https://github.com/public-awesome/launchpad", rev = "b584245bcc7ff07d9b384df1ccc4e3e2466d92db", package = "sg2" } # needed for testing legacy migration sg4 = { version = "3.5.0", path = "packages/sg4" } sg721 = { version = "3.5.0", path = "packages/sg721" } +sg721-v3-8-0-prerelease = { git = "https://github.com/public-awesome/launchpad", rev = "b584245bcc7ff07d9b384df1ccc4e3e2466d92db", package = "sg721" } # needed for testing legacy migration sg721-base = { version = "3.5.0", path = "contracts/collections/sg721-base" } +sg721-base-v3-8-0-prerelease = { git = "https://github.com/public-awesome/launchpad", rev = "b584245bcc7ff07d9b384df1ccc4e3e2466d92db", package = "sg721-base" } # needed for testing legacy migration sg721-nt = { version = "3.5.0", path = "contracts/collections/sg721-nt" } sg721-updatable = { version = "3.5.0", path = "contracts/collections/sg721-updatable" } sg-controllers = { version = "3.5.0", path = "packages/controllers" } @@ -56,7 +61,9 @@ sha2 = { version = "0.10.2", default-features = false } whitelist-mtree = { version = "3.5.0", path = "contracts/whitelists/whitelist-merkletree" } vending-minter-merkle-wl = { version = "3.5.0", path = "contracts/minters/vending-minter-merkle-wl" } vending-factory = { version = "3.5.0", path = "contracts/factories/vending-factory" } +vending-factory-v3-8-0-prerelease = { git = "https://github.com/public-awesome/launchpad", rev = "b584245bcc7ff07d9b384df1ccc4e3e2466d92db", package = "vending-factory" } # needed for testing legacy migration vending-minter = { version = "3.5.0", path = "contracts/minters/vending-minter" } +vending-minter-v3-8-0-prerelease = { git = "https://github.com/public-awesome/launchpad", rev = "b584245bcc7ff07d9b384df1ccc4e3e2466d92db", package = "vending-minter" } # needed for testing legacy migration open-edition-factory = { version = "3.5.0", path = "contracts/factories/open-edition-factory" } open-edition-minter = { version = "3.5.0", path = "contracts/minters/open-edition-minter" } whitelist-immutable = { version = "3.5.0", path = "contracts/whitelists/whitelist-immutable" } diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index b5947821b..c2377f91a 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -8,7 +8,7 @@ use cw721_base::{ }; use cosmwasm_std::{ - to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Deps, DepsMut, Empty, Env, + to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Deps, DepsMut, Env, Event, MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, }; @@ -286,11 +286,6 @@ where return Err(StdError::generic_err("Invalid contract name for migration").into()); } - #[allow(clippy::cmp_owned)] - if prev_contract_version.version >= CONTRACT_VERSION.to_string() { - return Err(StdError::generic_err("Must upgrade contract version").into()); - } - let mut response = Response::new(); // these upgrades can always be called. migration is only executed in case new stores are empty! It is safe calling these on any version. @@ -302,6 +297,9 @@ where )?; response = crate::upgrades::v3_1_0_royalty_timestamp::upgrade(deps.branch(), &env, response)?; + // after migration of collection metadata in cw721, we can migrate collection info to new collection metadata extension + response = + crate::upgrades::v3_8_0_collection_metadata::upgrade(deps.branch(), &env, response)?; response = response.add_event( Event::new("migrate") diff --git a/contracts/collections/sg721-base/src/lib.rs b/contracts/collections/sg721-base/src/lib.rs index 492d72db4..74c1a872b 100644 --- a/contracts/collections/sg721-base/src/lib.rs +++ b/contracts/collections/sg721-base/src/lib.rs @@ -26,6 +26,7 @@ pub mod entry { use cosmwasm_std::entry_point; use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response}; use cw2::set_contract_version; + use cw721::msg::Cw721MigrateMsg; use sg721::InstantiateMsg; // version info for migration info @@ -87,4 +88,20 @@ pub mod entry { >::default() .query(deps, env, msg) } + + /// allows migration of all sg721-base versions + #[cfg_attr(not(feature = "library"), entry_point)] + pub fn migrate( + deps: DepsMut, + env: Env, + msg: Cw721MigrateMsg, + ) -> Result { + Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::migrate(deps, env, msg) + } } diff --git a/contracts/collections/sg721-base/src/upgrades/mod.rs b/contracts/collections/sg721-base/src/upgrades/mod.rs index f94441bb9..0de018a10 100644 --- a/contracts/collections/sg721-base/src/upgrades/mod.rs +++ b/contracts/collections/sg721-base/src/upgrades/mod.rs @@ -1,2 +1,3 @@ pub mod v3_0_0_ownable_and_collection_metadata; pub mod v3_1_0_royalty_timestamp; +pub mod v3_8_0_collection_metadata; diff --git a/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs index 878740ea7..01c5b5e57 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs @@ -16,7 +16,7 @@ pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result::default(); // check whether royalty timestamp already exists let royalty_updated_at = contract.royalty_updated_at.may_load(deps.storage)?; - if let Some(_) = royalty_updated_at { + if royalty_updated_at.is_some() { // already migrated return Ok(response); } diff --git a/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs b/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs new file mode 100644 index 000000000..834e6cd5b --- /dev/null +++ b/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs @@ -0,0 +1,57 @@ +use crate::{ContractError, Sg721Contract}; + +use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; +use cw721::traits::StateFactory; +use cw721::{ + msg::CollectionMetadataExtensionMsg, query::Cw721Query, + DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, RoyaltyInfo, +}; +use cw_storage_plus::Item; +#[allow(deprecated)] +use sg721::{CollectionInfo, RoyaltyInfoResponse}; + +/// Migrates collection info (sg721) into new collection metadata extension (cw721) +#[allow(deprecated)] +pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result { + let contract = Sg721Contract::< + DefaultOptionNftMetadataExtension, + DefaultOptionNftMetadataExtensionMsg, + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >::default(); + let event = Event::new("migrate-3.1.0"); + // migrate only in case collection metadata is not set + let mut collection_metadata = contract + .parent + .query_collection_metadata(deps.as_ref(), env)?; + let event = match collection_metadata.extension.clone() { + Some(_) => event, + None => { + let legacy_collection_info_store: Item> = + Item::new("collection_info"); + let legacy_collection_info = legacy_collection_info_store.load(deps.storage)?; + let collection_metadata_msg = CollectionMetadataExtensionMsg:: { + description: Some(legacy_collection_info.description), + explicit_content: legacy_collection_info.explicit_content, + external_link: legacy_collection_info.external_link, + image: Some(legacy_collection_info.image), + start_trading_time: legacy_collection_info.start_trading_time, + royalty_info: legacy_collection_info.royalty_info.map(|r| r.into()), + }; + let updated_collection_metadata_extension_result = + collection_metadata_msg.create(Some(deps.as_ref()), Some(env), None, None); + let updated_collection_metadata_extension = + updated_collection_metadata_extension_result?; + collection_metadata.extension = Some(updated_collection_metadata_extension); + contract + .parent + .config + .collection_metadata + .save(deps.storage, &collection_metadata)?; + event + } + }; + Ok(response.add_event(event)) +} diff --git a/contracts/collections/sg721-updatable/src/lib.rs b/contracts/collections/sg721-updatable/src/lib.rs index ebd04ecc6..f621954a2 100644 --- a/contracts/collections/sg721-updatable/src/lib.rs +++ b/contracts/collections/sg721-updatable/src/lib.rs @@ -18,7 +18,7 @@ pub mod entry { }, msg::ExecuteMsg, }; - use cosmwasm_std::{entry_point, to_json_binary, Empty}; + use cosmwasm_std::{entry_point, to_json_binary}; use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response}; use cw721::msg::Cw721MigrateMsg; use cw721::{ diff --git a/packages/sg2/Cargo.toml b/packages/sg2/Cargo.toml index 84c86785d..86db58bc5 100644 --- a/packages/sg2/Cargo.toml +++ b/packages/sg2/Cargo.toml @@ -1,15 +1,12 @@ [package] -name = "sg2" -authors = [ - "Shane Vitarana ", - "John Y ", -] +name = "sg2" +authors = ["Shane Vitarana ", "John Y "] description = "Definition and types for the SG2 interface" -version = { workspace = true } -edition = { workspace = true } -homepage = { workspace = true } -repository = { workspace = true } -license = { workspace = true } +version = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } [dependencies] cosmwasm-schema = { workspace = true } @@ -19,4 +16,7 @@ cw-utils = { workspace = true } schemars = { workspace = true } serde = { workspace = true } sg721 = { workspace = true } -thiserror = { workspace = true } +# `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +sg2-v3-8-0-prerelease = { workspace = true } +sg721-v3-8-0-prerelease = { workspace = true } +thiserror = { workspace = true } diff --git a/packages/sg2/src/tests.rs b/packages/sg2/src/tests.rs index 97abcd046..b730eb07b 100644 --- a/packages/sg2/src/tests.rs +++ b/packages/sg2/src/tests.rs @@ -25,6 +25,28 @@ pub fn mock_collection_params() -> CollectionParams { } } +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +#[allow(deprecated)] +pub fn mock_collection_params_v3_8_0_prerelease() -> sg2_v3_8_0_prerelease::msg::CollectionParams { + sg2_v3_8_0_prerelease::msg::CollectionParams { + code_id: 1, + name: "Collection Name".to_string(), + symbol: "COL".to_string(), + info: sg721_v3_8_0_prerelease::CollectionInfo { + creator: "creator".to_string(), + description: String::from("Stargaze Monkeys"), + image: "https://example.com/image.png".to_string(), + external_link: Some("https://example.com/external.html".to_string()), + start_trading_time: None, + explicit_content: Some(false), + royalty_info: Some(sg721_v3_8_0_prerelease::RoyaltyInfoResponse { + payment_address: "creator".to_string(), + share: Decimal::percent(10), + }), + }, + } +} + pub fn mock_collection_params_1(start_trading_time: Option) -> CollectionParams { CollectionParams { code_id: 1, diff --git a/test-suite/Cargo.toml b/test-suite/Cargo.toml index 0de8ba3e5..4f045fed3 100644 --- a/test-suite/Cargo.toml +++ b/test-suite/Cargo.toml @@ -33,40 +33,46 @@ optimize = """docker run --rm -v "$(pwd)":/code \ """ [dependencies] -cosmwasm-schema = { workspace = true } -sg-std = { workspace = true } -cosmwasm-std = { workspace = true } -cw4 = { workspace = true } -cw-multi-test = { workspace = true } -sg-multi-test = { workspace = true } -sg721-base = { workspace = true } -sg721-updatable = { workspace = true } -cw4-group = { workspace = true } -sg-splits = { workspace = true } -anyhow = "1.0.57" -sg-eth-airdrop = { workspace = true } -whitelist-immutable = { workspace = true, features = ["library"] } -cw721 = { workspace = true } -cw721-base = { workspace = true, features = ["library"] } -sg2 = { workspace = true } -sg721 = { workspace = true } -sg-metadata = { workspace = true } -open-edition-factory = { workspace = true, features = ["library"] } -open-edition-minter = { workspace = true, features = ["library"] } -sg-whitelist = { workspace = true, features = ["library"] } -vending-factory = { workspace = true, features = ["library"] } -vending-minter = { workspace = true, features = ["library"] } -base-factory = { workspace = true } -base-minter = { workspace = true } -sg721-nt = { workspace = true } -sg-controllers = { workspace = true } -cw-ownable = { workspace = true } -serde = { workspace = true } -anybuf = { workspace = true } +cosmwasm-schema = { workspace = true } +sg-std = { workspace = true } +cosmwasm-std = { workspace = true } +cw2 = { workspace = true } +cw4 = { workspace = true } +cw-multi-test = { workspace = true } +sg-multi-test = { workspace = true } +sg721-base = { workspace = true } +sg721-base-v3-8-0-prerelease = { workspace = true } +sg721-updatable = { workspace = true } +cw4-group = { workspace = true } +sg-splits = { workspace = true } +anyhow = "1.0.57" +sg-eth-airdrop = { workspace = true } +whitelist-immutable = { workspace = true, features = ["library"] } +cw721 = { workspace = true } +cw721-base = { workspace = true, features = ["library"] } +sg2 = { workspace = true } +sg2-v3-8-0-prerelease = { workspace = true } +sg721 = { workspace = true } +sg721-v3-8-0-prerelease = { workspace = true } +sg-metadata = { workspace = true } +open-edition-factory = { workspace = true, features = ["library"] } +open-edition-minter = { workspace = true, features = ["library"] } +sg-whitelist = { workspace = true, features = ["library"] } +vending-factory = { workspace = true, features = ["library"] } +vending-minter = { workspace = true, features = ["library"] } +vending-factory-v3-8-0-prerelease = { workspace = true, features = ["library"] } +vending-minter-v3-8-0-prerelease = { workspace = true, features = ["library"] } +base-factory = { workspace = true } +base-minter = { workspace = true } +sg721-nt = { workspace = true } +sg-controllers = { workspace = true } +cw-ownable = { workspace = true } +serde = { workspace = true } +anybuf = { workspace = true } -vending-minter-merkle-wl = { workspace = true, features = ["library"] } -whitelist-mtree = { workspace = true, features = ["library"] } -rs_merkle = { version = "1.4.1", default-features = false } +vending-minter-merkle-wl = { workspace = true, features = ["library"] } +whitelist-mtree = { workspace = true, features = ["library"] } +rs_merkle = { version = "1.4.1", default-features = false } [dev-dependencies] serde = { workspace = true } diff --git a/test-suite/src/common_setup/contract_boxes.rs b/test-suite/src/common_setup/contract_boxes.rs index 617a6d591..f09e4380b 100644 --- a/test-suite/src/common_setup/contract_boxes.rs +++ b/test-suite/src/common_setup/contract_boxes.rs @@ -35,6 +35,17 @@ pub fn contract_vending_factory() -> Box> { Box::new(contract) } +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +pub fn contract_vending_factory_v3_8_0_prerelease() -> Box> { + let contract = ContractWrapper::new( + vending_factory_v3_8_0_prerelease::contract::execute, + vending_factory_v3_8_0_prerelease::contract::instantiate, + vending_factory_v3_8_0_prerelease::contract::query, + ) + .with_sudo(vending_factory_v3_8_0_prerelease::contract::sudo); + Box::new(contract) +} + pub fn contract_open_edition_factory() -> Box> { let contract = ContractWrapper::new( open_edition_factory::contract::execute, @@ -103,12 +114,35 @@ pub fn contract_vending_minter() -> Box> { Box::new(contract) } +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +pub fn contract_vending_minter_v3_8_0_prerelease() -> Box> { + let contract = ContractWrapper::new( + vending_minter_v3_8_0_prerelease::contract::execute, + vending_minter_v3_8_0_prerelease::contract::instantiate, + vending_minter_v3_8_0_prerelease::contract::query, + ) + .with_reply(vending_minter_v3_8_0_prerelease::contract::reply); + Box::new(contract) +} + pub fn contract_sg721_base() -> Box> { let contract = ContractWrapper::new( sg721_base::entry::execute, sg721_base::entry::instantiate, sg721_base::entry::query, - ); + ) + .with_migrate(sg721_base::entry::migrate); + Box::new(contract) +} + +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +pub fn contract_sg721_base_v3_8_0_prerelease() -> Box> { + let contract = ContractWrapper::new( + sg721_base_v3_8_0_prerelease::entry::execute, + sg721_base_v3_8_0_prerelease::entry::instantiate, + sg721_base_v3_8_0_prerelease::entry::query, + ) + .with_migrate(sg721_base_v3_8_0_prerelease::Sg721Contract::::migrate); Box::new(contract) } diff --git a/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs b/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs index 3339e0248..ea650edfa 100644 --- a/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs +++ b/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs @@ -26,6 +26,22 @@ pub fn mock_init_extension( } } +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +pub fn mock_init_extension_v3_8_0_prerelease( + splits_addr: Option, + start_time: Option, +) -> vending_factory_v3_8_0_prerelease::msg::VendingMinterInitMsgExtension { + vending_factory_v3_8_0_prerelease::msg::VendingMinterInitMsgExtension { + base_token_uri: "ipfs://aldkfjads".to_string(), + payment_address: splits_addr, + start_time: start_time.unwrap_or(Timestamp::from_nanos(GENESIS_MINT_START_TIME)), + num_tokens: 100, + mint_price: coin(MIN_MINT_PRICE, NATIVE_DENOM), + per_address_limit: 3, + whitelist: None, + } +} + pub fn mock_create_minter( splits_addr: Option, collection_params: CollectionParams, @@ -37,6 +53,18 @@ pub fn mock_create_minter( } } +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +pub fn mock_create_minter_v3_8_0_prerelease( + splits_addr: Option, + collection_params: sg2_v3_8_0_prerelease::msg::CollectionParams, + start_time: Option, +) -> vending_factory_v3_8_0_prerelease::msg::VendingMinterCreateMsg { + vending_factory_v3_8_0_prerelease::msg::VendingMinterCreateMsg { + init_msg: mock_init_extension_v3_8_0_prerelease(splits_addr, start_time), + collection_params, + } +} + pub fn mock_create_minter_init_msg( collection_params: CollectionParams, init_msg: VendingMinterInitMsgExtension, @@ -68,3 +96,28 @@ pub fn mock_params(mint_denom: Option) -> VendingMinterParams { }, } } + +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +pub fn mock_params_v3_8_0_prerelease( + mint_denom: Option, +) -> vending_factory_v3_8_0_prerelease::state::VendingMinterParams { + vending_factory_v3_8_0_prerelease::state::VendingMinterParams { + code_id: 1, + allowed_sg721_code_ids: vec![1, 3, 5, 6], + frozen: false, + creation_fee: coin(CREATION_FEE, NATIVE_DENOM), + min_mint_price: coin( + MIN_MINT_PRICE, + mint_denom.unwrap_or_else(|| NATIVE_DENOM.to_string()), + ), + mint_fee_bps: MINT_FEE_FAIR_BURN, + max_trading_offset_secs: 60 * 60 * 24 * 7, + extension: vending_factory_v3_8_0_prerelease::state::ParamsExtension { + max_token_limit: MAX_TOKEN_LIMIT, + max_per_address_limit: MAX_PER_ADDRESS_LIMIT, + airdrop_mint_price: coin(AIRDROP_MINT_PRICE, NATIVE_DENOM), + airdrop_mint_fee_bps: AIRDROP_MINT_FEE_FAIR_BURN, + shuffle_fee: coin(SHUFFLE_FEE, NATIVE_DENOM), + }, + } +} diff --git a/test-suite/src/sg721_base/tests/integration_tests.rs b/test-suite/src/sg721_base/tests/integration_tests.rs index 4d4730bd5..0045c71d1 100644 --- a/test-suite/src/sg721_base/tests/integration_tests.rs +++ b/test-suite/src/sg721_base/tests/integration_tests.rs @@ -1,13 +1,16 @@ #[cfg(test)] #[allow(deprecated)] mod tests { - use crate::common_setup::contract_boxes::App; + use crate::common_setup::contract_boxes::{ + contract_sg721_base_v3_8_0_prerelease, contract_vending_factory_v3_8_0_prerelease, + contract_vending_minter_v3_8_0_prerelease, App, + }; use anyhow::Error; use cosmwasm_std::{coin, Addr}; use cw721_base::msg::NumTokensResponse; use cw_multi_test::{AppResponse, BankSudo, Executor, SudoMsg}; use sg2::msg::CreateMinterMsg; - use sg2::tests::mock_collection_params; + use sg2::tests::{mock_collection_params, mock_collection_params_v3_8_0_prerelease}; use sg721::ExecuteMsg as Sg721ExecuteMsg; use sg721::{CollectionInfo, InstantiateMsg}; @@ -21,7 +24,8 @@ mod tests { }; use crate::common_setup::setup_minter::common::constants::CREATION_FEE; use crate::common_setup::setup_minter::vending_minter::mock_params::{ - mock_create_minter, mock_init_extension, mock_params, + mock_create_minter, mock_create_minter_v3_8_0_prerelease, mock_init_extension, mock_params, + mock_params_v3_8_0_prerelease, }; use cosmwasm_std::Empty; use cw721_base::msg::ExecuteMsg as cw721ExecuteMsg; @@ -60,6 +64,36 @@ mod tests { (app, factory_contract) } + /// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) + fn proper_instantiate_factory_v3_8_0_prerelease() -> ( + App, + vending_factory_v3_8_0_prerelease::helpers::FactoryContract, + ) { + let mut app = custom_mock_app(); + let factory_id = app.store_code(contract_vending_factory_v3_8_0_prerelease()); + let minter_id = app.store_code(contract_vending_minter_v3_8_0_prerelease()); + + let mut params = mock_params_v3_8_0_prerelease(None); + params.code_id = minter_id; + + let msg = vending_factory_v3_8_0_prerelease::msg::InstantiateMsg { params }; + let factory_addr = app + .instantiate_contract( + factory_id, + Addr::unchecked(GOVERNANCE), + &msg, + &[], + "factory", + Some(GOVERNANCE.to_string()), + ) + .unwrap(); + + let factory_contract = + vending_factory_v3_8_0_prerelease::helpers::FactoryContract(factory_addr); + + (app, factory_contract) + } + fn proper_instantiate() -> (App, Addr) { let (mut app, factory_contract) = proper_instantiate_factory(); let sg721_id = app.store_code(contract_sg721_base()); @@ -89,6 +123,36 @@ mod tests { (app, Addr::unchecked("contract2")) } + /// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) + fn proper_instantiate_v3_8_0_prerelease() -> (App, Addr) { + let (mut app, factory_contract) = proper_instantiate_factory_v3_8_0_prerelease(); + let sg721_id = app.store_code(contract_sg721_base_v3_8_0_prerelease()); + + let collection_params = mock_collection_params_v3_8_0_prerelease(); + let mut m = mock_create_minter_v3_8_0_prerelease(None, collection_params, None); + m.collection_params.code_id = sg721_id; + let msg = vending_factory_v3_8_0_prerelease::msg::ExecuteMsg::CreateMinter(m); + + let creation_fee = coin(CREATION_FEE, NATIVE_DENOM); + + app.sudo(SudoMsg::Bank(BankSudo::Mint { + to_address: ADMIN.to_string(), + amount: vec![creation_fee.clone()], + })) + .unwrap(); + + let bal = app.wrap().query_all_balances(ADMIN).unwrap(); + assert_eq!(bal, vec![creation_fee.clone()]); + + // this should create the minter + sg721 + let cosmos_msg = factory_contract.call_with_funds(msg, creation_fee).unwrap(); + + let res = app.execute(Addr::unchecked(ADMIN), cosmos_msg); + assert!(res.is_ok()); + + (app, Addr::unchecked("contract2")) + } + fn custom_proper_instantiate( custom_create_minter_msg: CreateMinterMsg, ) -> (App, Addr) { @@ -1005,4 +1069,79 @@ mod tests { assert_eq!(res.count, 0); } } + + mod migrate { + use super::*; + use cosmwasm_std::testing::mock_env; + use cw721::{ + msg::Cw721MigrateMsg, state::CollectionMetadata, CollectionMetadataExtension, + DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, + RoyaltyInfo, + }; + use sg721_base::msg::QueryMsg; + + #[test] + fn migrate_sg721_base_collection_metadata() { + let (mut app, contract) = proper_instantiate_v3_8_0_prerelease(); + // query legacy collection info + let legacy_collection_info: sg721_base_v3_8_0_prerelease::msg::CollectionInfoResponse = + app.wrap() + .query_wasm_smart( + contract.clone(), + &sg721_base_v3_8_0_prerelease::msg::QueryMsg::CollectionInfo {}, + ) + .unwrap(); + // throws a generic error, for unknown GetCollectionMetadata query + app.wrap() + .query_wasm_smart::>( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::GetCollectionMetadata {}, + ) + .expect_err("expecting generic error, for unknown GetCollectionMetadata query"); + + // migrate + let sg721_id = app.store_code(contract_sg721_base()); + let admin = Addr::unchecked("creator"); + let migrate_msg = Cw721MigrateMsg::WithUpdate { + minter: None, + creator: None, + }; + app.migrate_contract(admin, contract.clone(), &migrate_msg, sg721_id) + .unwrap(); + // assert collection metadata + let collection_metadata = app + .wrap() + .query_wasm_smart::>( + contract.clone(), + &QueryMsg::< + DefaultOptionNftMetadataExtension, + DefaultOptionCollectionMetadataExtension, + >::GetCollectionMetadata {}, + ) + .unwrap(); + let env = mock_env(); + assert_eq!( + collection_metadata, + CollectionMetadata:: { + name: "Collection Name".to_string(), + symbol: "COL".to_string(), + updated_at: env.block.time, + extension: Some(CollectionMetadataExtension:: { + description: legacy_collection_info.description, + image: legacy_collection_info.image, + external_link: legacy_collection_info.external_link, + start_trading_time: legacy_collection_info.start_trading_time, + explicit_content: legacy_collection_info.explicit_content, + royalty_info: legacy_collection_info.royalty_info.map(|r| RoyaltyInfo { + payment_address: Addr::unchecked(r.payment_address), + share: r.share, + }), + }) + } + ); + } + } } From ecf23f98b1acaf713844569e996fa449b066c769 Mon Sep 17 00:00:00 2001 From: mr-t Date: Wed, 20 Mar 2024 22:18:26 +0100 Subject: [PATCH 12/20] cleanup --- contracts/collections/sg721-base/src/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index c2377f91a..8e96f0e98 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -8,8 +8,8 @@ use cw721_base::{ }; use cosmwasm_std::{ - to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Deps, DepsMut, Env, - Event, MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, + to_json_binary, Addr, Binary, ContractInfoResponse, CustomMsg, Deps, DepsMut, Env, Event, + MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, }; use cw721_base::{execute::Cw721Execute, query::Cw721Query}; From 00e916f2ee1f1e2cfa153bcd03682f4e57110907 Mon Sep 17 00:00:00 2001 From: mr-t Date: Thu, 21 Mar 2024 13:09:43 +0100 Subject: [PATCH 13/20] update cw721 --- Cargo.lock | 4 ++-- contracts/collections/sg721-base/src/contract.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 001c5be29..2c09cd42e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1345,7 +1345,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#3661bb74e649ec588095d9de9b61536870a0637b" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#025f7c0e5546ca5b86edce80788b626fe38a3528" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1399,7 +1399,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#3661bb74e649ec588095d9de9b61536870a0637b" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#025f7c0e5546ca5b86edce80788b626fe38a3528" dependencies = [ "cosmwasm-std", "cw-ownable 0.6.0", diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 8e96f0e98..83d2b331b 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -69,7 +69,7 @@ where self.frozen_collection_info.save(deps.storage, &false)?; - self.parent.instantiate( + self.parent.instantiate_with_version( deps, &env, &info, From 7cbefc6d9b05996bdcd54b131a3b0f94eee70eeb Mon Sep 17 00:00:00 2001 From: mr-t Date: Sat, 23 Mar 2024 02:06:16 +0100 Subject: [PATCH 14/20] update lib --- Cargo.lock | 45 ++++++++++++++----- .../collections/sg721-base/examples/schema.rs | 9 ++-- .../collections/sg721-base/src/contract.rs | 12 ++--- contracts/collections/sg721-base/src/msg.rs | 6 +-- .../v3_0_0_ownable_and_collection_metadata.rs | 2 +- .../upgrades/v3_8_0_collection_metadata.rs | 45 ++++++++++--------- .../collections/sg721-nt/examples/schema.rs | 4 +- contracts/collections/sg721-nt/src/lib.rs | 2 +- .../sg721-updatable/examples/schema.rs | 8 ++-- .../sg721-updatable/src/contract.rs | 2 +- .../src/sg721_base/tests/integration_tests.rs | 14 +++--- 11 files changed, 91 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c09cd42e..6e220b88f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -330,9 +330,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -678,9 +678,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" dependencies = [ "serde", ] @@ -971,6 +971,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cosmwasm-storage" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66de2ab9db04757bcedef2b5984fbe536903ada4a8a9766717a4a71197ef34f6" +dependencies = [ + "cosmwasm-std", + "serde", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -1193,6 +1203,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "cw-paginate-storage" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8693baa8dc275f86c5b4f6b86702994e859ac1657e19c5cbcb55d295592a5c04" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus 1.2.0", + "serde", +] + [[package]] name = "cw-storage-plus" version = "0.16.0" @@ -1345,11 +1367,12 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#025f7c0e5546ca5b86edce80788b626fe38a3528" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#bb0228572db9b2a371e2e014fcc8a59ae9de88df" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-ownable 0.6.0", + "cw-paginate-storage", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1399,7 +1422,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#025f7c0e5546ca5b86edce80788b626fe38a3528" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#bb0228572db9b2a371e2e014fcc8a59ae9de88df" dependencies = [ "cosmwasm-std", "cw-ownable 0.6.0", @@ -2148,7 +2171,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.5", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -2409,9 +2432,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -4719,7 +4742,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -4730,7 +4753,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "toml_datetime", "winnow", ] diff --git a/contracts/collections/sg721-base/examples/schema.rs b/contracts/collections/sg721-base/examples/schema.rs index 8916f2be1..7ab574ed2 100644 --- a/contracts/collections/sg721-base/examples/schema.rs +++ b/contracts/collections/sg721-base/examples/schema.rs @@ -3,13 +3,14 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; +use cw721::CollectionMetadataAndExtension; use cw721_base::{ msg::{ AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, }, state::CollectionMetadata, - CollectionMetadataExtension, DefaultOptionCollectionMetadataExtension, + CollectionMetadataExtensionWrapper, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, RoyaltyInfo, }; use sg721::InstantiateMsg; @@ -30,7 +31,9 @@ fn main() { #[allow(deprecated)] export_schema(&schema_for!(CollectionInfoResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadata>), + &schema_for!( + CollectionMetadataAndExtension> + ), &out_dir, ); export_schema_with_title( @@ -49,7 +52,7 @@ fn main() { export_schema(&schema_for!(ApprovalsResponse), &out_dir); export_schema(&schema_for!(OperatorsResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadata), + &schema_for!(CollectionMetadataAndExtension), &out_dir, ); export_schema_with_title( diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 83d2b331b..0b8d480f0 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -12,7 +12,7 @@ use cosmwasm_std::{ MessageInfo, Response, StdError, Storage, Timestamp, WasmQuery, }; -use cw721_base::{execute::Cw721Execute, query::Cw721Query}; +use cw721_base::traits::{Cw721Execute, Cw721Query}; use cw_utils::nonpayable; #[allow(deprecated)] @@ -120,7 +120,9 @@ where info: MessageInfo, collection_msg: UpdateCollectionInfoMsg, ) -> Result, ContractError> { - let collection_info = self.parent.config.collection_metadata.load(deps.storage)?; + let collection_info = self + .parent + .query_collection_metadata_and_extension(deps.as_ref())?; if self.frozen_collection_info.load(deps.storage)? { return Err(ContractError::CollectionInfoFrozen {}); @@ -153,7 +155,7 @@ where extension: Some(collection_extension), }; self.parent - .update_collection_metadata(deps, &info, &env, msg)?; + .update_collection_metadata(deps, Some(&info), Some(&env), msg)?; let event = Event::new("update_collection_info").add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) @@ -183,7 +185,7 @@ where }), }; self.parent - .update_collection_metadata(deps, &info, &env, msg)?; + .update_collection_metadata(deps, Some(&info), Some(&env), msg)?; let event = Event::new("update_start_trading_time").add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) @@ -253,7 +255,7 @@ where &self, deps: Deps, ) -> Result { - let collection_info = self.parent.config.collection_metadata.load(deps.storage)?; + let collection_info = self.parent.query_collection_metadata_and_extension(deps)?; let creator = self .get_creator(deps.storage)? diff --git a/contracts/collections/sg721-base/src/msg.rs b/contracts/collections/sg721-base/src/msg.rs index 661b1f324..c368805bd 100644 --- a/contracts/collections/sg721-base/src/msg.rs +++ b/contracts/collections/sg721-base/src/msg.rs @@ -10,7 +10,7 @@ use cw721_base::{ NumTokensResponse, OperatorsResponse, OwnerOfResponse, QueryMsg as Cw721QueryMsg, TokensResponse, }, - state::CollectionMetadata, + state::CollectionMetadataAndExtension, DefaultOptionCollectionMetadataExtensionMsg, }; use cw_ownable::Ownership; @@ -64,13 +64,13 @@ pub enum QueryMsg< NumTokens {}, #[deprecated(since = "0.19.0", note = "Please use GetCollectionMetadata instead")] - #[returns(CollectionMetadata)] + #[returns(CollectionMetadataAndExtension)] /// Deprecated: use GetCollectionMetadata instead! Will be removed in next release! ContractInfo {}, /// With MetaData Extension. /// Returns top-level metadata about the contract - #[returns(CollectionMetadata)] + #[returns(CollectionMetadataAndExtension)] GetCollectionMetadata {}, #[deprecated(since = "0.19.0", note = "Please use GetMinterOwnership instead")] diff --git a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs index eb4315775..9be7ad7a4 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs @@ -9,7 +9,7 @@ use cw721::{ DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, }; -use cw721_base::execute::Cw721Execute; +use cw721_base::traits::Cw721Execute; /// Migrates cw721 states: /// (1) legacy creator and minter migration, now using cw-ownable diff --git a/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs b/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs index 834e6cd5b..244e0c89b 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs @@ -1,9 +1,10 @@ use crate::{ContractError, Sg721Contract}; use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; -use cw721::traits::StateFactory; +use cw721::execute::update_collection_metadata; +use cw721::msg::CollectionMetadataMsg; use cw721::{ - msg::CollectionMetadataExtensionMsg, query::Cw721Query, + msg::CollectionMetadataExtensionMsg, traits::Cw721Query, DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, RoyaltyInfo, }; @@ -23,33 +24,35 @@ pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result::default(); let event = Event::new("migrate-3.1.0"); // migrate only in case collection metadata is not set - let mut collection_metadata = contract + let collection_metadata = contract .parent - .query_collection_metadata(deps.as_ref(), env)?; + .query_collection_metadata_and_extension(deps.as_ref())?; let event = match collection_metadata.extension.clone() { Some(_) => event, None => { let legacy_collection_info_store: Item> = Item::new("collection_info"); let legacy_collection_info = legacy_collection_info_store.load(deps.storage)?; - let collection_metadata_msg = CollectionMetadataExtensionMsg:: { - description: Some(legacy_collection_info.description), - explicit_content: legacy_collection_info.explicit_content, - external_link: legacy_collection_info.external_link, - image: Some(legacy_collection_info.image), - start_trading_time: legacy_collection_info.start_trading_time, - royalty_info: legacy_collection_info.royalty_info.map(|r| r.into()), + let collection_metadata_extension_msg = + CollectionMetadataExtensionMsg:: { + description: Some(legacy_collection_info.description), + explicit_content: legacy_collection_info.explicit_content, + external_link: legacy_collection_info.external_link, + image: Some(legacy_collection_info.image), + start_trading_time: legacy_collection_info.start_trading_time, + royalty_info: legacy_collection_info.royalty_info.map(|r| r.into()), + }; + let collection_metadata_msg = CollectionMetadataMsg { + name: Some(collection_metadata.name), + symbol: Some(collection_metadata.symbol), + extension: Some(collection_metadata_extension_msg.clone()), }; - let updated_collection_metadata_extension_result = - collection_metadata_msg.create(Some(deps.as_ref()), Some(env), None, None); - let updated_collection_metadata_extension = - updated_collection_metadata_extension_result?; - collection_metadata.extension = Some(updated_collection_metadata_extension); - contract - .parent - .config - .collection_metadata - .save(deps.storage, &collection_metadata)?; + + update_collection_metadata::< + DefaultOptionCollectionMetadataExtension, + DefaultOptionCollectionMetadataExtensionMsg, + Empty, + >(deps, None, env.into(), collection_metadata_msg)?; event } }; diff --git a/contracts/collections/sg721-nt/examples/schema.rs b/contracts/collections/sg721-nt/examples/schema.rs index dc3f0f21a..957215b55 100644 --- a/contracts/collections/sg721-nt/examples/schema.rs +++ b/contracts/collections/sg721-nt/examples/schema.rs @@ -4,7 +4,7 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; use cw721::{ - state::CollectionMetadata, DefaultOptionCollectionMetadataExtension, + CollectionMetadataAndExtension, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, }; #[allow(deprecated)] @@ -51,7 +51,7 @@ fn main() { #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadata), + &schema_for!(CollectionMetadataAndExtension), &out_dir, ); export_schema_with_title( diff --git a/contracts/collections/sg721-nt/src/lib.rs b/contracts/collections/sg721-nt/src/lib.rs index 385ec03db..28a136bff 100644 --- a/contracts/collections/sg721-nt/src/lib.rs +++ b/contracts/collections/sg721-nt/src/lib.rs @@ -37,7 +37,7 @@ pub mod entry { use crate::msg::ExecuteMsg; use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdError}; use cw721::msg::Cw721MigrateMsg; - use cw721_base::execute::Cw721Execute; + use cw721_base::traits::Cw721Execute; use sg721_base::ContractError; #[entry_point] diff --git a/contracts/collections/sg721-updatable/examples/schema.rs b/contracts/collections/sg721-updatable/examples/schema.rs index 775d8d7c4..3608f9dad 100644 --- a/contracts/collections/sg721-updatable/examples/schema.rs +++ b/contracts/collections/sg721-updatable/examples/schema.rs @@ -4,7 +4,7 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; use cw721::{ - state::CollectionMetadata, CollectionMetadataExtension, + CollectionMetadataAndExtension, CollectionMetadataExtensionWrapper, DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, RoyaltyInfo, }; #[allow(deprecated)] @@ -41,7 +41,9 @@ fn main() { #[allow(deprecated)] export_schema(&schema_for!(CollectionInfoResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadata>), + &schema_for!( + CollectionMetadataAndExtension> + ), &out_dir, ); export_schema_with_title( @@ -61,7 +63,7 @@ fn main() { #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadata), + &schema_for!(CollectionMetadataAndExtension), &out_dir, ); export_schema_with_title( diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index fc283b984..0914222a4 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -256,7 +256,7 @@ mod tests { from_json, to_json_binary, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, }; - use cw721_base::query::Cw721Query; + use cw721_base::traits::Cw721Query; use sg721::{CollectionInfo, InstantiateMsg}; use std::marker::PhantomData; diff --git a/test-suite/src/sg721_base/tests/integration_tests.rs b/test-suite/src/sg721_base/tests/integration_tests.rs index 0045c71d1..bd036fba2 100644 --- a/test-suite/src/sg721_base/tests/integration_tests.rs +++ b/test-suite/src/sg721_base/tests/integration_tests.rs @@ -1074,9 +1074,9 @@ mod tests { use super::*; use cosmwasm_std::testing::mock_env; use cw721::{ - msg::Cw721MigrateMsg, state::CollectionMetadata, CollectionMetadataExtension, - DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, - RoyaltyInfo, + msg::Cw721MigrateMsg, state::CollectionMetadataAndExtension, + CollectionMetadataExtensionWrapper, DefaultOptionCollectionMetadataExtension, + DefaultOptionNftMetadataExtension, RoyaltyInfo, }; use sg721_base::msg::QueryMsg; @@ -1093,7 +1093,7 @@ mod tests { .unwrap(); // throws a generic error, for unknown GetCollectionMetadata query app.wrap() - .query_wasm_smart::>( + .query_wasm_smart::>( contract.clone(), &QueryMsg::< DefaultOptionNftMetadataExtension, @@ -1114,7 +1114,7 @@ mod tests { // assert collection metadata let collection_metadata = app .wrap() - .query_wasm_smart::>( + .query_wasm_smart::>( contract.clone(), &QueryMsg::< DefaultOptionNftMetadataExtension, @@ -1125,11 +1125,11 @@ mod tests { let env = mock_env(); assert_eq!( collection_metadata, - CollectionMetadata:: { + CollectionMetadataAndExtension:: { name: "Collection Name".to_string(), symbol: "COL".to_string(), updated_at: env.block.time, - extension: Some(CollectionMetadataExtension:: { + extension: Some(CollectionMetadataExtensionWrapper:: { description: legacy_collection_info.description, image: legacy_collection_info.image, external_link: legacy_collection_info.external_link, From 98fd413d0556bb00ca4f3b6516499993fb6c742c Mon Sep 17 00:00:00 2001 From: mr-t Date: Sat, 23 Mar 2024 16:57:16 +0100 Subject: [PATCH 15/20] update lib --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6e220b88f..ae10e9c5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#bb0228572db9b2a371e2e014fcc8a59ae9de88df" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#eec41c0db193a17cb70750c41d71d6873a5710ac" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1422,7 +1422,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#bb0228572db9b2a371e2e014fcc8a59ae9de88df" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#eec41c0db193a17cb70750c41d71d6873a5710ac" dependencies = [ "cosmwasm-std", "cw-ownable 0.6.0", @@ -3287,9 +3287,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", From 52beddeb7fea6ce29c1b8aff6c357b968e53d415 Mon Sep 17 00:00:00 2001 From: mr-t Date: Mon, 25 Mar 2024 00:43:33 +0100 Subject: [PATCH 16/20] final cleanup, docs, renamings, update libs --- Cargo.lock | 67 ++++---- .../collections/sg721-base/examples/schema.rs | 23 ++- .../collections/sg721-base/src/contract.rs | 69 ++++---- contracts/collections/sg721-base/src/lib.rs | 58 ++++--- contracts/collections/sg721-base/src/msg.rs | 108 +++++++------ contracts/collections/sg721-base/src/state.rs | 132 ++++++++------- .../sg721-base/src/upgrades/mod.rs | 2 +- ... => v3_0_0_ownable_and_collection_info.rs} | 16 +- .../src/upgrades/v3_1_0_royalty_timestamp.rs | 14 +- .../upgrades/v3_8_0_collection_metadata.rs | 49 +++--- .../collections/sg721-nt/examples/schema.rs | 22 ++- contracts/collections/sg721-nt/src/lib.rs | 31 ++-- .../sg721-updatable/examples/schema.rs | 25 ++- .../sg721-updatable/src/contract.rs | 24 +-- .../collections/sg721-updatable/src/lib.rs | 9 +- .../collections/sg721-updatable/src/msg.rs | 28 ++-- contracts/minters/base-minter/src/contract.rs | 35 ++-- .../open-edition-minter/src/contract.rs | 9 +- .../open-edition-minter/src/helpers.rs | 9 +- .../vending-minter-merkle-wl/src/contract.rs | 13 +- .../vending-minter-wl-flex/src/contract.rs | 13 +- .../minters/vending-minter/src/contract.rs | 13 +- packages/sg2/src/tests.rs | 2 +- packages/sg721/src/lib.rs | 63 ++++---- .../base_minter/tests/integration_tests.rs | 19 ++- test-suite/src/common_setup/contract_boxes.rs | 6 +- .../vending_minter/mock_params.rs | 6 +- .../complete_mint_all_outcomes_validation.rs | 14 +- .../src/sg721_base/tests/integration_tests.rs | 153 ++++++++++-------- .../src/vending_minter/tests/address_limit.rs | 14 +- .../src/vending_minter/tests/happy_unhappy.rs | 13 +- .../src/vending_minter/tests/trading_time.rs | 9 +- .../tests/trading_time_updatable.rs | 9 +- .../src/vending_minter/tests/updatable.rs | 14 +- .../src/vending_minter/tests/whitelist.rs | 11 +- .../vending_minter/tests/zero_mint_price.rs | 10 +- 36 files changed, 606 insertions(+), 506 deletions(-) rename contracts/collections/sg721-base/src/upgrades/{v3_0_0_ownable_and_collection_metadata.rs => v3_0_0_ownable_and_collection_info.rs} (79%) diff --git a/Cargo.lock b/Cargo.lock index ae10e9c5a..ce6cd988d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -105,7 +105,7 @@ dependencies = [ "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", + "fastrand 2.0.2", "futures-lite 2.3.0", "slab", ] @@ -157,7 +157,7 @@ dependencies = [ "futures-io", "futures-lite 2.3.0", "parking", - "polling 3.5.0", + "polling 3.6.0", "rustix 0.38.32", "slab", "tracing", @@ -229,7 +229,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -240,13 +240,13 @@ checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.78" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -274,7 +274,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -584,7 +584,7 @@ dependencies = [ "async-channel 2.2.0", "async-lock 3.3.0", "async-task", - "fastrand 2.0.1", + "fastrand 2.0.2", "futures-io", "futures-lite 2.3.0", "piper", @@ -617,7 +617,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", "syn_derive", ] @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#eec41c0db193a17cb70750c41d71d6873a5710ac" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#8b211cea2f80e588ab792f34cd77413a6ff3ef51" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1422,7 +1422,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#eec41c0db193a17cb70750c41d71d6873a5710ac" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#8b211cea2f80e588ab792f34cd77413a6ff3ef51" dependencies = [ "cosmwasm-std", "cw-ownable 0.6.0", @@ -1896,9 +1896,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "ff" @@ -2038,7 +2038,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.0.2", "futures-core", "futures-io", "parking", @@ -2053,7 +2053,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -2936,7 +2936,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -2967,7 +2967,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -2989,7 +2989,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.0.2", "futures-io", ] @@ -3031,12 +3031,13 @@ dependencies = [ [[package]] name = "polling" -version = "3.5.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.3.9", "pin-project-lite", "rustix 0.38.32", "tracing", @@ -3187,7 +3188,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -3746,7 +3747,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -3779,7 +3780,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -4352,9 +4353,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", @@ -4370,7 +4371,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -4509,7 +4510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d506c7664333e246f564949bee4ed39062aa0f11918e6f5a95f553cdad65c274" dependencies = [ "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -4590,7 +4591,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -4682,7 +4683,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -4841,7 +4842,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -5180,7 +5181,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", "wasm-bindgen-shared", ] @@ -5214,7 +5215,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5499,5 +5500,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] diff --git a/contracts/collections/sg721-base/examples/schema.rs b/contracts/collections/sg721-base/examples/schema.rs index 7ab574ed2..7996bdc3f 100644 --- a/contracts/collections/sg721-base/examples/schema.rs +++ b/contracts/collections/sg721-base/examples/schema.rs @@ -3,15 +3,14 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; -use cw721::CollectionMetadataAndExtension; +use cosmwasm_std::Empty; use cw721_base::{ msg::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, + CollectionInfoAndExtensionResponse, MinterResponse, NftInfoResponse, NumTokensResponse, + OperatorsResponse, OwnerOfResponse, TokensResponse, }, - state::CollectionMetadata, - CollectionMetadataExtensionWrapper, DefaultOptionCollectionMetadataExtension, - DefaultOptionNftMetadataExtension, RoyaltyInfo, + DefaultOptionalCollectionExtension, DefaultOptionalNftExtension, }; use sg721::InstantiateMsg; #[allow(deprecated)] @@ -25,19 +24,17 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema( - &schema_for!(QueryMsg), + &schema_for!(QueryMsg), &out_dir, ); #[allow(deprecated)] export_schema(&schema_for!(CollectionInfoResponse), &out_dir); export_schema( - &schema_for!( - CollectionMetadataAndExtension> - ), + &schema_for!(CollectionInfoAndExtensionResponse), &out_dir, ); export_schema_with_title( - &schema_for!(AllNftInfoResponse), + &schema_for!(AllNftInfoResponse), &out_dir, "AllNftInfoResponse", ); @@ -52,11 +49,11 @@ fn main() { export_schema(&schema_for!(ApprovalsResponse), &out_dir); export_schema(&schema_for!(OperatorsResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadataAndExtension), + &schema_for!(CollectionInfoAndExtensionResponse), &out_dir, ); export_schema_with_title( - &schema_for!(NftInfoResponse), + &schema_for!(NftInfoResponse), &out_dir, "NftInfoResponse", ); diff --git a/contracts/collections/sg721-base/src/contract.rs b/contracts/collections/sg721-base/src/contract.rs index 0b8d480f0..106ccbd06 100644 --- a/contracts/collections/sg721-base/src/contract.rs +++ b/contracts/collections/sg721-base/src/contract.rs @@ -1,10 +1,9 @@ -use cw721::msg::{CollectionMetadataMsg, Cw721MigrateMsg}; +use cw721::msg::{CollectionInfoMsg, Cw721MigrateMsg}; use cw721::state::{MAX_COLLECTION_DESCRIPTION_LENGTH, MINTER}; -use cw721::traits::{Cw721CustomMsg, Cw721State}; -use cw721_base::msg::{CollectionMetadataExtensionMsg, RoyaltyInfoResponse}; +use cw721::traits::{Contains, Cw721CustomMsg, Cw721State}; +use cw721_base::msg::{CollectionExtensionMsg, RoyaltyInfoResponse}; use cw721_base::{ - traits::StateFactory, DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + traits::StateFactory, DefaultOptionalCollectionExtension, DefaultOptionalCollectionExtensionMsg, }; use cosmwasm_std::{ @@ -24,23 +23,35 @@ use crate::{ContractError, Sg721Contract}; use crate::entry::{CONTRACT_NAME, CONTRACT_VERSION}; -impl<'a, TNftMetadataExtension, TNftMetadataExtensionMsg, TCustomResponseMsg> +impl< + 'a, + TNftExtension, + TNftExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, + TCustomResponseMsg, + > Sg721Contract< 'a, - // Metadata defined in NftInfo (used for mint). - TNftMetadataExtension, - // Message passed for updating metadata. - TNftMetadataExtensionMsg, - // Extension defined in CollectionMetadata. - DefaultOptionCollectionMetadataExtension, - // Message passed for updating collection info extension. - DefaultOptionCollectionMetadataExtensionMsg, + // NftInfo extension (onchain metadata). + TNftExtension, + // NftInfo extension msg for onchain metadata. + TNftExtensionMsg, + // CollectionInfo extension (onchain attributes). + DefaultOptionalCollectionExtension, + // CollectionInfo extension msg for onchain collection attributes. + DefaultOptionalCollectionExtensionMsg, + // Custom extension msg for custom contract logic. Default implementation is a no-op. + TExtensionMsg, + // Custom query msg for custom contract logic. Default implementation returns an empty binary. + TExtensionQueryMsg, // Defines for `CosmosMsg::Custom` in response. Barely used, so `Empty` can be used. TCustomResponseMsg, > where - TNftMetadataExtension: Cw721State, - TNftMetadataExtensionMsg: Cw721CustomMsg + StateFactory, + TNftExtension: Cw721State + Contains, + TNftExtensionMsg: Cw721CustomMsg + StateFactory, + TExtensionQueryMsg: Cw721CustomMsg, TCustomResponseMsg: CustomMsg, { #[allow(deprecated)] @@ -92,7 +103,7 @@ where deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg, ) -> Result, ContractError> { match msg { // ---- sg721 specific msgs ---- @@ -122,7 +133,7 @@ where ) -> Result, ContractError> { let collection_info = self .parent - .query_collection_metadata_and_extension(deps.as_ref())?; + .query_collection_info_and_extension(deps.as_ref())?; if self.frozen_collection_info.load(deps.storage)? { return Err(ContractError::CollectionInfoFrozen {}); @@ -147,15 +158,15 @@ where .save(deps.storage, &env.block.time)?; } - let collection_extension: CollectionMetadataExtensionMsg = + let collection_extension: CollectionExtensionMsg = collection_msg.into(); - let msg = CollectionMetadataMsg { + let msg = CollectionInfoMsg { name: None, symbol: None, extension: Some(collection_extension), }; self.parent - .update_collection_metadata(deps, Some(&info), Some(&env), msg)?; + .update_collection_info(deps, Some(&info), Some(&env), msg)?; let event = Event::new("update_collection_info").add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) @@ -172,10 +183,10 @@ where ) -> Result, ContractError> { assert_minter_owner(deps.storage, &info.sender)?; - let msg = CollectionMetadataMsg { + let msg = CollectionInfoMsg { name: None, symbol: None, - extension: Some(CollectionMetadataExtensionMsg { + extension: Some(CollectionExtensionMsg { description: None, image: None, external_link: None, @@ -185,7 +196,7 @@ where }), }; self.parent - .update_collection_metadata(deps, Some(&info), Some(&env), msg)?; + .update_collection_info(deps, Some(&info), Some(&env), msg)?; let event = Event::new("update_start_trading_time").add_attribute("sender", info.sender); Ok(Response::new().add_event(event)) @@ -214,7 +225,7 @@ where deps: DepsMut, env: Env, info: MessageInfo, - nft_data: NftParams, + nft_data: NftParams, ) -> Result, ContractError> { assert_minter_owner(deps.storage, &info.sender)?; let (token_id, owner, token_uri, extension) = match nft_data { @@ -241,7 +252,7 @@ where &self, deps: Deps, env: Env, - msg: QueryMsg, + msg: QueryMsg, ) -> Result { match msg { #[allow(deprecated)] @@ -255,7 +266,7 @@ where &self, deps: Deps, ) -> Result { - let collection_info = self.parent.query_collection_metadata_and_extension(deps)?; + let collection_info = self.parent.query_collection_info_and_extension(deps)?; let creator = self .get_creator(deps.storage)? @@ -291,7 +302,7 @@ where let mut response = Response::new(); // these upgrades can always be called. migration is only executed in case new stores are empty! It is safe calling these on any version. - response = crate::upgrades::v3_0_0_ownable_and_collection_metadata::upgrade( + response = crate::upgrades::v3_0_0_ownable_and_collection_info::upgrade( deps.branch(), &env, response, @@ -299,7 +310,7 @@ where )?; response = crate::upgrades::v3_1_0_royalty_timestamp::upgrade(deps.branch(), &env, response)?; - // after migration of collection metadata in cw721, we can migrate collection info to new collection metadata extension + // after migration of collection metadata in cw721, we can migrate collection info to new collection extension response = crate::upgrades::v3_8_0_collection_metadata::upgrade(deps.branch(), &env, response)?; diff --git a/contracts/collections/sg721-base/src/lib.rs b/contracts/collections/sg721-base/src/lib.rs index 74c1a872b..5137e9bac 100644 --- a/contracts/collections/sg721-base/src/lib.rs +++ b/contracts/collections/sg721-base/src/lib.rs @@ -6,16 +6,16 @@ pub mod upgrades; pub use crate::error::ContractError; pub use crate::state::Sg721Contract; -use cw721::{DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg}; -use cw721_base::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cosmwasm_std::Empty; +use cw721::{DefaultOptionalCollectionExtensionMsg, DefaultOptionalNftExtensionMsg}; +use cw721_base::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; -pub type ExecuteMsg = sg721::ExecuteMsg< - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtensionMsg, ->; +pub type ExecuteMsg = + sg721::ExecuteMsg; pub type QueryMsg = cw721_base::msg::QueryMsg< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >; pub mod entry { @@ -43,10 +43,12 @@ pub mod entry { set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; let res = Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::default() .instantiate(deps, env, info, msg)?; @@ -64,10 +66,12 @@ pub mod entry { msg: ExecuteMsg, ) -> Result { Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::default() .execute(deps, env, info, msg) @@ -77,13 +81,15 @@ pub mod entry { pub fn query( deps: Deps, env: Env, - msg: QueryMsg, + msg: QueryMsg, ) -> Result { Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::default() .query(deps, env, msg) @@ -97,10 +103,12 @@ pub mod entry { msg: Cw721MigrateMsg, ) -> Result { Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::migrate(deps, env, msg) } diff --git a/contracts/collections/sg721-base/src/msg.rs b/contracts/collections/sg721-base/src/msg.rs index c368805bd..d35cdc1fa 100644 --- a/contracts/collections/sg721-base/src/msg.rs +++ b/contracts/collections/sg721-base/src/msg.rs @@ -1,4 +1,5 @@ use cw721::msg::RoyaltyInfoResponse; +use cw721::traits::Cw721CustomMsg; use cw721::traits::Cw721State; use cosmwasm_schema::cw_serde; @@ -6,12 +7,12 @@ use cosmwasm_schema::QueryResponses; use cosmwasm_std::{coin, Addr, BankMsg, Event, StdError, StdResult, Timestamp, Uint128}; use cw721_base::{ msg::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, QueryMsg as Cw721QueryMsg, + AllInfoResponse, AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, + CollectionInfoAndExtensionResponse, MinterResponse, NftInfoResponse, NumTokensResponse, + OperatorResponse, OperatorsResponse, OwnerOfResponse, QueryMsg as Cw721QueryMsg, TokensResponse, }, - state::CollectionMetadataAndExtension, - DefaultOptionCollectionMetadataExtensionMsg, + state::CollectionExtensionAttributes, }; use cw_ownable::Ownership; use sg_std::{Response, SubMsg, NATIVE_DENOM}; @@ -21,13 +22,15 @@ use sg_std::{Response, SubMsg, NATIVE_DENOM}; #[allow(deprecated)] pub enum QueryMsg< // Return type of NFT metadata defined in `NftInfo` and `AllNftInfo`. - TNftMetadataExtension, - // Return type of collection metadata extension defined in `GetCollectionMetadata`. - TCollectionMetadataExtension, + TNftExtension, + // Return type of collection extension defined in `GetCollectionInfo`. + TCollectionExtension, + // Custom query msg for custom contract logic. Default implementation returns an empty binary. + TExtensionQueryMsg, > { #[allow(deprecated)] #[returns(CollectionInfoResponse)] - #[deprecated = "Please use GetCollectionMetadata instead"] + #[deprecated = "Please use GetCollectionInfo instead"] CollectionInfo {}, // ---- cw721 v0.19.0 msgs ---- @@ -51,6 +54,14 @@ pub enum QueryMsg< token_id: String, include_expired: Option, }, + /// Return approval of a given operator for all tokens of an owner, error if not set + #[returns(OperatorResponse)] + Operator { + owner: String, + operator: String, + include_expired: Option, + }, + /// List all operators that can access all of the owner's tokens #[returns(OperatorsResponse)] AllOperators { owner: String, @@ -63,15 +74,25 @@ pub enum QueryMsg< #[returns(NumTokensResponse)] NumTokens {}, - #[deprecated(since = "0.19.0", note = "Please use GetCollectionMetadata instead")] - #[returns(CollectionMetadataAndExtension)] - /// Deprecated: use GetCollectionMetadata instead! Will be removed in next release! + #[deprecated( + since = "0.19.0", + note = "Please use GetCollectionInfoAndExtension instead" + )] + #[returns(CollectionInfoAndExtensionResponse)] + /// Deprecated: use GetCollectionInfoAndExtension instead! Will be removed in next release! ContractInfo {}, - /// With MetaData Extension. - /// Returns top-level metadata about the contract - #[returns(CollectionMetadataAndExtension)] - GetCollectionMetadata {}, + /// Returns `CollectionInfoAndExtensionResponse` + #[returns(CollectionInfoAndExtensionResponse)] + GetCollectionInfoAndExtension {}, + + /// returns `AllInfoResponse` which contains contract, collection and nft details + #[returns(AllInfoResponse)] + GetAllInfo {}, + + /// Returns `CollectionExtensionAttributes` + #[returns(CollectionExtensionAttributes)] + GetCollectionExtensionAttributes {}, #[deprecated(since = "0.19.0", note = "Please use GetMinterOwnership instead")] #[returns(Ownership)] @@ -93,12 +114,20 @@ pub enum QueryMsg< /// With MetaData Extension. /// Returns metadata about one particular token, based on *ERC721 Metadata JSON Schema* /// but directly from the contract - #[returns(NftInfoResponse)] + #[returns(NftInfoResponse)] NftInfo { token_id: String }, + + #[returns(Option>)] + GetNftByExtension { + extension: TNftExtension, + start_after: Option, + limit: Option, + }, + /// With MetaData Extension. /// Returns the result of both `NftInfo` and `OwnerOf` as one query as an optimization /// for clients - #[returns(AllNftInfoResponse)] + #[returns(AllNftInfoResponse)] AllNftInfo { token_id: String, /// unset or false will filter out expired approvals, you must set to true to see them @@ -121,42 +150,29 @@ pub enum QueryMsg< limit: Option, }, - #[returns(Option)] - GetWithdrawAddress {}, - - // -- below queries, Extension and GetCollectionMetadataExtension, are just dummies, since type annotations are required for - // -- TNftMetadataExtension and TCollectionMetadataExtension, Error: - // -- "type annotations needed: cannot infer type for type parameter `TNftMetadataExtension` declared on the enum `Cw721QueryMsg`" - /// Use NftInfo instead. - /// No-op / NFT metadata query returning empty binary, needed for inferring type parameter during compile. - /// - /// Note: it may be extended in case there are use cases e.g. for specific NFT metadata query. + /// Custom msg query. Default implementation returns an empty binary. #[returns(())] - #[deprecated(since = "0.19.0", note = "Please use GetNftMetadata instead")] - Extension { msg: TNftMetadataExtension }, + Extension { msg: TExtensionQueryMsg }, #[returns(())] - GetNftMetadata { msg: TNftMetadataExtension }, + GetCollectionExtension { msg: TCollectionExtension }, - /// Use GetCollectionMetadata instead. - /// No-op / collection metadata extension query returning empty binary, needed for inferring type parameter during compile - /// - /// Note: it may be extended in case there are use cases e.g. for specific collection metadata query. - #[returns(())] - GetCollectionMetadataExtension { msg: TCollectionMetadataExtension }, + #[returns(Option)] + GetWithdrawAddress {}, } -impl - From> - for Cw721QueryMsg +impl + From> + for Cw721QueryMsg where - TNftMetadataExtension: Cw721State, - TCollectionMetadataExtension: Cw721State, + TNftExtension: Cw721State, + TCollectionExtension: Cw721State, + TExtensionQueryMsg: Cw721CustomMsg, { #[allow(deprecated)] fn from( - msg: QueryMsg, - ) -> Cw721QueryMsg { + msg: QueryMsg, + ) -> Cw721QueryMsg { match msg { QueryMsg::OwnerOf { token_id, @@ -194,7 +210,9 @@ where }, QueryMsg::NumTokens {} => Cw721QueryMsg::NumTokens {}, QueryMsg::ContractInfo {} => Cw721QueryMsg::ContractInfo {}, - QueryMsg::GetCollectionMetadata {} => Cw721QueryMsg::GetCollectionMetadata {}, + QueryMsg::GetCollectionInfoAndExtension {} => { + Cw721QueryMsg::GetCollectionInfoAndExtension {} + } QueryMsg::Ownership {} => Cw721QueryMsg::Ownership {}, QueryMsg::Minter {} => Cw721QueryMsg::Minter {}, QueryMsg::GetMinterOwnership {} => Cw721QueryMsg::GetMinterOwnership {}, @@ -225,7 +243,7 @@ where } #[cw_serde] -#[deprecated = "Please use `CollectionMetadata>` instead"] +#[deprecated = "Please use `CollectionInfo>` instead"] pub struct CollectionInfoResponse { pub creator: String, pub description: String, diff --git a/contracts/collections/sg721-base/src/state.rs b/contracts/collections/sg721-base/src/state.rs index 34599e0af..bed14a6fb 100644 --- a/contracts/collections/sg721-base/src/state.rs +++ b/contracts/collections/sg721-base/src/state.rs @@ -6,47 +6,61 @@ use std::ops::Deref; type Parent< 'a, - // Metadata defined in NftInfo (used for mint). - TNftMetadataExtension, - // Message passed for updating metadata. - TNftMetadataExtensionMsg, - // Extension defined in CollectionMetadata. - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + // NftInfo extension (onchain metadata). + TNftExtension, + // NftInfo extension msg for onchain metadata. + TNftExtensionMsg, + // CollectionInfo extension (onchain attributes). + TCollectionExtension, + // CollectionInfo extension msg for onchain collection attributes. + TCollectionExtensionMsg, + // Custom extension msg for custom contract logic. Default implementation is a no-op. + TExtensionMsg, + // Custom query msg for custom contract logic. Default implementation returns an empty binary. + TExtensionQueryMsg, // Defines for `CosmosMsg::Custom` in response. Barely used, so `Empty` can be used. TCustomResponseMsg, > = cw721_base::Cw721Contract< 'a, - TNftMetadataExtension, - TNftMetadataExtensionMsg, - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + TNftExtension, + TNftExtensionMsg, + TCollectionExtension, + TCollectionExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, TCustomResponseMsg, >; pub struct Sg721Contract< 'a, - // Metadata defined in NftInfo (used for mint). - TNftMetadataExtension, - // Message passed for updating metadata. - TNftMetadataExtensionMsg, - // Extension defined in CollectionMetadata. - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + // NftInfo extension (onchain metadata). + TNftExtension, + // NftInfo extension msg for onchain metadata. + TNftExtensionMsg, + // CollectionInfo extension (onchain attributes). + TCollectionExtension, + // CollectionInfo extension msg for onchain collection attributes. + TCollectionExtensionMsg, + // Custom extension msg for custom contract logic. Default implementation is a no-op. + TExtensionMsg, + // Custom query msg for custom contract logic. Default implementation returns an empty binary. + TExtensionQueryMsg, // Defines for `CosmosMsg::Custom` in response. Barely used, so `Empty` can be used. TCustomResponseMsg, > where - TNftMetadataExtension: Cw721State, - TNftMetadataExtensionMsg: Cw721CustomMsg, - TCollectionMetadataExtension: Cw721State, - TCollectionMetadataExtensionMsg: Cw721CustomMsg, + TNftExtension: Cw721State, + TNftExtensionMsg: Cw721CustomMsg, + TCollectionExtension: Cw721State, + TCollectionExtensionMsg: Cw721CustomMsg, { pub parent: Parent< 'a, - TNftMetadataExtension, - TNftMetadataExtensionMsg, - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + TNftExtension, + TNftExtensionMsg, + TCollectionExtension, + TCollectionExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, TCustomResponseMsg, >, /// Instantiate set to false by the minter, then true by creator to freeze collection info @@ -56,25 +70,29 @@ pub struct Sg721Contract< impl< 'a, - TNftMetadataExtension, - TNftMetadataExtensionMsg, - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + TNftExtension, + TNftExtensionMsg, + TCollectionExtension, + TCollectionExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, TCustomResponseMsg, > Default for Sg721Contract< 'a, - TNftMetadataExtension, - TNftMetadataExtensionMsg, - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + TNftExtension, + TNftExtensionMsg, + TCollectionExtension, + TCollectionExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, TCustomResponseMsg, > where - TNftMetadataExtension: Cw721State, - TNftMetadataExtensionMsg: Cw721CustomMsg, - TCollectionMetadataExtension: Cw721State, - TCollectionMetadataExtensionMsg: Cw721CustomMsg, + TNftExtension: Cw721State, + TNftExtensionMsg: Cw721CustomMsg, + TCollectionExtension: Cw721State, + TCollectionExtensionMsg: Cw721CustomMsg, { fn default() -> Self { Sg721Contract { @@ -87,32 +105,38 @@ where impl< 'a, - TNftMetadataExtension, - TNftMetadataExtensionMsg, - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + TNftExtension, + TNftExtensionMsg, + TCollectionExtension, + TCollectionExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, TCustomResponseMsg, > Deref for Sg721Contract< 'a, - TNftMetadataExtension, - TNftMetadataExtensionMsg, - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + TNftExtension, + TNftExtensionMsg, + TCollectionExtension, + TCollectionExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, TCustomResponseMsg, > where - TNftMetadataExtension: Cw721State, - TNftMetadataExtensionMsg: Cw721CustomMsg, - TCollectionMetadataExtension: Cw721State, - TCollectionMetadataExtensionMsg: Cw721CustomMsg, + TNftExtension: Cw721State, + TNftExtensionMsg: Cw721CustomMsg, + TCollectionExtension: Cw721State, + TCollectionExtensionMsg: Cw721CustomMsg, { type Target = Parent< 'a, - TNftMetadataExtension, - TNftMetadataExtensionMsg, - TCollectionMetadataExtension, - TCollectionMetadataExtensionMsg, + TNftExtension, + TNftExtensionMsg, + TCollectionExtension, + TCollectionExtensionMsg, + TExtensionMsg, + TExtensionQueryMsg, TCustomResponseMsg, >; diff --git a/contracts/collections/sg721-base/src/upgrades/mod.rs b/contracts/collections/sg721-base/src/upgrades/mod.rs index 0de018a10..b7733c368 100644 --- a/contracts/collections/sg721-base/src/upgrades/mod.rs +++ b/contracts/collections/sg721-base/src/upgrades/mod.rs @@ -1,3 +1,3 @@ -pub mod v3_0_0_ownable_and_collection_metadata; +pub mod v3_0_0_ownable_and_collection_info; pub mod v3_1_0_royalty_timestamp; pub mod v3_8_0_collection_metadata; diff --git a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_info.rs similarity index 79% rename from contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs rename to contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_info.rs index 9be7ad7a4..15dfb3c7a 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_metadata.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_0_0_ownable_and_collection_info.rs @@ -5,9 +5,9 @@ use crate::{ use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; use cw721::{ - msg::Cw721MigrateMsg, DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, + msg::Cw721MigrateMsg, DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, }; use cw721_base::traits::Cw721Execute; @@ -30,10 +30,12 @@ pub fn upgrade( msg: Cw721MigrateMsg, ) -> Result { let contract = Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::default(); // cw721 migration covers these versions: 0.18. 0.17, 0.16 and 0.15 diff --git a/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs index 01c5b5e57..202ff0c18 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_1_0_royalty_timestamp.rs @@ -2,16 +2,18 @@ use crate::{ContractError, Sg721Contract}; use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; use cw721::{ - DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, - DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, + DefaultOptionalCollectionExtension, DefaultOptionalCollectionExtensionMsg, + DefaultOptionalNftExtension, DefaultOptionalNftExtensionMsg, }; pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result { let contract = Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::default(); // check whether royalty timestamp already exists diff --git a/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs b/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs index 244e0c89b..24426b4ce 100644 --- a/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs +++ b/contracts/collections/sg721-base/src/upgrades/v3_8_0_collection_metadata.rs @@ -1,56 +1,57 @@ use crate::{ContractError, Sg721Contract}; use cosmwasm_std::{DepsMut, Empty, Env, Event, Response}; -use cw721::execute::update_collection_metadata; -use cw721::msg::CollectionMetadataMsg; +use cw721::execute::update_collection_info; +use cw721::msg::CollectionInfoMsg; use cw721::{ - msg::CollectionMetadataExtensionMsg, traits::Cw721Query, - DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, - DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, RoyaltyInfo, + msg::CollectionExtensionMsg, traits::Cw721Query, DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, RoyaltyInfo, }; use cw_storage_plus::Item; #[allow(deprecated)] use sg721::{CollectionInfo, RoyaltyInfoResponse}; -/// Migrates collection info (sg721) into new collection metadata extension (cw721) +/// Migrates collection info (sg721) into new collection extension (cw721) #[allow(deprecated)] pub fn upgrade(deps: DepsMut, env: &Env, response: Response) -> Result { let contract = Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::default(); let event = Event::new("migrate-3.1.0"); // migrate only in case collection metadata is not set let collection_metadata = contract .parent - .query_collection_metadata_and_extension(deps.as_ref())?; + .query_collection_info_and_extension(deps.as_ref())?; let event = match collection_metadata.extension.clone() { Some(_) => event, None => { let legacy_collection_info_store: Item> = Item::new("collection_info"); let legacy_collection_info = legacy_collection_info_store.load(deps.storage)?; - let collection_metadata_extension_msg = - CollectionMetadataExtensionMsg:: { - description: Some(legacy_collection_info.description), - explicit_content: legacy_collection_info.explicit_content, - external_link: legacy_collection_info.external_link, - image: Some(legacy_collection_info.image), - start_trading_time: legacy_collection_info.start_trading_time, - royalty_info: legacy_collection_info.royalty_info.map(|r| r.into()), - }; - let collection_metadata_msg = CollectionMetadataMsg { + let collection_metadata_extension_msg = CollectionExtensionMsg:: { + description: Some(legacy_collection_info.description), + explicit_content: legacy_collection_info.explicit_content, + external_link: legacy_collection_info.external_link, + image: Some(legacy_collection_info.image), + start_trading_time: legacy_collection_info.start_trading_time, + royalty_info: legacy_collection_info.royalty_info.map(|r| r.into()), + }; + let collection_metadata_msg = CollectionInfoMsg { name: Some(collection_metadata.name), symbol: Some(collection_metadata.symbol), extension: Some(collection_metadata_extension_msg.clone()), }; - update_collection_metadata::< - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + update_collection_info::< + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, Empty, >(deps, None, env.into(), collection_metadata_msg)?; event diff --git a/contracts/collections/sg721-nt/examples/schema.rs b/contracts/collections/sg721-nt/examples/schema.rs index 957215b55..d90796dd6 100644 --- a/contracts/collections/sg721-nt/examples/schema.rs +++ b/contracts/collections/sg721-nt/examples/schema.rs @@ -3,15 +3,14 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; -use cw721::{ - CollectionMetadataAndExtension, DefaultOptionCollectionMetadataExtension, - DefaultOptionNftMetadataExtension, -}; +use cosmwasm_std::Empty; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; #[allow(deprecated)] use cw721_base::{ msg::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, Cw721QueryMsg, MinterResponse, - NftInfoResponse, NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, + CollectionInfoAndExtensionResponse, Cw721QueryMsg, MinterResponse, NftInfoResponse, + NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, }, ContractInfoResponse, }; @@ -26,15 +25,12 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema( &schema_for!( - Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, - > + Cw721QueryMsg:: ), &out_dir, ); export_schema_with_title( - &schema_for!(AllNftInfoResponse), + &schema_for!(AllNftInfoResponse), &out_dir, "AllNftInfoResponse", ); @@ -51,11 +47,11 @@ fn main() { #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadataAndExtension), + &schema_for!(CollectionInfoAndExtensionResponse), &out_dir, ); export_schema_with_title( - &schema_for!(NftInfoResponse), + &schema_for!(NftInfoResponse), &out_dir, "NftInfoResponse", ); diff --git a/contracts/collections/sg721-nt/src/lib.rs b/contracts/collections/sg721-nt/src/lib.rs index 28a136bff..652d5375f 100644 --- a/contracts/collections/sg721-nt/src/lib.rs +++ b/contracts/collections/sg721-nt/src/lib.rs @@ -4,21 +4,24 @@ use cosmwasm_std::entry_point; pub mod msg; use cosmwasm_std::Empty; use cw721::{ - DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, - DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, + DefaultOptionalCollectionExtension, DefaultOptionalCollectionExtensionMsg, + DefaultOptionalNftExtension, DefaultOptionalNftExtensionMsg, }; use sg721::InstantiateMsg; use sg721_base::Sg721Contract; pub type QueryMsg = sg721_base::msg::QueryMsg< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >; pub type Sg721NonTransferableContract<'a> = Sg721Contract< 'a, - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >; use sg721_base::msg::NftParams; @@ -61,7 +64,7 @@ pub mod entry { deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg, ) -> Result { match msg { ExecuteMsg::Burn { token_id } => Sg721NonTransferableContract::default() @@ -126,10 +129,12 @@ pub mod entry { // perform the upgrade // cw721 migration allows all versions: 0.18. 0.17, 0.16 and older let contract = Sg721Contract::< - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >::default(); let migrate_msg = Cw721MigrateMsg::WithUpdate { diff --git a/contracts/collections/sg721-updatable/examples/schema.rs b/contracts/collections/sg721-updatable/examples/schema.rs index 3608f9dad..d1b8a619a 100644 --- a/contracts/collections/sg721-updatable/examples/schema.rs +++ b/contracts/collections/sg721-updatable/examples/schema.rs @@ -3,15 +3,14 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; -use cw721::{ - CollectionMetadataAndExtension, CollectionMetadataExtensionWrapper, - DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension, RoyaltyInfo, -}; +use cosmwasm_std::Empty; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; #[allow(deprecated)] pub use cw721_base::{ msg::{ - AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, MinterResponse, NftInfoResponse, - NumTokensResponse, OperatorsResponse, OwnerOfResponse, TokensResponse, + AllNftInfoResponse, ApprovalResponse, ApprovalsResponse, + CollectionInfoAndExtensionResponse, MinterResponse, NftInfoResponse, NumTokensResponse, + OperatorsResponse, OwnerOfResponse, TokensResponse, }, ContractInfoResponse, }; @@ -29,25 +28,23 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema( - &schema_for!(ExecuteMsg), + &schema_for!(ExecuteMsg), &out_dir, ); export_schema( &schema_for!( - QueryMsg:: + QueryMsg:: ), &out_dir, ); #[allow(deprecated)] export_schema(&schema_for!(CollectionInfoResponse), &out_dir); export_schema( - &schema_for!( - CollectionMetadataAndExtension> - ), + &schema_for!(CollectionInfoAndExtensionResponse), &out_dir, ); export_schema_with_title( - &schema_for!(AllNftInfoResponse), + &schema_for!(AllNftInfoResponse), &out_dir, "AllNftInfoResponse", ); @@ -63,11 +60,11 @@ fn main() { #[allow(deprecated)] export_schema(&schema_for!(ContractInfoResponse), &out_dir); export_schema( - &schema_for!(CollectionMetadataAndExtension), + &schema_for!(CollectionInfoAndExtensionResponse), &out_dir, ); export_schema_with_title( - &schema_for!(NftInfoResponse), + &schema_for!(NftInfoResponse), &out_dir, "NftInfoResponse", ); diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index 0914222a4..88dfcd3e1 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -9,8 +9,8 @@ use cosmwasm_std::{DepsMut, Env, Event, MessageInfo}; use cw2::set_contract_version; use cw721::msg::Cw721MigrateMsg; use cw721::{ - DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, - DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, + DefaultOptionalCollectionExtension, DefaultOptionalCollectionExtensionMsg, + DefaultOptionalNftExtension, DefaultOptionalNftExtensionMsg, }; use semver::Version; use sg721::InstantiateMsg; @@ -26,10 +26,12 @@ use sg721_base::ContractError::Unauthorized; use sg721_base::Sg721Contract; pub type Sg721UpdatableContract<'a> = Sg721Contract< 'a, - DefaultOptionNftMetadataExtension, - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtension, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, + Empty, + Empty, Empty, >; @@ -222,7 +224,7 @@ pub fn _migrate( let mut response = Response::new(); // these upgrades can always be called. migration is only executed in case new stores are empty! It is safe calling these on any version. - response = sg721_base::upgrades::v3_0_0_ownable_and_collection_metadata::upgrade( + response = sg721_base::upgrades::v3_0_0_ownable_and_collection_info::upgrade( deps.branch(), &env, response, @@ -374,14 +376,14 @@ mod tests { // Check token contains updated metadata let res = contract .parent - .query_nft_info(deps.as_ref(), &env, token_id.into()) + .query_nft_info(deps.as_ref().storage, token_id.into()) .unwrap(); assert_eq!(res.token_uri, updated_token_uri); // Update token metadata with None token_uri let update_msg = ExecuteMsg::< - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtensionMsg, >::UpdateTokenMetadata { token_id: token_id.to_string(), token_uri: None, @@ -389,7 +391,7 @@ mod tests { execute(deps.as_mut(), mock_env(), info.clone(), update_msg).unwrap(); let res = contract .parent - .query_nft_info(deps.as_ref(), &env, token_id.into()) + .query_nft_info(deps.as_ref().storage, token_id.into()) .unwrap(); assert_eq!(res.token_uri, None); diff --git a/contracts/collections/sg721-updatable/src/lib.rs b/contracts/collections/sg721-updatable/src/lib.rs index f621954a2..7a41b0610 100644 --- a/contracts/collections/sg721-updatable/src/lib.rs +++ b/contracts/collections/sg721-updatable/src/lib.rs @@ -21,9 +21,7 @@ pub mod entry { use cosmwasm_std::{entry_point, to_json_binary}; use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response}; use cw721::msg::Cw721MigrateMsg; - use cw721::{ - DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, - }; + use cw721::{DefaultOptionalCollectionExtensionMsg, DefaultOptionalNftExtensionMsg}; #[entry_point] pub fn instantiate( @@ -40,10 +38,7 @@ pub mod entry { deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg< - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtensionMsg, - >, + msg: ExecuteMsg, ) -> Result { match msg { ExecuteMsg::FreezeTokenMetadata {} => execute_freeze_token_metadata(deps, env, info), diff --git a/contracts/collections/sg721-updatable/src/msg.rs b/contracts/collections/sg721-updatable/src/msg.rs index 4cdd17555..77c5c5182 100644 --- a/contracts/collections/sg721-updatable/src/msg.rs +++ b/contracts/collections/sg721-updatable/src/msg.rs @@ -1,9 +1,10 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::Binary; +use cosmwasm_std::Empty; use cosmwasm_std::Timestamp; -use cw721::DefaultOptionCollectionMetadataExtension; -use cw721::DefaultOptionNftMetadataExtension; -use cw721::DefaultOptionNftMetadataExtensionMsg; +use cw721::DefaultOptionalCollectionExtension; +use cw721::DefaultOptionalNftExtension; +use cw721::DefaultOptionalNftExtensionMsg; use cw_utils::Expiration; #[allow(deprecated)] use sg721::{RoyaltyInfoResponse, UpdateCollectionInfoMsg}; @@ -11,7 +12,7 @@ use sg721_base::msg::QueryMsg as Sg721QueryMsg; use sg721_base::ExecuteMsg as Sg721ExecuteMsg; #[cw_serde] -pub enum ExecuteMsg { +pub enum ExecuteMsg { /// Freeze token metadata so creator can no longer update token uris FreezeTokenMetadata {}, /// Creator calls can update token uris @@ -67,21 +68,19 @@ pub enum ExecuteMsg { /// Metadata JSON Schema token_uri: Option, /// Any custom extension used by this contract - extension: TNftMetadataExtensionMsg, + extension: TNftExtensionMsg, }, Extension { - msg: TCollectionMetadataExtensionMsg, + msg: TCollectionExtensionMsg, }, } -impl - From> for Sg721ExecuteMsg +impl + From> for Sg721ExecuteMsg where - TNftMetadataExtensionMsg: Clone + PartialEq + Into, + TNftExtensionMsg: Clone + PartialEq + Into, { - fn from( - msg: ExecuteMsg, - ) -> Sg721ExecuteMsg { + fn from(msg: ExecuteMsg) -> Sg721ExecuteMsg { match msg { ExecuteMsg::TransferNft { recipient, @@ -188,12 +187,11 @@ pub enum QueryMsg { } impl From - for Sg721QueryMsg + for Sg721QueryMsg { fn from( msg: QueryMsg, - ) -> Sg721QueryMsg - { + ) -> Sg721QueryMsg { match msg { QueryMsg::OwnerOf { token_id, diff --git a/contracts/minters/base-minter/src/contract.rs b/contracts/minters/base-minter/src/contract.rs index e50862a03..1da6cd321 100644 --- a/contracts/minters/base-minter/src/contract.rs +++ b/contracts/minters/base-minter/src/contract.rs @@ -10,8 +10,8 @@ use cosmwasm_std::{ }; use cw2::set_contract_version; use cw721::{ - DefaultOptionCollectionMetadataExtension, DefaultOptionCollectionMetadataExtensionMsg, - DefaultOptionNftMetadataExtension, DefaultOptionNftMetadataExtensionMsg, + DefaultOptionalCollectionExtension, DefaultOptionalCollectionExtensionMsg, + DefaultOptionalNftExtension, DefaultOptionalNftExtensionMsg, }; use cw_utils::{must_pay, nonpayable, parse_reply_instantiate_data}; use sg1::checked_fair_burn; @@ -128,8 +128,9 @@ pub fn execute_mint_sender( let collection_info: CollectionInfoResponse = deps.querier.query_wasm_smart( collection_address.clone(), &Sg721QueryMsg::CollectionInfo::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, > {}, )?; // allow only sg721 creator address to mint @@ -162,8 +163,9 @@ pub fn execute_mint_sender( // Create mint msgs let mint_msg = Sg721ExecuteMsg::< - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtensionMsg, + Empty, >::Mint { token_id: increment_token_index(deps.storage)?.to_string(), owner: info.sender.to_string(), @@ -194,13 +196,15 @@ pub fn execute_update_start_trading_time( nonpayable(&info)?; let sg721_contract_addr = COLLECTION_ADDRESS.load(deps.storage)?; - let collection_info: CollectionInfoResponse = deps.querier.query_wasm_smart( - sg721_contract_addr.clone(), - &Sg721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, - >::CollectionInfo {}, - )?; + let collection_info: CollectionInfoResponse = + deps.querier.query_wasm_smart( + sg721_contract_addr.clone(), + &Sg721QueryMsg::< + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, + >::CollectionInfo {}, + )?; if info.sender != collection_info.creator { return Err(ContractError::Unauthorized( "Sender is not creator".to_owned(), @@ -221,8 +225,9 @@ pub fn execute_update_start_trading_time( let msg = WasmMsg::Execute { contract_addr: sg721_contract_addr.to_string(), msg: to_json_binary(&Sg721ExecuteMsg::< - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtensionMsg, + Empty, >::UpdateStartTradingTime(start_time))?, funds: vec![], }; diff --git a/contracts/minters/open-edition-minter/src/contract.rs b/contracts/minters/open-edition-minter/src/contract.rs index ad54b8786..5d6e01202 100644 --- a/contracts/minters/open-edition-minter/src/contract.rs +++ b/contracts/minters/open-edition-minter/src/contract.rs @@ -15,9 +15,7 @@ use cosmwasm_std::{ MessageInfo, Order, Reply, ReplyOn, Response, StdError, StdResult, SubMsg, Timestamp, WasmMsg, }; use cw2::set_contract_version; -use cw721_base::{ - DefaultOptionCollectionMetadataExtensionMsg, DefaultOptionNftMetadataExtensionMsg, -}; +use cw721_base::{DefaultOptionalCollectionExtensionMsg, DefaultOptionalNftExtensionMsg}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use open_edition_factory::msg::{OpenEditionMinterCreateMsg, ParamsResponse}; use open_edition_factory::types::NftMetadataType; @@ -604,8 +602,9 @@ pub fn execute_update_start_trading_time( let msg = WasmMsg::Execute { contract_addr: sg721_contract_addr.to_string(), msg: to_json_binary(&Sg721ExecuteMsg::< - DefaultOptionNftMetadataExtensionMsg, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalNftExtensionMsg, + DefaultOptionalCollectionExtensionMsg, + Empty, >::UpdateStartTradingTime(start_time))?, funds: vec![], }; diff --git a/contracts/minters/open-edition-minter/src/helpers.rs b/contracts/minters/open-edition-minter/src/helpers.rs index 302bf084d..b2f5eb131 100644 --- a/contracts/minters/open-edition-minter/src/helpers.rs +++ b/contracts/minters/open-edition-minter/src/helpers.rs @@ -3,7 +3,7 @@ use cosmwasm_std::{ to_json_binary, Addr, Coin, ContractInfoResponse, CosmosMsg, CustomQuery, Empty, Querier, QuerierWrapper, StdError, StdResult, WasmMsg, WasmQuery, }; -use cw721_base::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721_base::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use sg721::ExecuteMsg as Sg721ExecuteMsg; use sg_metadata::Metadata; @@ -73,7 +73,7 @@ pub fn mint_nft_msg( let mint_msg = if let Some(extension) = extension { CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: sg721_address.to_string(), - msg: to_json_binary(&Sg721ExecuteMsg::::Mint { + msg: to_json_binary(&Sg721ExecuteMsg::::Mint { token_id, owner: recipient_addr.to_string(), token_uri: None, @@ -85,8 +85,9 @@ pub fn mint_nft_msg( CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: sg721_address.to_string(), msg: to_json_binary(&Sg721ExecuteMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Mint { token_id, owner: recipient_addr.to_string(), diff --git a/contracts/minters/vending-minter-merkle-wl/src/contract.rs b/contracts/minters/vending-minter-merkle-wl/src/contract.rs index 8758da350..c0864d2a2 100644 --- a/contracts/minters/vending-minter-merkle-wl/src/contract.rs +++ b/contracts/minters/vending-minter-merkle-wl/src/contract.rs @@ -16,7 +16,7 @@ use cosmwasm_std::{ Timestamp, Uint128, WasmMsg, }; use cw2::set_contract_version; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use rand_core::{RngCore, SeedableRng}; use rand_xoshiro::Xoshiro128PlusPlus; @@ -705,8 +705,9 @@ fn _execute_mint( // Create mint msgs let mint_msg = Sg721ExecuteMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Mint { token_id: mintable_token_mapping.token_id.to_string(), owner: recipient_addr.to_string(), @@ -951,9 +952,9 @@ pub fn execute_update_start_trading_time( // execute sg721 contract let msg = WasmMsg::Execute { contract_addr: sg721_contract_addr.to_string(), - msg: to_json_binary(&Sg721ExecuteMsg::::UpdateStartTradingTime( - start_time, - ))?, + msg: to_json_binary( + &Sg721ExecuteMsg::::UpdateStartTradingTime(start_time), + )?, funds: vec![], }; diff --git a/contracts/minters/vending-minter-wl-flex/src/contract.rs b/contracts/minters/vending-minter-wl-flex/src/contract.rs index b6ab4cd73..abce21ed4 100644 --- a/contracts/minters/vending-minter-wl-flex/src/contract.rs +++ b/contracts/minters/vending-minter-wl-flex/src/contract.rs @@ -15,7 +15,7 @@ use cosmwasm_std::{ Timestamp, Uint128, WasmMsg, }; use cw2::set_contract_version; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use rand_core::{RngCore, SeedableRng}; use rand_xoshiro::Xoshiro128PlusPlus; @@ -675,8 +675,9 @@ fn _execute_mint( // Create mint msgs let mint_msg = Sg721ExecuteMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Mint { token_id: mintable_token_mapping.token_id.to_string(), owner: recipient_addr.to_string(), @@ -927,9 +928,9 @@ pub fn execute_update_start_trading_time( // execute sg721 contract let msg = WasmMsg::Execute { contract_addr: sg721_contract_addr.to_string(), - msg: to_json_binary(&Sg721ExecuteMsg::::UpdateStartTradingTime( - start_time, - ))?, + msg: to_json_binary( + &Sg721ExecuteMsg::::UpdateStartTradingTime(start_time), + )?, funds: vec![], }; diff --git a/contracts/minters/vending-minter/src/contract.rs b/contracts/minters/vending-minter/src/contract.rs index 60c70384b..baa212a48 100644 --- a/contracts/minters/vending-minter/src/contract.rs +++ b/contracts/minters/vending-minter/src/contract.rs @@ -16,7 +16,7 @@ use cosmwasm_std::{ Timestamp, Uint128, WasmMsg, }; use cw2::set_contract_version; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw_utils::{may_pay, maybe_addr, nonpayable, parse_reply_instantiate_data}; use rand_core::{RngCore, SeedableRng}; use rand_xoshiro::Xoshiro128PlusPlus; @@ -682,8 +682,9 @@ fn _execute_mint( // Create mint msgs let mint_msg = Sg721ExecuteMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Mint { token_id: mintable_token_mapping.token_id.to_string(), owner: recipient_addr.to_string(), @@ -928,9 +929,9 @@ pub fn execute_update_start_trading_time( // execute sg721 contract let msg = WasmMsg::Execute { contract_addr: sg721_contract_addr.to_string(), - msg: to_json_binary(&Sg721ExecuteMsg::::UpdateStartTradingTime( - start_time, - ))?, + msg: to_json_binary( + &Sg721ExecuteMsg::::UpdateStartTradingTime(start_time), + )?, funds: vec![], }; diff --git a/packages/sg2/src/tests.rs b/packages/sg2/src/tests.rs index b730eb07b..4fbc0de4c 100644 --- a/packages/sg2/src/tests.rs +++ b/packages/sg2/src/tests.rs @@ -25,7 +25,7 @@ pub fn mock_collection_params() -> CollectionParams { } } -/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) #[allow(deprecated)] pub fn mock_collection_params_v3_8_0_prerelease() -> sg2_v3_8_0_prerelease::msg::CollectionParams { sg2_v3_8_0_prerelease::msg::CollectionParams { diff --git a/packages/sg721/src/lib.rs b/packages/sg721/src/lib.rs index cf47625d8..7df788019 100644 --- a/packages/sg721/src/lib.rs +++ b/packages/sg721/src/lib.rs @@ -2,10 +2,10 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{Binary, Coin, Timestamp}; use cw721_base::{ msg::{ - CollectionMetadataExtensionMsg, CollectionMetadataMsg, ExecuteMsg as Cw721ExecuteMsg, + CollectionExtensionMsg, CollectionInfoMsg, ExecuteMsg as Cw721ExecuteMsg, InstantiateMsg as Cw721InstantiateMsg, }, - DefaultOptionCollectionMetadataExtensionMsg, + DefaultOptionalCollectionExtensionMsg, }; use cw_ownable::Action; use cw_utils::Expiration; @@ -15,10 +15,12 @@ pub use cw721_base::state::RoyaltyInfo; #[cw_serde] pub enum ExecuteMsg< - // Message passed for updating metadata. - TNftMetadataExtensionMsg, - // Message passed for updating collection info extension. - TCollectionMetadataExtensionMsg, + // NftInfo extension msg for onchain metadata. + TNftExtensionMsg, + // CollectionInfo extension msg for onchain collection attributes. + TCollectionExtensionMsg, + // Custom extension msg for custom contract logic. Default implementation is a no-op. + TExtensionMsg, > { // ---- sg721 specific msgs ---- /// Update specific collection info fields @@ -39,9 +41,9 @@ pub enum ExecuteMsg< UpdateMinterOwnership(Action), UpdateCreatorOwnership(Action), - /// The creator is the only one eligible to update `CollectionMetadata`. - UpdateCollectionMetadata { - collection_metadata: CollectionMetadataMsg, + /// The creator is the only one eligible to update `CollectionInfo`. + Cw721UpdateCollectionInfo { + collection_info: CollectionInfoMsg, }, /// Transfer is a base message to move a token to another account without triggering actions TransferNft { @@ -89,7 +91,7 @@ pub enum ExecuteMsg< /// Metadata JSON Schema token_uri: Option, /// Any custom extension used by this contract - extension: TNftMetadataExtensionMsg, + extension: TNftExtensionMsg, }, /// Burn an NFT the sender has access to @@ -97,18 +99,17 @@ pub enum ExecuteMsg< token_id: String, }, - /// Metadata msg - #[deprecated(since = "0.19.0", note = "Please use UpdateNftMetadata instead")] - /// Deprecated: use UpdateNftMetadata instead! In previous release it was a no-op for customization in other contracts. Will be removed in next release! + /// Custom msg execution. This is a no-op in default implementation. Extension { - msg: TNftMetadataExtensionMsg, + msg: TExtensionMsg, }, + /// The creator is the only one eligible to update NFT's token uri and onchain metadata (`NftInfo.extension`). /// NOTE: approvals and owner are not affected by this call, since they belong to the NFT owner. UpdateNftInfo { token_id: String, token_uri: Option, - extension: TNftMetadataExtensionMsg, + extension: TNftExtensionMsg, }, /// Sets address to send withdrawn fees to. Only owner can call this. @@ -124,12 +125,12 @@ pub enum ExecuteMsg< }, } -impl - From> - for Cw721ExecuteMsg +impl + From> + for Cw721ExecuteMsg { #[allow(deprecated)] - fn from(msg: ExecuteMsg) -> Self { + fn from(msg: ExecuteMsg) -> Self { match msg { // ---- sg721 msgs ---- ExecuteMsg::UpdateCollectionInfo { collection_info: _ } => { @@ -145,11 +146,9 @@ impl ExecuteMsg::UpdateCreatorOwnership(action) => { Cw721ExecuteMsg::UpdateCreatorOwnership(action) } - ExecuteMsg::UpdateCollectionMetadata { - collection_metadata, - } => Cw721ExecuteMsg::UpdateCollectionMetadata { - collection_metadata, - }, + ExecuteMsg::Cw721UpdateCollectionInfo { collection_info } => { + Cw721ExecuteMsg::UpdateCollectionInfo { collection_info } + } ExecuteMsg::TransferNft { recipient, token_id, @@ -214,7 +213,7 @@ impl } #[cw_serde] -#[deprecated = "Please use CollectionMetadata instead"] +#[deprecated = "Please use CollectionInfo instead"] pub struct CollectionInfo { pub creator: String, pub description: String, @@ -226,9 +225,9 @@ pub struct CollectionInfo { } #[allow(deprecated)] -impl From> for DefaultOptionCollectionMetadataExtensionMsg { +impl From> for DefaultOptionalCollectionExtensionMsg { fn from(info: CollectionInfo) -> Self { - Some(CollectionMetadataExtensionMsg { + Some(CollectionExtensionMsg { description: Some(info.description), image: Some(info.image), external_link: info.external_link, @@ -240,7 +239,7 @@ impl From> for DefaultOptionCollectionMetada } #[cw_serde] -#[deprecated = "Please use `UpdateCollectionMetadata` instead"] +#[deprecated = "Please use `UpdateCollectionInfo` instead"] pub struct UpdateCollectionInfoMsg { pub description: Option, pub image: Option, @@ -253,10 +252,10 @@ pub struct UpdateCollectionInfoMsg { #[allow(deprecated)] impl From> - for CollectionMetadataExtensionMsg + for CollectionExtensionMsg { fn from(msg: UpdateCollectionInfoMsg) -> Self { - CollectionMetadataExtensionMsg { + CollectionExtensionMsg { description: msg.description, image: msg.image, external_link: msg.external_link.unwrap_or_default(), @@ -277,14 +276,14 @@ pub struct InstantiateMsg { } #[allow(deprecated)] -impl From for Cw721InstantiateMsg { +impl From for Cw721InstantiateMsg { fn from(msg: InstantiateMsg) -> Self { Cw721InstantiateMsg { name: msg.name, symbol: msg.symbol, minter: Some(msg.minter), creator: Some(msg.collection_info.creator.clone()), - collection_metadata_extension: msg.collection_info.into(), + collection_info_extension: msg.collection_info.into(), withdraw_address: None, } } diff --git a/test-suite/src/base_minter/tests/integration_tests.rs b/test-suite/src/base_minter/tests/integration_tests.rs index 1fe6e2c99..18060bb4c 100644 --- a/test-suite/src/base_minter/tests/integration_tests.rs +++ b/test-suite/src/base_minter/tests/integration_tests.rs @@ -8,8 +8,8 @@ use crate::common_setup::templates::{ use base_factory::msg::{BaseMinterCreateMsg, BaseUpdateParamsMsg, SudoMsg}; use base_minter::msg::{ConfigResponse, ExecuteMsg}; -use cosmwasm_std::{coin, coins, Addr, Timestamp}; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cosmwasm_std::{coin, coins, Addr, Empty, Timestamp}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::{Cw721ExecuteMsg, Cw721QueryMsg, OwnerOfResponse}; use cw_multi_test::Executor; use sg2::msg::Sg2ExecuteMsg; @@ -158,8 +158,9 @@ fn check_mint() { assert_eq!(res.config.mint_price.amount.u128(), MIN_MINT_PRICE); let query_owner_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::OwnerOf { token_id: String::from("1"), include_expired: None, @@ -172,8 +173,9 @@ fn check_mint() { // make sure sg721-nt cannot be transferred let transfer_msg = Cw721ExecuteMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::TransferNft { recipient: "adsf".to_string(), token_id: "1".to_string(), @@ -233,8 +235,9 @@ fn update_start_trading_time() { .query_wasm_smart( collection_addr, &Sg721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); diff --git a/test-suite/src/common_setup/contract_boxes.rs b/test-suite/src/common_setup/contract_boxes.rs index f09e4380b..ec193e3f5 100644 --- a/test-suite/src/common_setup/contract_boxes.rs +++ b/test-suite/src/common_setup/contract_boxes.rs @@ -35,7 +35,7 @@ pub fn contract_vending_factory() -> Box> { Box::new(contract) } -/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) pub fn contract_vending_factory_v3_8_0_prerelease() -> Box> { let contract = ContractWrapper::new( vending_factory_v3_8_0_prerelease::contract::execute, @@ -114,7 +114,7 @@ pub fn contract_vending_minter() -> Box> { Box::new(contract) } -/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) pub fn contract_vending_minter_v3_8_0_prerelease() -> Box> { let contract = ContractWrapper::new( vending_minter_v3_8_0_prerelease::contract::execute, @@ -135,7 +135,7 @@ pub fn contract_sg721_base() -> Box> { Box::new(contract) } -/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) pub fn contract_sg721_base_v3_8_0_prerelease() -> Box> { let contract = ContractWrapper::new( sg721_base_v3_8_0_prerelease::entry::execute, diff --git a/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs b/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs index ea650edfa..f52b63b3a 100644 --- a/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs +++ b/test-suite/src/common_setup/setup_minter/vending_minter/mock_params.rs @@ -26,7 +26,7 @@ pub fn mock_init_extension( } } -/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) pub fn mock_init_extension_v3_8_0_prerelease( splits_addr: Option, start_time: Option, @@ -53,7 +53,7 @@ pub fn mock_create_minter( } } -/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) pub fn mock_create_minter_v3_8_0_prerelease( splits_addr: Option, collection_params: sg2_v3_8_0_prerelease::msg::CollectionParams, @@ -97,7 +97,7 @@ pub fn mock_params(mint_denom: Option) -> VendingMinterParams { } } -/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) +/// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) pub fn mock_params_v3_8_0_prerelease( mint_denom: Option, ) -> vending_factory_v3_8_0_prerelease::state::VendingMinterParams { diff --git a/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs b/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs index 29c8976cd..d7b982823 100644 --- a/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs +++ b/test-suite/src/open_edition_minter/tests/complete_mint_all_outcomes_validation.rs @@ -1,5 +1,5 @@ -use cosmwasm_std::{coins, Coin, Timestamp, Uint128}; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cosmwasm_std::{coins, Coin, Empty, Timestamp, Uint128}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::{Cw721QueryMsg, NumTokensResponse, OwnerOfResponse}; use cw_multi_test::{BankSudo, Executor, SudoMsg}; use open_edition_factory::state::ParamsExtension; @@ -211,8 +211,9 @@ fn check_mint_revenues_distribution(num_tokens: Option, end_minter_time: Op // Should be owner of the token -> 2 let query_owner_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::OwnerOf { token_id: String::from("2"), include_expired: None, @@ -226,8 +227,9 @@ fn check_mint_revenues_distribution(num_tokens: Option, end_minter_time: Op // Check mint count let num_tokens_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::NumTokens {}; let res: NumTokensResponse = router .wrap() diff --git a/test-suite/src/sg721_base/tests/integration_tests.rs b/test-suite/src/sg721_base/tests/integration_tests.rs index bd036fba2..4dccd470f 100644 --- a/test-suite/src/sg721_base/tests/integration_tests.rs +++ b/test-suite/src/sg721_base/tests/integration_tests.rs @@ -64,7 +64,7 @@ mod tests { (app, factory_contract) } - /// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) + /// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) fn proper_instantiate_factory_v3_8_0_prerelease() -> ( App, vending_factory_v3_8_0_prerelease::helpers::FactoryContract, @@ -123,7 +123,7 @@ mod tests { (app, Addr::unchecked("contract2")) } - /// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection metadata extension (cw721) + /// `v3.8.0-prerelease` is only used for testing migration from collection info (sg721) to new collection extension (cw721) fn proper_instantiate_v3_8_0_prerelease() -> (App, Addr) { let (mut app, factory_contract) = proper_instantiate_factory_v3_8_0_prerelease(); let sg721_id = app.store_code(contract_sg721_base_v3_8_0_prerelease()); @@ -184,7 +184,7 @@ mod tests { } mod init { - use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; + use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::MinterResponse; use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; @@ -202,8 +202,9 @@ mod tests { .query_wasm_smart( contract, &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::NumTokens {}, ) .unwrap(); @@ -262,8 +263,9 @@ mod tests { .query_wasm_smart( contract, &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Minter {}, ) .unwrap(); @@ -295,8 +297,9 @@ mod tests { .query_wasm_smart( contract, &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Minter {}, ) .unwrap(); @@ -322,8 +325,9 @@ mod tests { .query_wasm_smart( contract, &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Minter {}, ) .unwrap(); @@ -338,7 +342,7 @@ mod tests { mod start_trading_time { use cosmwasm_std::{Decimal, Empty}; - use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; + use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use sg721::{RoyaltyInfoResponse, UpdateCollectionInfoMsg}; use crate::common_setup::{ @@ -369,7 +373,7 @@ mod tests { let res = app.execute_contract( creator, contract, - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: None, @@ -399,8 +403,9 @@ mod tests { .query_wasm_smart( contract, &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -418,7 +423,7 @@ mod tests { let res = app.execute_contract( creator.clone(), contract.clone(), - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: Some(params.info.description.clone()), @@ -440,7 +445,7 @@ mod tests { let res = app.execute_contract( creator.clone(), contract.clone(), - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: Some(params.info.description.clone()), @@ -474,7 +479,7 @@ mod tests { let res = app.execute_contract( creator.clone(), contract.clone(), - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: Some(params.info.description.clone()), @@ -502,7 +507,7 @@ mod tests { let res = app.execute_contract( creator.clone(), contract.clone(), - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: Some(params.info.description.clone()), @@ -530,7 +535,7 @@ mod tests { let res = app.execute_contract( creator.clone(), contract.clone(), - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: Some(params.info.description.clone()), @@ -549,8 +554,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -561,7 +567,7 @@ mod tests { let res = app.execute_contract( other.clone(), contract.clone(), - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: Some(params.info.description.clone()), @@ -579,7 +585,7 @@ mod tests { let res = app.execute_contract( creator.clone(), contract.clone(), - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: Some(other.to_string()), // other is ignored description: Some(params.info.description.clone()), @@ -598,8 +604,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -611,8 +618,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::GetCreatorOwnership {}, ) .unwrap(); @@ -622,7 +630,7 @@ mod tests { let res = app.execute_contract( Addr::unchecked("badguy"), contract.clone(), - &Sg721ExecuteMsg::::FreezeCollectionInfo {}, + &Sg721ExecuteMsg::::FreezeCollectionInfo {}, &[], ); assert!(res.is_err()); @@ -630,7 +638,7 @@ mod tests { let res = app.execute_contract( creator.clone(), contract.clone(), - &Sg721ExecuteMsg::::FreezeCollectionInfo {}, + &Sg721ExecuteMsg::::FreezeCollectionInfo {}, &[], ); assert!(res.is_ok()); @@ -639,7 +647,7 @@ mod tests { let res = app.execute_contract( creator, contract, - &Sg721ExecuteMsg::::UpdateCollectionInfo { + &Sg721ExecuteMsg::::UpdateCollectionInfo { collection_info: UpdateCollectionInfoMsg { creator: None, description: Some(params.info.description.clone()), @@ -661,8 +669,8 @@ mod tests { use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; use cosmwasm_std::{Decimal, Response, Uint128}; use cw721::{ - state::MAX_ROYALTY_SHARE_PCT, DefaultOptionCollectionMetadataExtension, - DefaultOptionNftMetadataExtension, + state::MAX_ROYALTY_SHARE_PCT, DefaultOptionalCollectionExtension, + DefaultOptionalNftExtension, }; use sg2::msg::CollectionParams; use sg721::RoyaltyInfoResponse; @@ -677,8 +685,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -725,8 +734,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -772,8 +782,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -819,8 +830,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -864,8 +876,9 @@ mod tests { .query_wasm_smart( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); @@ -887,7 +900,7 @@ mod tests { mod ownership { use cosmwasm_std::Attribute; - use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; + use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::MinterResponse; use crate::common_setup::setup_minter::vending_minter::mock_params::mock_create_minter_init_msg; @@ -913,8 +926,9 @@ mod tests { .query_wasm_smart( contract, &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Minter {}, ) .unwrap(); @@ -926,7 +940,7 @@ mod tests { .unwrap(); let sg721_address = res.sg721_address; - let update_ownership_msg: cw721ExecuteMsg = + let update_ownership_msg: cw721ExecuteMsg = cw721ExecuteMsg::UpdateMinterOwnership(cw_ownable::Action::TransferOwnership { new_owner: "new_owner".to_string(), expiry: None, @@ -955,8 +969,9 @@ mod tests { .query_wasm_smart( sg721_address.clone(), &sg721_base::msg::QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::GetMinterOwnership {}, ) .unwrap(); @@ -964,7 +979,7 @@ mod tests { let expected_pending_owner = Some(Addr::unchecked("new_owner".to_string())); assert_eq!(pending_owner, expected_pending_owner); - let accept_ownership_msg: cw721ExecuteMsg = + let accept_ownership_msg: cw721ExecuteMsg = cw721ExecuteMsg::UpdateOwnership(cw_ownable::Action::AcceptOwnership {}); let res = app.execute_contract( Addr::unchecked("new_owner".to_string()), @@ -993,8 +1008,9 @@ mod tests { .query_wasm_smart( sg721_address, &sg721_base::msg::QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::GetMinterOwnership {}, ) .unwrap(); @@ -1074,9 +1090,10 @@ mod tests { use super::*; use cosmwasm_std::testing::mock_env; use cw721::{ - msg::Cw721MigrateMsg, state::CollectionMetadataAndExtension, - CollectionMetadataExtensionWrapper, DefaultOptionCollectionMetadataExtension, - DefaultOptionNftMetadataExtension, RoyaltyInfo, + msg::{ + CollectionExtensionResponse, CollectionInfoAndExtensionResponse, Cw721MigrateMsg, + }, + DefaultOptionalCollectionExtension, DefaultOptionalNftExtension, RoyaltyInfo, }; use sg721_base::msg::QueryMsg; @@ -1091,16 +1108,17 @@ mod tests { &sg721_base_v3_8_0_prerelease::msg::QueryMsg::CollectionInfo {}, ) .unwrap(); - // throws a generic error, for unknown GetCollectionMetadata query + // throws a generic error, for unknown GetCollectionInfo query app.wrap() - .query_wasm_smart::>( + .query_wasm_smart::>( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, - >::GetCollectionMetadata {}, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, + >::GetCollectionInfoAndExtension {}, ) - .expect_err("expecting generic error, for unknown GetCollectionMetadata query"); + .expect_err("expecting generic error, for unknown GetCollectionInfo query"); // migrate let sg721_id = app.store_code(contract_sg721_base()); @@ -1114,22 +1132,23 @@ mod tests { // assert collection metadata let collection_metadata = app .wrap() - .query_wasm_smart::>( + .query_wasm_smart::>( contract.clone(), &QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, - >::GetCollectionMetadata {}, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, + >::GetCollectionInfoAndExtension { }, ) .unwrap(); let env = mock_env(); assert_eq!( collection_metadata, - CollectionMetadataAndExtension:: { + CollectionInfoAndExtensionResponse:: { name: "Collection Name".to_string(), symbol: "COL".to_string(), updated_at: env.block.time, - extension: Some(CollectionMetadataExtensionWrapper:: { + extension: Some(CollectionExtensionResponse:: { description: legacy_collection_info.description, image: legacy_collection_info.image, external_link: legacy_collection_info.external_link, diff --git a/test-suite/src/vending_minter/tests/address_limit.rs b/test-suite/src/vending_minter/tests/address_limit.rs index 628c90de7..b5e4ecd9a 100644 --- a/test-suite/src/vending_minter/tests/address_limit.rs +++ b/test-suite/src/vending_minter/tests/address_limit.rs @@ -10,8 +10,8 @@ use crate::common_setup::{ setup_accounts_and_block::{coins_for_msg, setup_block_time}, templates::vending_minter_template, }; -use cosmwasm_std::{coin, coins, Coin, Timestamp, Uint128}; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cosmwasm_std::{coin, coins, Coin, Empty, Timestamp, Uint128}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::{Cw721QueryMsg, OwnerOfResponse, TokensResponse}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; @@ -350,8 +350,9 @@ fn mint_for_token_id_addr() { // get random mint token_id let tokens_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Tokens { owner: buyer.to_string(), start_after: None, @@ -465,8 +466,9 @@ fn mint_for_token_id_addr() { .query_wasm_smart( collection_addr, &Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::OwnerOf { token_id: 2.to_string(), include_expired: None, diff --git a/test-suite/src/vending_minter/tests/happy_unhappy.rs b/test-suite/src/vending_minter/tests/happy_unhappy.rs index 93c373507..92375853b 100644 --- a/test-suite/src/vending_minter/tests/happy_unhappy.rs +++ b/test-suite/src/vending_minter/tests/happy_unhappy.rs @@ -3,12 +3,13 @@ use crate::common_setup::templates::vending_minter_template; use crate::common_setup::{ setup_accounts_and_block::coins_for_msg, setup_accounts_and_block::setup_block_time, }; +use cosmwasm_std::Empty; use cosmwasm_std::{ coin, coins, testing::{mock_dependencies_with_balance, mock_env, mock_info}, Api, Coin, Timestamp, Uint128, }; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::{Cw721QueryMsg, OwnerOfResponse}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; @@ -152,8 +153,9 @@ fn happy_path() { // Check NFT owned by buyer // Random mint token_id 1 let query_owner_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::OwnerOf { token_id: String::from("2"), include_expired: None, @@ -214,8 +216,9 @@ fn happy_path() { // Check that NFT is transferred let query_owner_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::OwnerOf { token_id: String::from("1"), include_expired: None, diff --git a/test-suite/src/vending_minter/tests/trading_time.rs b/test-suite/src/vending_minter/tests/trading_time.rs index eda6e6707..58b886c4c 100644 --- a/test-suite/src/vending_minter/tests/trading_time.rs +++ b/test-suite/src/vending_minter/tests/trading_time.rs @@ -5,8 +5,8 @@ use crate::common_setup::setup_minter::vending_minter::setup::{ configure_minter, vending_minter_code_ids, }; use crate::common_setup::templates::{vending_minter_with_app, vending_minter_with_start_time}; -use cosmwasm_std::{coins, Addr, Timestamp}; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cosmwasm_std::{coins, Addr, Empty, Timestamp}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; #[allow(deprecated)] @@ -285,8 +285,9 @@ fn update_start_trading_time() { .query_wasm_smart( collection_addr.to_string(), &Sg721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/trading_time_updatable.rs b/test-suite/src/vending_minter/tests/trading_time_updatable.rs index 3d5d3ff12..7c0de6bd9 100644 --- a/test-suite/src/vending_minter/tests/trading_time_updatable.rs +++ b/test-suite/src/vending_minter/tests/trading_time_updatable.rs @@ -7,8 +7,8 @@ use crate::common_setup::setup_minter::vending_minter::setup::{ use crate::common_setup::templates::{ vending_minter_updatable_with_app, vending_minter_with_updatable_and_start_time, }; -use cosmwasm_std::{coins, Addr, Timestamp}; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cosmwasm_std::{coins, Addr, Empty, Timestamp}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw_multi_test::Executor; use sg2::tests::mock_collection_params_1; #[allow(deprecated)] @@ -292,8 +292,9 @@ fn update_start_trading_time() { .query_wasm_smart( collection_addr.to_string(), &Sg721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::CollectionInfo {}, ) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/updatable.rs b/test-suite/src/vending_minter/tests/updatable.rs index 0e61f2cec..be06ac24d 100644 --- a/test-suite/src/vending_minter/tests/updatable.rs +++ b/test-suite/src/vending_minter/tests/updatable.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{coins, Empty}; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::{Cw721QueryMsg, NftInfoResponse, TokensResponse}; use cw_multi_test::Executor; use sg721_updatable::msg::ExecuteMsg as Sg721UpdatableExecMsg; @@ -34,8 +34,9 @@ fn update_token_metadata() { // query buyer token_id let query_tokens_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Tokens { owner: buyer.to_string(), start_after: None, @@ -63,12 +64,13 @@ fn update_token_metadata() { .unwrap(); assert_eq!(res.tokens[0], token_id); let query_token_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::NftInfo { token_id, }; - let res: NftInfoResponse = router + let res: NftInfoResponse = router .wrap() .query_wasm_smart(collection_addr, &query_token_msg) .unwrap(); diff --git a/test-suite/src/vending_minter/tests/whitelist.rs b/test-suite/src/vending_minter/tests/whitelist.rs index a81e97b89..3017e79f6 100644 --- a/test-suite/src/vending_minter/tests/whitelist.rs +++ b/test-suite/src/vending_minter/tests/whitelist.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{coin, coins, Addr, Empty, Timestamp}; -use cw721::{DefaultOptionCollectionMetadataExtension, DefaultOptionNftMetadataExtension}; +use cw721::{DefaultOptionalCollectionExtension, DefaultOptionalNftExtension}; use cw721_base::msg::ExecuteMsg as Cw721ExecuteMsg; use cw721_base::msg::{Cw721QueryMsg, TokensResponse}; use cw_multi_test::Executor; @@ -279,8 +279,9 @@ fn whitelist_mint_count_query() { // get random mint token_id let tokens_msg = Cw721QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + Empty, + DefaultOptionalCollectionExtension, >::Tokens { owner: buyer.to_string(), start_after: None, @@ -293,7 +294,7 @@ fn whitelist_mint_count_query() { let sold_token_id: u32 = res.tokens[1].parse::().unwrap(); // Buyer transfers NFT to creator // random mint token id: 8 - let transfer_msg: Cw721ExecuteMsg = Cw721ExecuteMsg::TransferNft { + let transfer_msg: Cw721ExecuteMsg = Cw721ExecuteMsg::TransferNft { recipient: creator.to_string(), // token_id: "8".to_string(), token_id: sold_token_id.to_string(), @@ -535,7 +536,7 @@ fn whitelist_access_len_add_remove_expiration() { ); // Muyer is generous and transfers to creator - let transfer_msg: Cw721ExecuteMsg = Cw721ExecuteMsg::TransferNft { + let transfer_msg: Cw721ExecuteMsg = Cw721ExecuteMsg::TransferNft { recipient: creator.to_string(), token_id: "1".to_string(), }; diff --git a/test-suite/src/vending_minter/tests/zero_mint_price.rs b/test-suite/src/vending_minter/tests/zero_mint_price.rs index eafa10caf..1402d14f4 100644 --- a/test-suite/src/vending_minter/tests/zero_mint_price.rs +++ b/test-suite/src/vending_minter/tests/zero_mint_price.rs @@ -9,9 +9,10 @@ use crate::common_setup::setup_minter::vending_minter::mock_params::{ mock_create_minter_init_msg, mock_init_extension, mock_params, }; use crate::common_setup::setup_minter::vending_minter::setup::vending_minter_code_ids; +use cosmwasm_std::Empty; use cosmwasm_std::{coin, coins, Addr, Timestamp}; -use cw721::DefaultOptionCollectionMetadataExtension; -use cw721::DefaultOptionNftMetadataExtension; +use cw721::DefaultOptionalCollectionExtension; +use cw721::DefaultOptionalNftExtension; use cw721_base::msg::TokensResponse; use cw_multi_test::Executor; use sg2::msg::Sg2ExecuteMsg; @@ -104,8 +105,9 @@ fn zero_mint_price() { .query_wasm_smart( sg721, &sg721_base::msg::QueryMsg::< - DefaultOptionNftMetadataExtension, - DefaultOptionCollectionMetadataExtension, + DefaultOptionalNftExtension, + DefaultOptionalCollectionExtension, + Empty, >::Tokens { owner: buyer.to_string(), start_after: None, From 69b65e2e0ef0d2cd29743a85bfa4a5abab870762 Mon Sep 17 00:00:00 2001 From: mr-t Date: Mon, 25 Mar 2024 00:53:51 +0100 Subject: [PATCH 17/20] docs --- contracts/collections/sg721-base/src/msg.rs | 2 +- packages/sg721/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/collections/sg721-base/src/msg.rs b/contracts/collections/sg721-base/src/msg.rs index d35cdc1fa..d03591115 100644 --- a/contracts/collections/sg721-base/src/msg.rs +++ b/contracts/collections/sg721-base/src/msg.rs @@ -243,7 +243,7 @@ where } #[cw_serde] -#[deprecated = "Please use `CollectionInfo>` instead"] +#[deprecated = "Please use `CollectionInfo>` instead"] pub struct CollectionInfoResponse { pub creator: String, pub description: String, diff --git a/packages/sg721/src/lib.rs b/packages/sg721/src/lib.rs index 7df788019..66f0aab3f 100644 --- a/packages/sg721/src/lib.rs +++ b/packages/sg721/src/lib.rs @@ -24,7 +24,7 @@ pub enum ExecuteMsg< > { // ---- sg721 specific msgs ---- /// Update specific collection info fields - #[deprecated = "Please use UpdateCollectionInfo instead"] + #[deprecated = "Please use Cw721UpdateCollectionInfo instead"] UpdateCollectionInfo { #[allow(deprecated)] collection_info: UpdateCollectionInfoMsg, From 5cf7da8f5736695c925d9a5ef58e12698f6d2e87 Mon Sep 17 00:00:00 2001 From: mr-t Date: Wed, 27 Mar 2024 19:01:36 +0100 Subject: [PATCH 18/20] update lib --- Cargo.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce6cd988d..d0c10eb9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -279,9 +279,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "axum" @@ -705,9 +705,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.35" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" dependencies = [ "num-traits", ] @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#8b211cea2f80e588ab792f34cd77413a6ff3ef51" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#7a36bb78cb6e2512c46476909d0f6bdfc3d4d02f" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1422,7 +1422,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#8b211cea2f80e588ab792f34cd77413a6ff3ef51" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#7a36bb78cb6e2512c46476909d0f6bdfc3d4d02f" dependencies = [ "cosmwasm-std", "cw-ownable 0.6.0", @@ -2498,9 +2498,9 @@ 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 = "js-sys" @@ -3311,9 +3311,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rend" @@ -3462,9 +3462,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.34.3" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" dependencies = [ "arrayvec", "borsh", @@ -3572,9 +3572,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef2175c2907e7c8bc0a9c3f86aeb5ec1f3b275300ad58a44d0c3ae379a5e52e" +checksum = "788745a868b0e751750388f4e6546eb921ef714a4317fa6954f7cde114eb2eb7" dependencies = [ "cfg-if", "derive_more", @@ -3584,9 +3584,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b8eb8fd61c5cdd3390d9b2132300a7e7618955b98b8416f118c1b4e144f" +checksum = "7dc2f4e8bc344b9fc3d5f74f72c2e55bfc38d28dc2ebc69c194a3df424e4d9ac" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -3763,9 +3763,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", From 1db0bb6e76cd078b29ec372dbe81792b54a16575 Mon Sep 17 00:00:00 2001 From: mr-t Date: Wed, 27 Mar 2024 21:58:45 +0100 Subject: [PATCH 19/20] use cw721 for updating token metadata --- Cargo.lock | 8 ++-- contracts/collections/sg721-base/src/error.rs | 2 +- contracts/collections/sg721-nt/src/lib.rs | 2 +- contracts/collections/sg721-nt/src/msg.rs | 4 +- .../sg721-updatable/src/contract.rs | 44 +++++++------------ .../collections/sg721-updatable/src/error.rs | 9 ++-- packages/sg721/src/lib.rs | 2 +- 7 files changed, 31 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d0c10eb9a..59103c196 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#7a36bb78cb6e2512c46476909d0f6bdfc3d4d02f" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#dea2b0175f77a2dabd25ad109244bc215f0740df" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1422,7 +1422,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#7a36bb78cb6e2512c46476909d0f6bdfc3d4d02f" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#dea2b0175f77a2dabd25ad109244bc215f0740df" dependencies = [ "cosmwasm-std", "cw-ownable 0.6.0", @@ -2614,9 +2614,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mime" diff --git a/contracts/collections/sg721-base/src/error.rs b/contracts/collections/sg721-base/src/error.rs index bc6b188e8..6e234e18f 100644 --- a/contracts/collections/sg721-base/src/error.rs +++ b/contracts/collections/sg721-base/src/error.rs @@ -3,7 +3,7 @@ use cw_utils::PaymentError; use thiserror::Error; use url::ParseError; -#[derive(Error, Debug)] +#[derive(Error, Debug, PartialEq)] pub enum ContractError { #[error("{0}")] Std(#[from] StdError), diff --git a/contracts/collections/sg721-nt/src/lib.rs b/contracts/collections/sg721-nt/src/lib.rs index 652d5375f..0869e43e6 100644 --- a/contracts/collections/sg721-nt/src/lib.rs +++ b/contracts/collections/sg721-nt/src/lib.rs @@ -64,7 +64,7 @@ pub mod entry { deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + msg: ExecuteMsg, ) -> Result { match msg { ExecuteMsg::Burn { token_id } => Sg721NonTransferableContract::default() diff --git a/contracts/collections/sg721-nt/src/msg.rs b/contracts/collections/sg721-nt/src/msg.rs index cbaf4ac69..ee00b2c50 100644 --- a/contracts/collections/sg721-nt/src/msg.rs +++ b/contracts/collections/sg721-nt/src/msg.rs @@ -6,7 +6,7 @@ use sg721::{RoyaltyInfoResponse, UpdateCollectionInfoMsg}; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] #[allow(deprecated)] -pub enum ExecuteMsg { +pub enum ExecuteMsg { /// Mint a new NFT, can only be called by the contract minter Mint { /// Unique ID of the NFT @@ -18,7 +18,7 @@ pub enum ExecuteMsg { /// Metadata JSON Schema token_uri: Option, /// Any custom extension used by this contract - extension: T, + extension: TNftExtensionMsg, }, /// Burn an NFT the sender has access to Burn { token_id: String }, diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs index 88dfcd3e1..e5b224549 100644 --- a/contracts/collections/sg721-updatable/src/contract.rs +++ b/contracts/collections/sg721-updatable/src/contract.rs @@ -9,8 +9,9 @@ use cosmwasm_std::{DepsMut, Env, Event, MessageInfo}; use cw2::set_contract_version; use cw721::msg::Cw721MigrateMsg; use cw721::{ - DefaultOptionalCollectionExtension, DefaultOptionalCollectionExtensionMsg, - DefaultOptionalNftExtension, DefaultOptionalNftExtensionMsg, + traits::Cw721Execute, DefaultOptionalCollectionExtension, + DefaultOptionalCollectionExtensionMsg, DefaultOptionalNftExtension, + DefaultOptionalNftExtensionMsg, }; use semver::Version; use sg721::InstantiateMsg; @@ -115,19 +116,12 @@ pub fn execute_freeze_token_metadata( #[allow(deprecated)] pub fn execute_update_token_metadata( deps: DepsMut, - _env: Env, + env: Env, info: MessageInfo, token_id: String, token_uri: Option, ) -> Result { nonpayable(&info)?; - // Check if sender is creator - let owner = deps.api.addr_validate(info.sender.as_ref())?; - let collection_info: CollectionInfoResponse = - Sg721UpdatableContract::default().query_collection_info(deps.as_ref())?; - if owner != collection_info.creator { - return Err(ContractError::Base(Unauthorized {})); - } // Check if token metadata is frozen let frozen = FROZEN_TOKEN_METADATA.load(deps.storage)?; @@ -142,16 +136,14 @@ pub fn execute_update_token_metadata( } // Update token metadata - Sg721UpdatableContract::default() - .config - .nft_info - .update(deps.storage, &token_id, |token| match token { - Some(mut token_info) => { - token_info.token_uri = token_uri.clone(); - Ok(token_info) - } - None => Err(ContractError::TokenIdNotFound {}), - })?; + Sg721UpdatableContract::default().parent.update_nft_info( + deps, + &env, + &info, + token_id.clone(), + token_uri.clone().into(), + None, + )?; let mut event = Event::new("update_update_token_metadata") .add_attribute("sender", info.sender) @@ -258,6 +250,7 @@ mod tests { from_json, to_json_binary, ContractInfoResponse, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, }; + use cw721::error::Cw721ContractError; use cw721_base::traits::Cw721Query; use sg721::{CollectionInfo, InstantiateMsg}; use std::marker::PhantomData; @@ -351,11 +344,8 @@ mod tests { token_id: "wrong-token-id".to_string(), token_uri: updated_token_uri.clone(), }; - let err = execute(deps.as_mut(), mock_env(), info.clone(), update_msg).unwrap_err(); - assert_eq!( - err.to_string(), - ContractError::TokenIdNotFound {}.to_string() - ); + // throws not found error + execute(deps.as_mut(), mock_env(), info.clone(), update_msg).unwrap_err(); // Update token metadata fails because sent by hacker let update_msg = ExecuteMsg::UpdateTokenMetadata { @@ -365,8 +355,8 @@ mod tests { let hacker_info = mock_info(HACKER, &[]); let err = execute(deps.as_mut(), mock_env(), hacker_info, update_msg.clone()).unwrap_err(); assert_eq!( - err.to_string(), - ContractError::Base(Unauthorized {}).to_string() + err, + ContractError::Cw721(Cw721ContractError::NotCreator {}) ); // Update token metadata diff --git a/contracts/collections/sg721-updatable/src/error.rs b/contracts/collections/sg721-updatable/src/error.rs index 29823b2b3..11825523a 100644 --- a/contracts/collections/sg721-updatable/src/error.rs +++ b/contracts/collections/sg721-updatable/src/error.rs @@ -1,10 +1,14 @@ use cosmwasm_std::StdError; +use cw721::error::Cw721ContractError; use cw_utils::PaymentError; use sg1::FeeError; use thiserror::Error; -#[derive(Error, Debug)] +#[derive(Error, Debug, PartialEq)] pub enum ContractError { + #[error("{0}")] + Cw721(#[from] Cw721ContractError), + #[error("{0}")] Std(#[from] StdError), @@ -17,9 +21,6 @@ pub enum ContractError { #[error("{0}")] Fee(#[from] FeeError), - #[error("TokenIdNotFound")] - TokenIdNotFound {}, - #[error("TokenMetadataFrozen")] TokenMetadataFrozen {}, diff --git a/packages/sg721/src/lib.rs b/packages/sg721/src/lib.rs index 66f0aab3f..190af1a39 100644 --- a/packages/sg721/src/lib.rs +++ b/packages/sg721/src/lib.rs @@ -200,7 +200,7 @@ impl extension, } => Cw721ExecuteMsg::UpdateNftInfo { token_id, - token_uri, + token_uri: token_uri.into(), extension, }, ExecuteMsg::SetWithdrawAddress { address } => { From a0cf2f78296d7aa3cc5a25280b9cd7e418d83f71 Mon Sep 17 00:00:00 2001 From: mr-t Date: Wed, 27 Mar 2024 22:05:20 +0100 Subject: [PATCH 20/20] update lib --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 59103c196..3252a0ff4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "cw721" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#dea2b0175f77a2dabd25ad109244bc215f0740df" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#1d2b176a5d310cb2031866f54a6dfe0348806f48" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1422,7 +1422,7 @@ dependencies = [ [[package]] name = "cw721-base" version = "0.19.0" -source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#dea2b0175f77a2dabd25ad109244bc215f0740df" +source = "git+https://github.com/arkprotocol/cw-nfts.git?branch=collection-info#1d2b176a5d310cb2031866f54a6dfe0348806f48" dependencies = [ "cosmwasm-std", "cw-ownable 0.6.0",