diff --git a/Cargo.lock b/Cargo.lock index 21b1da90..f2fb4b2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,6 +61,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "byteorder" version = "1.4.3" @@ -102,9 +108,9 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecd74d3a0041114110d1260f77fcb644c5d2403549b37096c44f0e643a5177" +checksum = "871ce1d5a4b00ed1741f84b377eec19fadd81a904a227bc1e268d76539d26f5e" dependencies = [ "digest 0.10.6", "ed25519-zebra", @@ -115,9 +121,9 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5abeeb891e6d0098402e4d3d042f90451db52651d2fe14b170e69a1dd3e4115" +checksum = "7ce8b44b45a7c8c6d6f770cd0a51458c2445c7c15b6115e1d215fa35c77b305c" dependencies = [ "syn", ] @@ -148,11 +154,12 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5034c772c1369b160731aa00bb81f93733ab2884928edd8d588733d607ac5af4" +checksum = "da78abcf059181e8cb01e95e5003cf64fe95dde6c72b3fe37e5cabc75cdba32a" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", @@ -163,7 +170,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.6", "thiserror", - "uint", ] [[package]] @@ -175,12 +181,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto-bigint" version = "0.4.9" @@ -815,12 +815,6 @@ dependencies = [ "der", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "subtle" version = "2.4.1" @@ -924,18 +918,6 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-ident" version = "1.0.6" diff --git a/examples/Cargo.lock b/examples/Cargo.lock index f057d32a..4a897b66 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -67,6 +67,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.13.0" @@ -114,9 +120,9 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c0e41be7e6c7d7ab3c61cdc32fcfaa14f948491a401cbc1c74bb33b6f4b851" +checksum = "871ce1d5a4b00ed1741f84b377eec19fadd81a904a227bc1e268d76539d26f5e" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -127,9 +133,9 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7ee2798c92c00dd17bebb4210f81d5f647e5e92d847959b7977e0fd29a3500" +checksum = "7ce8b44b45a7c8c6d6f770cd0a51458c2445c7c15b6115e1d215fa35c77b305c" dependencies = [ "syn 1.0.109", ] @@ -160,11 +166,12 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d5fdfd112b070055f068fad079d490117c8e905a588b92a5a7c9276d029930" +checksum = "da78abcf059181e8cb01e95e5003cf64fe95dde6c72b3fe37e5cabc75cdba32a" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", @@ -175,7 +182,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.6", "thiserror", - "uint", ] [[package]] @@ -187,12 +193,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto-bigint" version = "0.4.9" @@ -962,12 +962,6 @@ dependencies = [ "der", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "subtle" version = "2.5.0" @@ -1074,18 +1068,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c52b4cb7830f995903b2fcff3f523d21efc1c11f6c1596dd544b7925a64ff56" -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-ident" version = "1.0.9" diff --git a/examples/contracts/cw1-subkeys/Cargo.toml b/examples/contracts/cw1-subkeys/Cargo.toml index fbf8398e..12dc5f70 100644 --- a/examples/contracts/cw1-subkeys/Cargo.toml +++ b/examples/contracts/cw1-subkeys/Cargo.toml @@ -13,7 +13,7 @@ tests = ["library", "cw-multi-test", "anyhow"] [dependencies] anyhow = { version = "1.0.68", optional = true } cosmwasm-schema = "1.2" -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cw-multi-test = { version = "0.16.2", optional = true } cw-storage-plus = "1.0" cw-utils = "1.0" diff --git a/examples/contracts/cw1-whitelist/Cargo.toml b/examples/contracts/cw1-whitelist/Cargo.toml index 6567b319..c307894e 100644 --- a/examples/contracts/cw1-whitelist/Cargo.toml +++ b/examples/contracts/cw1-whitelist/Cargo.toml @@ -17,7 +17,7 @@ tests = ["library", "cw-multi-test", "anyhow"] mt = ["sylvia/mt", "library"] [dependencies] -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cosmwasm-schema = "1.2" serde = { version = "1.0", default-features = false, features = ["derive"] } sylvia = { path = "../../../sylvia" } diff --git a/examples/contracts/cw20-base/Cargo.toml b/examples/contracts/cw20-base/Cargo.toml index 8ac19901..e2f1c581 100644 --- a/examples/contracts/cw20-base/Cargo.toml +++ b/examples/contracts/cw20-base/Cargo.toml @@ -18,7 +18,7 @@ tests = ["library", "cw-multi-test", "anyhow"] [dependencies] anyhow = { version = "1.0", optional = true } cosmwasm-schema = "1.2" -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cw-multi-test = { version = "0.16", optional = true } cw-storage-plus = "1.0" cw-utils = "1.0" @@ -39,7 +39,7 @@ cw-multi-test = "0.16" cw-utils = "1.0" sylvia = { path = "../../../sylvia", features = ["mt"] } cw20-allowances = { path = "../../interfaces/cw20-allowances", features = [ - "mt", + "mt", ] } cw20-marketing = { path = "../../interfaces/cw20-marketing", features = ["mt"] } cw20-minting = { path = "../../interfaces/cw20-minting", features = ["mt"] } diff --git a/examples/contracts/entry-points-overriding/Cargo.toml b/examples/contracts/entry-points-overriding/Cargo.toml index 91dbdf80..911bab58 100644 --- a/examples/contracts/entry-points-overriding/Cargo.toml +++ b/examples/contracts/entry-points-overriding/Cargo.toml @@ -18,7 +18,7 @@ tests = ["library", "cw-multi-test", "anyhow"] [dependencies] anyhow = { version = "1.0", optional = true } cosmwasm-schema = "1.2" -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cw-multi-test = { version = "0.16", optional = true } cw-storage-plus = "1.0" cw-utils = "1.0" diff --git a/examples/interfaces/cw1/Cargo.toml b/examples/interfaces/cw1/Cargo.toml index ac280e2e..8b8b7ad1 100644 --- a/examples/interfaces/cw1/Cargo.toml +++ b/examples/interfaces/cw1/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://cosmwasm.com" mt = ["sylvia/mt"] [dependencies] -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cosmwasm-schema = "1.2" serde = { version = "1.0", default-features = false, features = ["derive"] } sylvia = { path = "../../../sylvia" } diff --git a/examples/interfaces/cw20-allowances/Cargo.toml b/examples/interfaces/cw20-allowances/Cargo.toml index 71bbfd3c..d169a8f9 100644 --- a/examples/interfaces/cw20-allowances/Cargo.toml +++ b/examples/interfaces/cw20-allowances/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://cosmwasm.com" mt = ["sylvia/mt"] [dependencies] -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cosmwasm-schema = "1.2" serde = { version = "1.0", default-features = false, features = ["derive"] } sylvia = { path = "../../../sylvia" } diff --git a/examples/interfaces/cw20-marketing/Cargo.toml b/examples/interfaces/cw20-marketing/Cargo.toml index 508b5c44..f4613fb4 100644 --- a/examples/interfaces/cw20-marketing/Cargo.toml +++ b/examples/interfaces/cw20-marketing/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://cosmwasm.com" mt = ["sylvia/mt"] [dependencies] -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cosmwasm-schema = "1.2" serde = { version = "1.0", default-features = false, features = ["derive"] } sylvia = { path = "../../../sylvia" } diff --git a/examples/interfaces/cw20-minting/Cargo.toml b/examples/interfaces/cw20-minting/Cargo.toml index 65a51b51..ef7abfb9 100644 --- a/examples/interfaces/cw20-minting/Cargo.toml +++ b/examples/interfaces/cw20-minting/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://cosmwasm.com" mt = ["sylvia/mt"] [dependencies] -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cosmwasm-schema = "1.2" serde = { version = "1.0", default-features = false, features = ["derive"] } sylvia = { path = "../../../sylvia" } diff --git a/examples/interfaces/cw4/Cargo.toml b/examples/interfaces/cw4/Cargo.toml index 30ce3757..de683614 100644 --- a/examples/interfaces/cw4/Cargo.toml +++ b/examples/interfaces/cw4/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://cosmwasm.com" mt = ["sylvia/mt"] [dependencies] -cosmwasm-std = { version = "1.2.1", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cosmwasm-schema = "1.2" serde = { version = "1.0", default-features = false, features = ["derive"] } sylvia = { path = "../../../sylvia" } diff --git a/sylvia-derive/src/message.rs b/sylvia-derive/src/message.rs index 35f4df21..e0456c82 100644 --- a/sylvia-derive/src/message.rs +++ b/sylvia-derive/src/message.rs @@ -901,15 +901,28 @@ impl<'a> GlueMessage<'a> { let ContractMessageAttr { variant, has_custom_msg, + has_custom_query, .. } = interface; - match *has_custom_msg&& msg_ty == &MsgType::Exec - { - true => quote! { #contract_name :: #variant(msg) => Ok( #sylvia ::into_response::IntoResponse::into_response(msg.dispatch(contract, Into::into(ctx))?)?) }, - false => quote! { #contract_name :: #variant(msg) => msg.dispatch(contract, Into::into(ctx)) } - } + let ctx = match (msg_ty, has_custom_query) { + (MsgType::Exec, true )=> quote! { + ( ctx.0.into_empty(), ctx.1, ctx.2) + }, + (MsgType::Query, true )=> quote! { + ( ctx.0.into_empty(), ctx.1) + }, + _=> quote! { ctx }, + }; + match (msg_ty, has_custom_msg) { + (MsgType::Exec, true) => quote! { + #contract_name :: #variant(msg) => #sylvia ::into_response::IntoResponse::into_response(msg.dispatch(contract, Into::into( #ctx ))?) + }, + _ => quote! { + #contract_name :: #variant(msg) => msg.dispatch(contract, Into::into( #ctx )) + }, + } }); let dispatch_arm = quote! {#contract_name :: #contract (msg) =>msg.dispatch(contract, ctx)}; diff --git a/sylvia-derive/src/parser.rs b/sylvia-derive/src/parser.rs index 475b8e22..b809d70d 100644 --- a/sylvia-derive/src/parser.rs +++ b/sylvia-derive/src/parser.rs @@ -236,6 +236,7 @@ pub struct ContractMessageAttr { pub query_generic_params: Vec, pub variant: Ident, pub has_custom_msg: bool, + pub has_custom_query: bool, } #[cfg(not(tarpaulin_include))] @@ -262,6 +263,35 @@ fn parse_generics(content: &ParseBuffer) -> Result> { Ok(params) } +fn interface_has_custom(content: ParseStream) -> Result<(bool, bool)> { + let mut has_custom_msg = false; + let mut has_custom_query = false; + + let _: Token![:] = content.parse()?; + let attr: Ident = content.parse()?; + if attr != "custom" { + return Ok((has_custom_msg, has_custom_query)); + } + + let custom_content; + parenthesized!(custom_content in content); + + while !custom_content.is_empty() { + let custom = custom_content.parse::()?; + match custom.get_ident() { + Some(ident) if ident == "msg" => has_custom_msg = true, + Some(ident) if ident == "query" => has_custom_query = true, + _ => { + return Err(Error::new( + custom.span(), + "Invalid custom attribute, expected one of: `msg`, `query`", + )) + } + } + } + Ok((has_custom_msg, has_custom_query)) +} + #[cfg(not(tarpaulin_include))] // False negative. It is being called in closure impl Parse for ContractMessageAttr { @@ -274,7 +304,6 @@ impl Parse for ContractMessageAttr { let generics_open: Option = content.parse()?; let mut exec_generic_params = vec![]; let mut query_generic_params = vec![]; - let mut has_custom_msg = false; if generics_open.is_some() { loop { @@ -300,16 +329,11 @@ impl Parse for ContractMessageAttr { let _: Token![as] = content.parse()?; let variant = content.parse()?; - if content.peek(Token![:]) { - let _: Token![:] = content.parse()?; - let attr: Ident = content.parse()?; - if attr == "custom" { - let custom_content; - parenthesized!(custom_content in content); - let custom = custom_content.parse::()?; - has_custom_msg = custom.is_ident("msg"); - } - } + let (has_custom_msg, has_custom_query) = if content.peek(Token![:]) { + interface_has_custom(&content)? + } else { + (false, false) + }; if !content.is_empty() { return Err(Error::new( @@ -324,6 +348,7 @@ impl Parse for ContractMessageAttr { query_generic_params, variant, has_custom_msg, + has_custom_query, }) } } diff --git a/sylvia/Cargo.toml b/sylvia/Cargo.toml index a4cba7d0..121bb6cc 100644 --- a/sylvia/Cargo.toml +++ b/sylvia/Cargo.toml @@ -17,7 +17,7 @@ staking = ["cosmwasm-std/staking", "cw-multi-test?/staking"] [dependencies] sylvia-derive = { workspace = true } -cosmwasm-std = { version = "1.2", features = ["staking"] } +cosmwasm-std = { version = "1.3", features = ["staking"] } cosmwasm-schema = "1.2" schemars = "0.8" serde = { version = "1.0", default-features = false, features = ["derive"] } diff --git a/sylvia/src/into_deps.rs b/sylvia/src/into_deps.rs deleted file mode 100644 index 30a7e4dc..00000000 --- a/sylvia/src/into_deps.rs +++ /dev/null @@ -1,133 +0,0 @@ -use cosmwasm_std::{CustomQuery, Deps, DepsMut, Empty, QuerierWrapper}; - -/// Trait converting `Deps` to one operating on another `Query` type. By default only conversions -/// from any `Deps` to `Deps` are possible, and in general - only converting to `Deps` -/// over simpler query (being a subset of the original one) should be allowed. -trait IntoDeps<'deps, Q> -where - Q: CustomQuery, -{ - fn into_deps(self) -> Deps<'deps, Q>; -} - -/// Any `Deps` can be made into `Deps` -/// -/// It would be better to define it on owned `Deps`, but the `QuerierWrapper::querier` is not -/// accessible - some destructuring function for it would be helpfull here -impl<'deps, Q> IntoDeps<'deps, Empty> for &'deps Deps<'deps, Q> -where - Q: CustomQuery, -{ - fn into_deps(self) -> Deps<'deps, Empty> { - Deps { - storage: self.storage, - api: self.api, - querier: QuerierWrapper::new(&*self.querier), - } - } -} - -/// Trait converting `DepsMut` to one operating on another `Query` type. By default only -/// conversions from any `DepsMut` to `DepsMut` are possible, and in general - only -/// converting to `DepsMut` over simpler query (being a subset of the original one) should be -/// allowed. -trait IntoDepsMut<'deps, Q> -where - Q: CustomQuery, -{ - fn into_deps_mut(self) -> DepsMut<'deps, Q>; -} - -/// Any `DepsMut` can be made into `DepsMut` -/// -/// It would be better to define it on owned `DepsMut`, but the `QuerierWrapper::querier` is not -/// accessible - some destructuring function for it would be helpfull here -impl<'deps, Q> IntoDepsMut<'deps, Empty> for &'deps mut DepsMut<'deps, Q> -where - Q: CustomQuery, -{ - fn into_deps_mut(self) -> DepsMut<'deps, Empty> { - DepsMut { - storage: self.storage, - api: self.api, - querier: QuerierWrapper::new(&*self.querier), - } - } -} - -#[cfg(test)] -mod tests { - use cosmwasm_std::testing::{mock_dependencies, MockApi, MockStorage}; - use cosmwasm_std::{CustomQuery, Deps, DepsMut, Empty, QuerierWrapper}; - use schemars::JsonSchema; - use serde::{Deserialize, Serialize}; - - use crate::into_deps::IntoDeps; - - use super::IntoDepsMut; - - #[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq, Eq)] - struct MyQuery {} - - impl CustomQuery for MyQuery {} - - #[test] - fn empty_into_deps() { - let deps = mock_dependencies(); - let storage = MockStorage::new(); - let api = MockApi::default(); - let querier = QuerierWrapper::::new(&deps.querier); - - let deps = Deps { - storage: &storage, - api: &api, - querier, - }; - let _: Deps = deps.into_deps(); - } - - #[test] - fn custom_into_deps() { - let deps = mock_dependencies(); - let storage = MockStorage::new(); - let api = MockApi::default(); - let querier = QuerierWrapper::::new(&deps.querier); - - let deps = Deps { - storage: &storage, - api: &api, - querier, - }; - let _: Deps = deps.into_deps(); - } - - #[test] - fn empty_into_deps_mut() { - let deps = mock_dependencies(); - let mut storage = MockStorage::new(); - let api = MockApi::default(); - let querier = QuerierWrapper::::new(&deps.querier); - - let mut deps = DepsMut { - storage: &mut storage, - api: &api, - querier, - }; - let _: DepsMut = deps.into_deps_mut(); - } - - #[test] - fn custom_into_deps_mut() { - let deps = mock_dependencies(); - let mut storage = MockStorage::new(); - let api = MockApi::default(); - let querier = QuerierWrapper::::new(&deps.querier); - - let mut deps = DepsMut { - storage: &mut storage, - api: &api, - querier, - }; - let _: DepsMut = deps.into_deps_mut(); - } -} diff --git a/sylvia/src/lib.rs b/sylvia/src/lib.rs index 68355429..f3502c47 100644 --- a/sylvia/src/lib.rs +++ b/sylvia/src/lib.rs @@ -2,7 +2,6 @@ //! //! Most of implementation lies in `cw-derive-ng` crate which is reexported here -pub mod into_deps; pub mod into_response; #[cfg(feature = "mt")] pub mod multitest; diff --git a/sylvia/tests/custom_query.rs b/sylvia/tests/custom_query.rs index 7e1fc2ba..cb92e811 100644 --- a/sylvia/tests/custom_query.rs +++ b/sylvia/tests/custom_query.rs @@ -134,10 +134,48 @@ mod associated_type_interface { } } +mod default_query_interface { + use cosmwasm_std::{Response, StdError, StdResult}; + use sylvia::types::{ExecCtx, QueryCtx}; + use sylvia::{contract, interface}; + + use crate::SomeResponse; + + #[interface] + pub trait DefaultQueryInterface { + type Error: From; + + #[cfg(not(tarpaulin_include))] + #[msg(query)] + fn default_query(&self, ctx: QueryCtx) -> StdResult; + + #[cfg(not(tarpaulin_include))] + #[msg(exec)] + fn default_exec(&self, ctx: ExecCtx) -> StdResult; + } + + #[contract(module=super)] + #[sv::custom(query=MyQuery)] + impl DefaultQueryInterface for crate::MyContract { + type Error = StdError; + + #[msg(query)] + fn default_query(&self, _ctx: QueryCtx) -> StdResult { + Ok(SomeResponse) + } + + #[msg(exec)] + fn default_exec(&self, _ctx: ExecCtx) -> StdResult { + Ok(Response::default()) + } + } +} + #[contract] #[messages(some_interface as SomeInterface)] #[messages(associated_type_interface as AssociatedTypeInterface)] #[messages(interface as Interface)] +#[messages(default_query_interface as DefaultQueryInterface: custom(query))] #[sv::custom(query=MyQuery)] impl MyContract { #[allow(clippy::new_without_default)] @@ -170,6 +208,7 @@ impl MyContract { #[cfg(all(test, feature = "mt"))] mod tests { use crate::associated_type_interface::test_utils::AssociatedTypeInterface; + use crate::default_query_interface::test_utils::DefaultQueryInterface; use crate::some_interface::test_utils::SomeInterface; use crate::{interface::test_utils::Interface, MyContract, MyQuery}; @@ -222,5 +261,16 @@ mod tests { .interface_exec() .call(owner) .unwrap(); + + // Neither `custom` attribute nor associated type + contract + .default_query_interface_proxy() + .default_query() + .unwrap(); + contract + .default_query_interface_proxy() + .default_exec() + .call(owner) + .unwrap(); } }