diff --git a/.github/workflows/ci-contracts-upload-binaries.yml b/.github/workflows/ci-contracts-upload-binaries.yml index b0f44d69ec..4347e5f333 100644 --- a/.github/workflows/ci-contracts-upload-binaries.yml +++ b/.github/workflows/ci-contracts-upload-binaries.yml @@ -58,8 +58,6 @@ jobs: cp contracts/target/wasm32-unknown-unknown/release/nym_coconut_dkg.wasm $OUTPUT_DIR cp contracts/target/wasm32-unknown-unknown/release/cw3_flex_multisig.wasm $OUTPUT_DIR cp contracts/target/wasm32-unknown-unknown/release/cw4_group.wasm $OUTPUT_DIR - cp contracts/target/wasm32-unknown-unknown/release/nym_service_provider_directory.wasm $OUTPUT_DIR - cp contracts/target/wasm32-unknown-unknown/release/nym_name_service.wasm $OUTPUT_DIR - name: Deploy branch to CI www continue-on-error: true diff --git a/Cargo.lock b/Cargo.lock index 265241eccd..3e0e7a9824 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3898,11 +3898,9 @@ dependencies = [ "nym-inclusion-probability", "nym-mixnet-contract-common", "nym-multisig-contract-common", - "nym-name-service-common", "nym-node-requests", "nym-node-tester-utils", "nym-pemstore", - "nym-service-provider-directory-common", "nym-sphinx", "nym-task", "nym-topology", @@ -4081,10 +4079,8 @@ dependencies = [ "nym-id", "nym-mixnet-contract-common", "nym-multisig-contract-common", - "nym-name-service-common", "nym-network-defaults", "nym-pemstore", - "nym-service-provider-directory-common", "nym-sphinx", "nym-types", "nym-validator-client", @@ -4907,20 +4903,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "nym-name-service-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "cw2", - "nym-contracts-common", - "serde", - "thiserror", -] - [[package]] name = "nym-network-defaults" version = "0.1.0" @@ -5250,19 +5232,6 @@ dependencies = [ "url", ] -[[package]] -name = "nym-service-provider-directory-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "cw2", - "nym-contracts-common", - "thiserror", -] - [[package]] name = "nym-service-providers-common" version = "0.1.0" @@ -5686,9 +5655,7 @@ dependencies = [ "nym-http-api-client", "nym-mixnet-contract-common", "nym-multisig-contract-common", - "nym-name-service-common", "nym-network-defaults", - "nym-service-provider-directory-common", "nym-vesting-contract-common", "prost 0.12.4", "reqwest 0.12.4", diff --git a/Cargo.toml b/Cargo.toml index 4c449f4068..2c6500ca0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,8 +39,6 @@ members = [ "common/cosmwasm-smart-contracts/group-contract", "common/cosmwasm-smart-contracts/mixnet-contract", "common/cosmwasm-smart-contracts/multisig-contract", - "common/cosmwasm-smart-contracts/name-service", - "common/cosmwasm-smart-contracts/service-provider-directory", "common/cosmwasm-smart-contracts/vesting-contract", "common/country-group", "common/credential-storage", diff --git a/Makefile b/Makefile index 4bc39b0b5f..09b8400db5 100644 --- a/Makefile +++ b/Makefile @@ -134,7 +134,7 @@ clippy: sdk-wasm-lint # Build contracts ready for deploy # ----------------------------------------------------------------------------- -CONTRACTS=vesting_contract mixnet_contract nym_service_provider_directory nym_name_service +CONTRACTS=vesting_contract mixnet_contract CONTRACTS_WASM=$(addsuffix .wasm, $(CONTRACTS)) CONTRACTS_OUT_DIR=contracts/target/wasm32-unknown-unknown/release @@ -186,4 +186,4 @@ deb-gateway: build-nym-gateway deb-cli: build-nym-cli cargo deb -p nym-cli -deb: deb-mixnode deb-gateway deb-cli \ No newline at end of file +deb: deb-mixnode deb-gateway deb-cli diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index 0745e145e4..2f861f8ed3 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -19,9 +19,7 @@ nym-mixnet-contract-common = { path = "../../cosmwasm-smart-contracts/mixnet-con nym-vesting-contract-common = { path = "../../cosmwasm-smart-contracts/vesting-contract" } nym-coconut-bandwidth-contract-common = { path = "../../cosmwasm-smart-contracts/coconut-bandwidth-contract" } nym-multisig-contract-common = { path = "../../cosmwasm-smart-contracts/multisig-contract" } -nym-name-service-common = { path = "../../cosmwasm-smart-contracts/name-service" } nym-group-contract-common = { path = "../../cosmwasm-smart-contracts/group-contract" } -nym-service-provider-directory-common = { path = "../../cosmwasm-smart-contracts/service-provider-directory" } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } nym-http-api-client = { path = "../../../common/http-api-client"} @@ -86,14 +84,6 @@ name = "offline_signing" # (traits would need to be moved around and refactored themselves) required-features = ["http-client"] -[[example]] -name = "query_service_provider_directory" -required-features = ["http-client"] - -[[example]] -name = "query_name_service" -required-features = ["http-client"] - [features] default = ["http-client"] http-client = ["cosmrs/rpc"] diff --git a/common/client-libs/validator-client/examples/query_name_service.rs b/common/client-libs/validator-client/examples/query_name_service.rs deleted file mode 100644 index bf5001c86e..0000000000 --- a/common/client-libs/validator-client/examples/query_name_service.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::str::FromStr; - -use cosmrs::AccountId; -use nym_name_service_common::Address; -use nym_network_defaults::{setup_env, NymNetworkDetails}; -use nym_validator_client::nyxd::contract_traits::{ - NameServiceQueryClient, PagedNameServiceQueryClient, -}; - -#[tokio::main] -async fn main() { - setup_env(Some("../../../envs/qa.env")); - let network_details = NymNetworkDetails::new_from_env(); - let config = - nym_validator_client::Config::try_from_nym_network_details(&network_details).unwrap(); - let client = nym_validator_client::Client::new_query(config).unwrap(); - - let config = client.nyxd.get_name_service_config().await.unwrap(); - println!("config: {config:?}"); - - let names_paged = client.nyxd.get_names_paged(None, None).await.unwrap(); - println!("names (paged): {names_paged:#?}"); - - let names = client.nyxd.get_all_names().await.unwrap(); - println!("names: {names:#?}"); - - let owner = AccountId::from_str("n1hmf957kc7arcd39rl7xq8l0a4zyg7kxnv7su87").unwrap(); - let names_by_owner = client.nyxd.get_names_by_owner(owner).await.unwrap(); - println!("names (by owner): {names_by_owner:#?}"); - - let nym_address = Address::new("client_id.client_key@gateway_id").unwrap(); - let names_by_address = client.nyxd.get_names_by_address(nym_address).await.unwrap(); - println!("names (by address): {names_by_address:#?}"); - - let service_info = client.nyxd.get_name_entry(1).await; - println!("service info: {service_info:#?}"); -} diff --git a/common/client-libs/validator-client/examples/query_service_provider_directory.rs b/common/client-libs/validator-client/examples/query_service_provider_directory.rs deleted file mode 100644 index c0cd2b1399..0000000000 --- a/common/client-libs/validator-client/examples/query_service_provider_directory.rs +++ /dev/null @@ -1,45 +0,0 @@ -use std::str::FromStr; - -use cosmrs::AccountId; -use nym_network_defaults::{setup_env, NymNetworkDetails}; -use nym_service_provider_directory_common::NymAddress; -use nym_validator_client::nyxd::contract_traits::{ - PagedSpDirectoryQueryClient, SpDirectoryQueryClient, -}; - -#[tokio::main] -async fn main() { - setup_env(Some("../../../envs/qa.env")); - let network_details = NymNetworkDetails::new_from_env(); - let config = - nym_validator_client::Config::try_from_nym_network_details(&network_details).unwrap(); - let client = nym_validator_client::Client::new_query(config).unwrap(); - - let config = client.nyxd.get_service_config().await.unwrap(); - println!("config: {config:?}"); - - let services_paged = client.nyxd.get_services_paged(None, None).await.unwrap(); - println!("services (paged): {services_paged:#?}"); - - let services = client.nyxd.get_all_services().await.unwrap(); - println!("services: {services:#?}"); - - let announcer = AccountId::from_str("n1hmf957kc7arcd39rl7xq8l0a4zyg7kxnv7su87").unwrap(); - let services_by_announcer = client - .nyxd - .get_services_by_announcer(announcer) - .await - .unwrap(); - println!("services (by announcer): {services_by_announcer:#?}"); - - let nym_address = NymAddress::new("foo.bar@gateway"); - let services_by_nym_address = client - .nyxd - .get_services_by_nym_address(nym_address) - .await - .unwrap(); - assert_eq!(services_by_announcer, services_by_nym_address); - - let service_info = client.nyxd.get_service_info(1).await; - println!("service info: {service_info:#?}"); -} diff --git a/common/client-libs/validator-client/src/nym_api/mod.rs b/common/client-libs/validator-client/src/nym_api/mod.rs index 22b13ef576..e54d4698ba 100644 --- a/common/client-libs/validator-client/src/nym_api/mod.rs +++ b/common/client-libs/validator-client/src/nym_api/mod.rs @@ -25,8 +25,6 @@ pub use nym_coconut_dkg_common::types::EpochId; use nym_http_api_client::{ApiClient, NO_PARAMS}; use nym_mixnet_contract_common::mixnode::MixNodeDetails; use nym_mixnet_contract_common::{GatewayBond, IdentityKeyRef, MixId}; -use nym_name_service_common::response::NamesListResponse; -use nym_service_provider_directory_common::response::ServicesListResponse; pub mod error; pub mod routes; @@ -492,19 +490,6 @@ pub trait NymApiClientExt: ApiClient { ) .await } - - async fn get_service_providers(&self) -> Result { - log::trace!("Getting service providers"); - self.get_json(&[routes::API_VERSION, routes::SERVICE_PROVIDERS], NO_PARAMS) - .await - } - - //async fn get_registered_names(&self) -> Result, NymAPIError> { - async fn get_registered_names(&self) -> Result { - log::trace!("Getting registered names"); - self.get_json(&[routes::API_VERSION, routes::REGISTERED_NAMES], NO_PARAMS) - .await - } } #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] diff --git a/common/client-libs/validator-client/src/nym_api/routes.rs b/common/client-libs/validator-client/src/nym_api/routes.rs index 212ae0a8c0..cc2a17d018 100644 --- a/common/client-libs/validator-client/src/nym_api/routes.rs +++ b/common/client-libs/validator-client/src/nym_api/routes.rs @@ -40,4 +40,3 @@ pub const STAKE_SATURATION: &str = "stake-saturation"; pub const INCLUSION_CHANCE: &str = "inclusion-probability"; pub const SERVICE_PROVIDERS: &str = "services"; -pub const REGISTERED_NAMES: &str = "names"; diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs index d6ee4acad2..5e4b785bf5 100644 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs @@ -14,8 +14,6 @@ pub mod ephemera_query_client; pub mod group_query_client; pub mod mixnet_query_client; pub mod multisig_query_client; -pub mod name_service_query_client; -pub mod sp_directory_query_client; pub mod vesting_query_client; // signing clients @@ -25,8 +23,6 @@ pub mod ephemera_signing_client; pub mod group_signing_client; pub mod mixnet_signing_client; pub mod multisig_signing_client; -pub mod name_service_signing_client; -pub mod sp_directory_signing_client; pub mod vesting_signing_client; // re-export query traits @@ -38,8 +34,6 @@ pub use ephemera_query_client::{EphemeraQueryClient, PagedEphemeraQueryClient}; pub use group_query_client::{GroupQueryClient, PagedGroupQueryClient}; pub use mixnet_query_client::{MixnetQueryClient, PagedMixnetQueryClient}; pub use multisig_query_client::{MultisigQueryClient, PagedMultisigQueryClient}; -pub use name_service_query_client::{NameServiceQueryClient, PagedNameServiceQueryClient}; -pub use sp_directory_query_client::{PagedSpDirectoryQueryClient, SpDirectoryQueryClient}; pub use vesting_query_client::{PagedVestingQueryClient, VestingQueryClient}; // re-export signing traits @@ -49,8 +43,6 @@ pub use ephemera_signing_client::EphemeraSigningClient; pub use group_signing_client::GroupSigningClient; pub use mixnet_signing_client::MixnetSigningClient; pub use multisig_signing_client::MultisigSigningClient; -pub use name_service_signing_client::NameServiceSigningClient; -pub use sp_directory_signing_client::SpDirectorySigningClient; pub use vesting_signing_client::VestingSigningClient; // helper for providing blanket implementation for query clients @@ -67,10 +59,6 @@ pub trait NymContractsProvider { // ephemera-related fn ephemera_contract_address(&self) -> Option<&AccountId>; - - // SPs - fn name_service_contract_address(&self) -> Option<&AccountId>; - fn service_provider_contract_address(&self) -> Option<&AccountId>; } #[derive(Debug, Clone)] @@ -84,9 +72,6 @@ pub struct TypedNymContracts { pub coconut_dkg_contract_address: Option, pub ephemera_contract_address: Option, - - pub service_provider_directory_contract_address: Option, - pub name_service_contract_address: Option, } impl TryFrom for TypedNymContracts { @@ -122,14 +107,6 @@ impl TryFrom for TypedNymContracts { .ephemera_contract_address .map(|addr| addr.parse()) .transpose()?, - service_provider_directory_contract_address: value - .service_provider_directory_contract_address - .map(|addr| addr.parse()) - .transpose()?, - name_service_contract_address: value - .name_service_contract_address - .map(|addr| addr.parse()) - .transpose()?, }) } } diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/name_service_query_client.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/name_service_query_client.rs deleted file mode 100644 index 60071f674d..0000000000 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/name_service_query_client.rs +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::collect_paged; -use crate::nyxd::contract_traits::NymContractsProvider; -use crate::nyxd::{error::NyxdError, CosmWasmClient}; -use async_trait::async_trait; -use cosmrs::AccountId; -use nym_contracts_common::{signing::Nonce, ContractBuildInformation}; -use nym_name_service_common::{ - msg::QueryMsg as NameQueryMsg, - response::{ConfigResponse, NamesListResponse, PagedNamesListResponse}, - Address, NameId, NymName, RegisteredName, -}; -use serde::Deserialize; - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -pub trait NameServiceQueryClient { - async fn query_name_service_contract(&self, query: NameQueryMsg) -> Result - where - for<'a> T: Deserialize<'a>; - - async fn get_name_service_config(&self) -> Result { - self.query_name_service_contract(NameQueryMsg::Config {}) - .await - } - - async fn get_name_entry(&self, name_id: NameId) -> Result { - self.query_name_service_contract(NameQueryMsg::NameId { name_id }) - .await - } - - async fn get_names_paged( - &self, - start_after: Option, - limit: Option, - ) -> Result { - self.query_name_service_contract(NameQueryMsg::All { limit, start_after }) - .await - } - - async fn get_name_signing_nonce(&self, address: &AccountId) -> Result { - self.query_name_service_contract(NameQueryMsg::SigningNonce { - address: address.to_string(), - }) - .await - } - - async fn get_names_by_owner(&self, owner: AccountId) -> Result { - self.query_name_service_contract(NameQueryMsg::ByOwner { - owner: owner.to_string(), - }) - .await - } - - async fn get_names_by_nym_name(&self, name: NymName) -> Result { - self.query_name_service_contract(NameQueryMsg::ByName { name }) - .await - } - - async fn get_names_by_address(&self, address: Address) -> Result { - self.query_name_service_contract(NameQueryMsg::ByAddress { address }) - .await - } - - async fn get_name_service_contract_version( - &self, - ) -> Result { - self.query_name_service_contract(NameQueryMsg::GetContractVersion {}) - .await - } - - async fn get_name_service_contract_cw2_version( - &self, - ) -> Result { - self.query_name_service_contract(NameQueryMsg::GetCW2ContractVersion {}) - .await - } -} - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -pub trait PagedNameServiceQueryClient: NameServiceQueryClient { - async fn get_all_names(&self) -> Result, NyxdError> { - collect_paged!(self, get_names_paged, names) - } -} - -#[async_trait] -impl PagedNameServiceQueryClient for T where T: NameServiceQueryClient {} - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -impl NameServiceQueryClient for C -where - C: CosmWasmClient + NymContractsProvider + Send + Sync, -{ - async fn query_name_service_contract(&self, query: NameQueryMsg) -> Result - where - for<'a> T: Deserialize<'a>, - { - let name_service_contract_address = &self - .name_service_contract_address() - .ok_or_else(|| NyxdError::unavailable_contract_address("name service contract"))?; - self.query_contract_smart(name_service_contract_address, &query) - .await - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::nyxd::contract_traits::tests::IgnoreValue; - - // it's enough that this compiles and clippy is happy about it - #[allow(dead_code)] - fn all_query_variants_are_covered( - client: C, - msg: NameQueryMsg, - ) { - match msg { - NameQueryMsg::NameId { name_id } => client.get_name_entry(name_id).ignore(), - NameQueryMsg::ByOwner { owner } => { - client.get_names_by_owner(owner.parse().unwrap()).ignore() - } - NameQueryMsg::ByName { name } => client.get_names_by_nym_name(name).ignore(), - NameQueryMsg::ByAddress { address } => client.get_names_by_address(address).ignore(), - NameQueryMsg::All { limit, start_after } => { - client.get_names_paged(limit, start_after).ignore() - } - NameQueryMsg::SigningNonce { address } => client - .get_name_signing_nonce(&address.parse().unwrap()) - .ignore(), - NameQueryMsg::Config {} => client.get_name_service_config().ignore(), - NameQueryMsg::GetContractVersion {} => { - client.get_name_service_contract_version().ignore() - } - NameQueryMsg::GetCW2ContractVersion {} => { - client.get_name_service_contract_cw2_version().ignore() - } - }; - } -} diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/name_service_signing_client.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/name_service_signing_client.rs deleted file mode 100644 index 0a363f991b..0000000000 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/name_service_signing_client.rs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use async_trait::async_trait; -use nym_contracts_common::signing::MessageSignature; -use nym_name_service_common::{msg::ExecuteMsg as NameExecuteMsg, NameDetails, NameId, NymName}; - -use crate::nyxd::contract_traits::NymContractsProvider; -use crate::nyxd::{ - coin::Coin, cosmwasm_client::types::ExecuteResult, error::NyxdError, Fee, SigningCosmWasmClient, -}; -use crate::signing::signer::OfflineSigner; - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -pub trait NameServiceSigningClient { - async fn execute_name_service_contract( - &self, - fee: Option, - msg: NameExecuteMsg, - funds: Vec, - ) -> Result; - - async fn register_name( - &self, - name: NameDetails, - owner_signature: MessageSignature, - deposit: Coin, - fee: Option, - ) -> Result { - self.execute_name_service_contract( - fee, - NameExecuteMsg::Register { - name, - owner_signature, - }, - vec![deposit], - ) - .await - } - - async fn delete_name_by_id( - &self, - name_id: NameId, - fee: Option, - ) -> Result { - self.execute_name_service_contract(fee, NameExecuteMsg::DeleteId { name_id }, vec![]) - .await - } - - async fn delete_service_provider_by_name( - &self, - name: NymName, - fee: Option, - ) -> Result { - self.execute_name_service_contract(fee, NameExecuteMsg::DeleteName { name }, vec![]) - .await - } - - async fn update_deposit_required( - &self, - deposit_required: Coin, - fee: Option, - ) -> Result { - self.execute_name_service_contract( - fee, - NameExecuteMsg::UpdateDepositRequired { - deposit_required: deposit_required.into(), - }, - vec![], - ) - .await - } -} - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -impl NameServiceSigningClient for C -where - C: SigningCosmWasmClient + NymContractsProvider + Sync, - NyxdError: From<::Error>, -{ - async fn execute_name_service_contract( - &self, - fee: Option, - msg: NameExecuteMsg, - funds: Vec, - ) -> Result { - let name_service_contract_address = &self - .name_service_contract_address() - .ok_or_else(|| NyxdError::unavailable_contract_address("name service contract"))?; - - let fee = fee.unwrap_or(Fee::Auto(Some(self.simulated_gas_multiplier()))); - let memo = msg.default_memo(); - - let signer_address = &self.signer_addresses()?[0]; - self.execute( - signer_address, - name_service_contract_address, - &msg, - fee, - memo, - funds, - ) - .await - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::nyxd::contract_traits::tests::{mock_coin, IgnoreValue}; - - // it's enough that this compiles and clippy is happy about it - #[allow(dead_code)] - fn all_execute_variants_are_covered( - client: C, - msg: NameExecuteMsg, - ) { - match msg { - NameExecuteMsg::Register { - name, - owner_signature, - } => client - .register_name(name, owner_signature, mock_coin(), None) - .ignore(), - NameExecuteMsg::DeleteId { name_id } => { - client.delete_name_by_id(name_id, None).ignore() - } - NameExecuteMsg::DeleteName { name } => { - client.delete_service_provider_by_name(name, None).ignore() - } - NameExecuteMsg::UpdateDepositRequired { deposit_required } => client - .update_deposit_required(deposit_required.into(), None) - .ignore(), - }; - } -} diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/sp_directory_query_client.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/sp_directory_query_client.rs deleted file mode 100644 index 09279c543a..0000000000 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/sp_directory_query_client.rs +++ /dev/null @@ -1,142 +0,0 @@ -use crate::collect_paged; -use async_trait::async_trait; -use cosmrs::AccountId; -use nym_contracts_common::{signing::Nonce, ContractBuildInformation}; -use nym_service_provider_directory_common::{ - msg::QueryMsg as SpQueryMsg, - response::{ - ConfigResponse, PagedServicesListResponse, ServiceInfoResponse, ServicesListResponse, - }, - NymAddress, Service, ServiceId, -}; -use serde::Deserialize; - -use crate::nyxd::contract_traits::NymContractsProvider; -use crate::nyxd::{error::NyxdError, CosmWasmClient}; - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -pub trait SpDirectoryQueryClient { - async fn query_service_provider_contract(&self, query: SpQueryMsg) -> Result - where - for<'a> T: Deserialize<'a>; - - async fn get_service_config(&self) -> Result { - self.query_service_provider_contract(SpQueryMsg::Config {}) - .await - } - - async fn get_service_info( - &self, - service_id: ServiceId, - ) -> Result { - self.query_service_provider_contract(SpQueryMsg::ServiceId { service_id }) - .await - } - - async fn get_services_paged( - &self, - start_after: Option, - limit: Option, - ) -> Result { - self.query_service_provider_contract(SpQueryMsg::All { limit, start_after }) - .await - } - - async fn get_services_by_announcer( - &self, - announcer: AccountId, - ) -> Result { - self.query_service_provider_contract(SpQueryMsg::ByAnnouncer { - announcer: announcer.to_string(), - }) - .await - } - - async fn get_services_by_nym_address( - &self, - nym_address: NymAddress, - ) -> Result { - self.query_service_provider_contract(SpQueryMsg::ByNymAddress { nym_address }) - .await - } - - async fn get_sp_contract_version(&self) -> Result { - self.query_service_provider_contract(SpQueryMsg::GetContractVersion {}) - .await - } - - async fn get_sp_contract_cw2_version(&self) -> Result { - self.query_service_provider_contract(SpQueryMsg::GetCW2ContractVersion {}) - .await - } - - async fn get_service_signing_nonce(&self, address: &AccountId) -> Result { - self.query_service_provider_contract(SpQueryMsg::SigningNonce { - address: address.to_string(), - }) - .await - } -} - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -pub trait PagedSpDirectoryQueryClient: SpDirectoryQueryClient { - async fn get_all_services(&self) -> Result, NyxdError> { - collect_paged!(self, get_services_paged, services) - } -} - -#[async_trait] -impl PagedSpDirectoryQueryClient for T where T: SpDirectoryQueryClient {} - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -impl SpDirectoryQueryClient for C -where - C: CosmWasmClient + NymContractsProvider + Send + Sync, -{ - async fn query_service_provider_contract(&self, query: SpQueryMsg) -> Result - where - for<'a> T: Deserialize<'a>, - { - let sp_directory_contract_address = - &self.service_provider_contract_address().ok_or_else(|| { - NyxdError::unavailable_contract_address("service provider directory contract") - })?; - self.query_contract_smart(sp_directory_contract_address, &query) - .await - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::nyxd::contract_traits::tests::IgnoreValue; - - // it's enough that this compiles and clippy is happy about it - #[allow(dead_code)] - fn all_query_variants_are_covered( - client: C, - msg: SpQueryMsg, - ) { - match msg { - SpQueryMsg::ServiceId { service_id } => client.get_service_info(service_id).ignore(), - SpQueryMsg::ByAnnouncer { announcer } => client - .get_services_by_announcer(announcer.parse().unwrap()) - .ignore(), - SpQueryMsg::ByNymAddress { nym_address } => { - client.get_services_by_nym_address(nym_address).ignore() - } - SpQueryMsg::All { limit, start_after } => { - client.get_services_paged(start_after, limit).ignore() - } - SpQueryMsg::SigningNonce { address } => client - .get_service_signing_nonce(&address.parse().unwrap()) - .ignore(), - SpQueryMsg::Config {} => client.get_service_config().ignore(), - SpQueryMsg::GetContractVersion {} => client.get_sp_contract_version().ignore(), - SpQueryMsg::GetCW2ContractVersion {} => client.get_sp_contract_cw2_version().ignore(), - }; - } -} diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/sp_directory_signing_client.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/sp_directory_signing_client.rs deleted file mode 100644 index c1efde20f5..0000000000 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/sp_directory_signing_client.rs +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::nyxd::contract_traits::NymContractsProvider; -use crate::nyxd::{ - coin::Coin, cosmwasm_client::types::ExecuteResult, error::NyxdError, Fee, SigningCosmWasmClient, -}; -use crate::signing::signer::OfflineSigner; -use async_trait::async_trait; -use nym_contracts_common::signing::MessageSignature; -use nym_service_provider_directory_common::{ - msg::ExecuteMsg as SpExecuteMsg, NymAddress, ServiceDetails, ServiceId, -}; - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -pub trait SpDirectorySigningClient { - async fn execute_service_provider_directory_contract( - &self, - fee: Option, - msg: SpExecuteMsg, - funds: Vec, - ) -> Result; - - async fn announce_service_provider( - &self, - service: ServiceDetails, - owner_signature: MessageSignature, - deposit: Coin, - fee: Option, - ) -> Result { - self.execute_service_provider_directory_contract( - fee, - SpExecuteMsg::Announce { - service, - owner_signature, - }, - vec![deposit], - ) - .await - } - - async fn delete_service_provider_by_id( - &self, - service_id: ServiceId, - fee: Option, - ) -> Result { - self.execute_service_provider_directory_contract( - fee, - SpExecuteMsg::DeleteId { service_id }, - vec![], - ) - .await - } - - async fn delete_service_provider_by_nym_address( - &self, - nym_address: NymAddress, - fee: Option, - ) -> Result { - self.execute_service_provider_directory_contract( - fee, - SpExecuteMsg::DeleteNymAddress { nym_address }, - vec![], - ) - .await - } - - async fn update_deposit_required( - &self, - deposit_required: Coin, - fee: Option, - ) -> Result { - self.execute_service_provider_directory_contract( - fee, - SpExecuteMsg::UpdateDepositRequired { - deposit_required: deposit_required.into(), - }, - vec![], - ) - .await - } -} - -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] -impl SpDirectorySigningClient for C -where - C: SigningCosmWasmClient + NymContractsProvider + Sync, - NyxdError: From<::Error>, -{ - async fn execute_service_provider_directory_contract( - &self, - fee: Option, - msg: SpExecuteMsg, - funds: Vec, - ) -> Result { - let sp_directory_contract_address = - &self.service_provider_contract_address().ok_or_else(|| { - NyxdError::unavailable_contract_address("service provider directory contract") - })?; - - let fee = fee.unwrap_or(Fee::Auto(Some(self.simulated_gas_multiplier()))); - let memo = msg.default_memo(); - - let signer_address = &self.signer_addresses()?[0]; - self.execute( - signer_address, - sp_directory_contract_address, - &msg, - fee, - memo, - funds, - ) - .await - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::nyxd::contract_traits::tests::{mock_coin, IgnoreValue}; - - // it's enough that this compiles and clippy is happy about it - #[allow(dead_code)] - fn all_execute_variants_are_covered( - client: C, - msg: SpExecuteMsg, - ) { - match msg { - SpExecuteMsg::Announce { - service, - owner_signature, - } => client - .announce_service_provider(service, owner_signature, mock_coin(), None) - .ignore(), - SpExecuteMsg::DeleteId { service_id } => client - .delete_service_provider_by_id(service_id, None) - .ignore(), - SpExecuteMsg::DeleteNymAddress { nym_address } => client - .delete_service_provider_by_nym_address(nym_address, None) - .ignore(), - SpExecuteMsg::UpdateDepositRequired { deposit_required } => client - .update_deposit_required(deposit_required.into(), None) - .ignore(), - }; - } -} diff --git a/common/client-libs/validator-client/src/nyxd/mod.rs b/common/client-libs/validator-client/src/nyxd/mod.rs index 416bf7bb2f..0f337de5a1 100644 --- a/common/client-libs/validator-client/src/nyxd/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/mod.rs @@ -246,12 +246,6 @@ impl NyxdClient { self.config.contracts.multisig_contract_address = Some(address); } - pub fn set_service_provider_contract_address(&mut self, address: AccountId) { - self.config - .contracts - .service_provider_directory_contract_address = Some(address); - } - pub fn set_simulated_gas_multiplier(&mut self, multiplier: f32) { self.config.simulated_gas_multiplier = multiplier; } @@ -288,17 +282,6 @@ impl NymContractsProvider for NyxdClient { fn ephemera_contract_address(&self) -> Option<&AccountId> { self.config.contracts.ephemera_contract_address.as_ref() } - - fn name_service_contract_address(&self) -> Option<&AccountId> { - self.config.contracts.name_service_contract_address.as_ref() - } - - fn service_provider_contract_address(&self) -> Option<&AccountId> { - self.config - .contracts - .service_provider_directory_contract_address - .as_ref() - } } // queries diff --git a/common/commands/Cargo.toml b/common/commands/Cargo.toml index c9693a3c42..0649e4e876 100644 --- a/common/commands/Cargo.toml +++ b/common/commands/Cargo.toml @@ -46,8 +46,6 @@ nym-vesting-contract-common = { path = "../cosmwasm-smart-contracts/vesting-cont nym-coconut-bandwidth-contract-common = { path = "../cosmwasm-smart-contracts/coconut-bandwidth-contract" } nym-coconut-dkg-common = { path = "../cosmwasm-smart-contracts/coconut-dkg" } nym-multisig-contract-common = { path = "../cosmwasm-smart-contracts/multisig-contract" } -nym-service-provider-directory-common = { path = "../cosmwasm-smart-contracts/service-provider-directory" } -nym-name-service-common = { path = "../cosmwasm-smart-contracts/name-service" } nym-sphinx = { path = "../../common/nymsphinx" } nym-client-core = { path = "../../common/client-core" } nym-config = { path = "../../common/config" } diff --git a/common/commands/src/validator/mixnet/operators/mod.rs b/common/commands/src/validator/mixnet/operators/mod.rs index ce732be9e4..cde9dc3754 100644 --- a/common/commands/src/validator/mixnet/operators/mod.rs +++ b/common/commands/src/validator/mixnet/operators/mod.rs @@ -6,8 +6,6 @@ use clap::{Args, Subcommand}; pub mod gateway; pub mod identity_key; pub mod mixnode; -pub mod name; -pub mod service; #[derive(Debug, Args)] #[clap(args_conflicts_with_subcommands = true, subcommand_required = true)] @@ -23,10 +21,6 @@ pub enum MixnetOperatorsCommands { Mixnode(mixnode::MixnetOperatorsMixnode), /// Manage your gateway Gateway(gateway::MixnetOperatorsGateway), - /// Manage your service - ServiceProvider(service::MixnetOperatorsService), - /// Manage your registered name - Name(name::MixnetOperatorsName), /// Sign messages using your private identity key IdentityKey(identity_key::MixnetOperatorsIdentityKey), } diff --git a/common/commands/src/validator/mixnet/operators/name/delete.rs b/common/commands/src/validator/mixnet/operators/name/delete.rs deleted file mode 100644 index d93b432108..0000000000 --- a/common/commands/src/validator/mixnet/operators/name/delete.rs +++ /dev/null @@ -1,25 +0,0 @@ -use clap::Parser; -use log::{error, info}; -use nym_name_service_common::NameId; -use nym_validator_client::nyxd::{contract_traits::NameServiceSigningClient, error::NyxdError}; -use tap::TapFallible; - -use crate::context::SigningClient; - -#[derive(Debug, Parser)] -pub struct Args { - #[clap(long)] - pub id: NameId, -} - -pub async fn delete(args: Args, client: SigningClient) -> Result<(), NyxdError> { - info!("Deleting registered name alias with id {}", args.id); - - let res = client - .delete_name_by_id(args.id, None) - .await - .tap_err(|err| error!("Failed to delete name: {err:#?}"))?; - - info!("Deleted: {res:?}"); - Ok(()) -} diff --git a/common/commands/src/validator/mixnet/operators/name/mod.rs b/common/commands/src/validator/mixnet/operators/name/mod.rs deleted file mode 100644 index c4adb3301d..0000000000 --- a/common/commands/src/validator/mixnet/operators/name/mod.rs +++ /dev/null @@ -1,22 +0,0 @@ -use clap::{Args, Subcommand}; - -pub mod delete; -pub mod register; -pub mod register_sign_payload; - -#[derive(Debug, Args)] -#[clap(args_conflicts_with_subcommands = true, subcommand_required = true)] -pub struct MixnetOperatorsName { - #[clap(subcommand)] - pub command: MixnetOperatorsNameCommands, -} - -#[derive(Debug, Subcommand)] -pub enum MixnetOperatorsNameCommands { - /// Register a name alias for a nym address - Register(register::Args), - /// Delete name alias for a nym address - Delete(delete::Args), - /// Create base58-encoded payload required for producing valiid register signature. - CreateNameRegisterPayload(register_sign_payload::Args), -} diff --git a/common/commands/src/validator/mixnet/operators/name/register.rs b/common/commands/src/validator/mixnet/operators/name/register.rs deleted file mode 100644 index 54a4b1a20d..0000000000 --- a/common/commands/src/validator/mixnet/operators/name/register.rs +++ /dev/null @@ -1,53 +0,0 @@ -use clap::Parser; -use log::{error, info}; -use nym_contracts_common::signing::MessageSignature; -use nym_name_service_common::{Address, Coin, NameDetails, NymName}; -use nym_sphinx::addressing::clients::Recipient; -use nym_validator_client::nyxd::{contract_traits::NameServiceSigningClient, error::NyxdError}; -use tap::TapFallible; - -use crate::context::SigningClient; - -#[derive(Debug, Parser)] -pub struct Args { - /// Name alias - #[clap(long)] - pub name: NymName, - - /// Nym address that the alias is pointing to - #[clap(long)] - pub nym_address: Recipient, - - #[clap(long)] - pub signature: MessageSignature, - - /// Deposit to be made to the service provider directory, in curent DENOMINATION (e.g. 'unym') - #[clap(long)] - pub deposit: u128, -} - -pub async fn register(args: Args, client: SigningClient) -> Result<(), NyxdError> { - info!( - "Registering name alias '{}' for nym address '{}'", - args.name, args.nym_address - ); - - let address = Address::new(&args.nym_address.to_string()).expect("invalid address"); - let identity_key = address.client_id().to_string(); - let name = NameDetails { - name: args.name, - address, - identity_key, - }; - - let denom = client.current_chain_details().mix_denom.base.as_str(); - let deposit = Coin::new(args.deposit, denom); - - let res = client - .register_name(name, args.signature, deposit.into(), None) - .await - .tap_err(|err| error!("Failed to register name: {err:#?}"))?; - - info!("Registered name: {res:?}"); - Ok(()) -} diff --git a/common/commands/src/validator/mixnet/operators/name/register_sign_payload.rs b/common/commands/src/validator/mixnet/operators/name/register_sign_payload.rs deleted file mode 100644 index e293f23c2e..0000000000 --- a/common/commands/src/validator/mixnet/operators/name/register_sign_payload.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{ - context::SigningClient, - utils::{account_id_to_cw_addr, DataWrapper}, -}; - -use clap::Parser; -use cosmwasm_std::Coin; - -use nym_bin_common::output_format::OutputFormat; -use nym_name_service_common::{ - signing_types::construct_name_register_sign_payload, Address, NymName, -}; -use nym_sphinx::addressing::clients::Recipient; -use nym_validator_client::nyxd::{contract_traits::NameServiceQueryClient, error::NyxdError}; - -#[derive(Debug, Parser)] -pub struct Args { - // The name to register. - #[arg(long)] - pub name: NymName, - - /// The nym address the name should point to. - #[arg(long)] - pub nym_address: Recipient, - - #[arg(long)] - pub amount: u128, - - #[arg(short, long, default_value_t = OutputFormat::default())] - output: OutputFormat, -} - -pub async fn create_payload(args: Args, client: SigningClient) -> Result<(), NyxdError> { - let address = Address::new(&args.nym_address.to_string()).expect("invalid address"); - let identity_key = address.client_id().to_string(); - let name = nym_name_service_common::NameDetails { - name: args.name, - address, - identity_key, - }; - - let denom = client.current_chain_details().mix_denom.base.as_str(); - let deposit = Coin::new(args.amount, denom); - - let nonce = match client.get_name_signing_nonce(&client.address()).await { - Ok(nonce) => nonce, - Err(err) => { - eprint!( - "failed to query for the signing nonce of {}: {err}", - client.address() - ); - return Err(err); - } - }; - - let address = account_id_to_cw_addr(&client.address()); - let payload = construct_name_register_sign_payload(nonce, address, deposit, name); - let wrapper = DataWrapper::new(payload.to_base58_string().unwrap()); - println!("{}", args.output.format(&wrapper)); - - Ok(()) -} diff --git a/common/commands/src/validator/mixnet/operators/service/announce.rs b/common/commands/src/validator/mixnet/operators/service/announce.rs deleted file mode 100644 index b61652254e..0000000000 --- a/common/commands/src/validator/mixnet/operators/service/announce.rs +++ /dev/null @@ -1,45 +0,0 @@ -use clap::Parser; -use log::info; -use nym_contracts_common::signing::MessageSignature; -use nym_service_provider_directory_common::{Coin, NymAddress, ServiceDetails, ServiceType}; -use nym_validator_client::nyxd::contract_traits::SpDirectorySigningClient; - -use crate::context::SigningClient; - -#[derive(Debug, Parser)] -pub struct Args { - #[clap(long)] - pub nym_address: String, - - #[clap(long)] - pub signature: MessageSignature, - - /// Deposit to be made to the service provider directory, in curent DENOMINATION (e.g. 'unym') - #[clap(long)] - pub deposit: u128, - - #[clap(long)] - pub identity_key: String, -} - -pub async fn announce(args: Args, client: SigningClient) { - info!("Annoucing service provider"); - - let nym_address = NymAddress::Address(args.nym_address); - let service_type = ServiceType::NetworkRequester; - let service = ServiceDetails { - nym_address, - service_type, - identity_key: args.identity_key, - }; - - let denom = client.current_chain_details().mix_denom.base.as_str(); - let deposit = Coin::new(args.deposit, denom); - - let res = client - .announce_service_provider(service, args.signature, deposit.into(), None) - .await - .expect("Failed to announce service provider"); - - info!("Announced service provider: {res:?}"); -} diff --git a/common/commands/src/validator/mixnet/operators/service/announce_sign_payload.rs b/common/commands/src/validator/mixnet/operators/service/announce_sign_payload.rs deleted file mode 100644 index f3dc4e5e66..0000000000 --- a/common/commands/src/validator/mixnet/operators/service/announce_sign_payload.rs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{ - context::SigningClient, - utils::{account_id_to_cw_addr, DataWrapper}, -}; - -use clap::Parser; -use cosmwasm_std::Coin; - -use nym_bin_common::output_format::OutputFormat; -use nym_service_provider_directory_common::{ - signing_types::construct_service_provider_announce_sign_payload, NymAddress, - ServiceType::NetworkRequester, -}; -use nym_sphinx::addressing::clients::Recipient; -use nym_validator_client::nyxd::contract_traits::SpDirectoryQueryClient; - -#[derive(Debug, Parser)] -pub struct Args { - #[clap(long)] - pub nym_address: Recipient, - - #[clap(long)] - pub amount: u128, - - #[clap(long)] - pub identity_key: String, - - #[clap(short, long, default_value_t = OutputFormat::default())] - output: OutputFormat, -} - -pub async fn create_payload(args: Args, client: SigningClient) { - let service = nym_service_provider_directory_common::ServiceDetails { - nym_address: NymAddress::new(&args.nym_address.to_string()), - service_type: NetworkRequester, - identity_key: args.identity_key, - }; - - let denom = client.current_chain_details().mix_denom.base.as_str(); - let deposit = Coin::new(args.amount, denom); - - let nonce = match client.get_service_signing_nonce(&client.address()).await { - Ok(nonce) => nonce, - Err(err) => { - eprint!( - "failed to query for the signing nonce of {}: {err}", - client.address() - ); - return; - } - }; - - let address = account_id_to_cw_addr(&client.address()); - let payload = - construct_service_provider_announce_sign_payload(nonce, address, deposit, service); - let wrapper = DataWrapper::new(payload.to_base58_string().unwrap()); - println!("{}", args.output.format(&wrapper)) -} diff --git a/common/commands/src/validator/mixnet/operators/service/delete.rs b/common/commands/src/validator/mixnet/operators/service/delete.rs deleted file mode 100644 index 3d0ca4a676..0000000000 --- a/common/commands/src/validator/mixnet/operators/service/delete.rs +++ /dev/null @@ -1,23 +0,0 @@ -use clap::Parser; -use log::info; -use nym_service_provider_directory_common::ServiceId; -use nym_validator_client::nyxd::contract_traits::SpDirectorySigningClient; - -use crate::context::SigningClient; - -#[derive(Debug, Parser)] -pub struct Args { - #[clap(long)] - pub id: ServiceId, -} - -pub async fn delete(args: Args, client: SigningClient) { - info!("Deleting service provider with id {}", args.id); - - let res = client - .delete_service_provider_by_id(args.id, None) - .await - .expect("Failed to delete service provider"); - - info!("Deleted: {res:?}"); -} diff --git a/common/commands/src/validator/mixnet/operators/service/mod.rs b/common/commands/src/validator/mixnet/operators/service/mod.rs deleted file mode 100644 index 1367c51bf6..0000000000 --- a/common/commands/src/validator/mixnet/operators/service/mod.rs +++ /dev/null @@ -1,23 +0,0 @@ -use clap::{Args, Subcommand}; - -pub mod announce; -pub mod announce_sign_payload; -pub mod delete; - -#[derive(Debug, Args)] -#[clap(args_conflicts_with_subcommands = true, subcommand_required = true)] -pub struct MixnetOperatorsService { - #[clap(subcommand)] - pub command: MixnetOperatorsServiceCommands, -} - -#[allow(clippy::large_enum_variant)] -#[derive(Debug, Subcommand)] -pub enum MixnetOperatorsServiceCommands { - /// Announce service provider to the world - Announce(announce::Args), - /// Delete entry for service provider from the directory - Delete(delete::Args), - /// Create base58-encoded payload required for producing valid announce signature. - CreateServiceAnnounceSignPayload(announce_sign_payload::Args), -} diff --git a/common/commands/src/validator/mixnet/query/mod.rs b/common/commands/src/validator/mixnet/query/mod.rs index 2a6c04c312..6d86e6c7b9 100644 --- a/common/commands/src/validator/mixnet/query/mod.rs +++ b/common/commands/src/validator/mixnet/query/mod.rs @@ -5,8 +5,6 @@ use clap::{Args, Subcommand}; pub mod query_all_gateways; pub mod query_all_mixnodes; -pub mod query_all_names; -pub mod query_all_service_providers; #[derive(Debug, Args)] #[clap(args_conflicts_with_subcommands = true, subcommand_required = true)] @@ -21,8 +19,4 @@ pub enum MixnetQueryCommands { Mixnodes(query_all_mixnodes::Args), /// Query gateways Gateways(query_all_gateways::Args), - /// Query announced service-providers - ServiceProviders(query_all_service_providers::Args), - /// Query registed names - Names(query_all_names::Args), } diff --git a/common/commands/src/validator/mixnet/query/query_all_names.rs b/common/commands/src/validator/mixnet/query/query_all_names.rs deleted file mode 100644 index fa75752c6c..0000000000 --- a/common/commands/src/validator/mixnet/query/query_all_names.rs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::context::QueryClientWithNyxd; -use crate::utils::show_error; -use clap::Parser; -use comfy_table::Table; -use nym_validator_client::client::NymApiClientExt; -use nym_validator_client::nym_api::error::NymAPIError; - -#[derive(Debug, Parser)] -pub struct Args { - #[clap(value_parser)] - #[clap(help = "Optionally, the registered name to display")] - pub name: Option, -} - -pub async fn query(args: Args, client: &QueryClientWithNyxd) { - log::trace!("Querying all registered names"); - - match client.nym_api.get_registered_names().await { - Ok(res) => { - if let Some(name) = args.name { - let name = res.names.iter().find(|name_entry| { - name_entry.name.name.to_string().eq_ignore_ascii_case(&name) - }); - println!( - "{}", - ::serde_json::to_string_pretty(&name).expect("json formatting error") - ); - } else { - let mut table = Table::new(); - - table.set_header(vec!["Name Id", "Owner", "Nym Address", "Name"]); - for name_entry in res.names { - table.add_row(vec![ - name_entry.id.to_string(), - name_entry.owner.to_string(), - name_entry.name.address.to_string(), - name_entry.name.name.to_string(), - ]); - } - - println!("The registered names in the directory are:"); - println!("{table}"); - } - } - Err(NymAPIError::NotFound) => { - println!("nym-api reports no name endpoint available"); - } - Err(e) => show_error(e), - } -} diff --git a/common/commands/src/validator/mixnet/query/query_all_service_providers.rs b/common/commands/src/validator/mixnet/query/query_all_service_providers.rs deleted file mode 100644 index 74ef07a637..0000000000 --- a/common/commands/src/validator/mixnet/query/query_all_service_providers.rs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::context::QueryClientWithNyxd; -use crate::utils::show_error; -use clap::Parser; -use comfy_table::Table; -use nym_validator_client::client::NymApiClientExt; -use nym_validator_client::nym_api::error::NymAPIError; - -#[derive(Debug, Parser)] -pub struct Args { - #[clap(value_parser)] - #[clap(help = "Optionally, the service provider to display")] - pub nym_address: Option, -} - -pub async fn query(args: Args, client: &QueryClientWithNyxd) { - match client.nym_api.get_service_providers().await { - Ok(res) => { - if let Some(nym_address) = args.nym_address { - let service = res.services.iter().find(|service| { - service - .service - .nym_address - .to_string() - .eq_ignore_ascii_case(&nym_address) - }); - println!( - "{}", - ::serde_json::to_string_pretty(&service).expect("json formatting error") - ); - } else { - let mut table = Table::new(); - - table.set_header(vec!["Service Id", "Announcer", "Type", "Nym Address"]); - for service in res.services { - table.add_row(vec![ - service.service_id.to_string(), - service.announcer.to_string(), - service.service.service_type.to_string(), - service.service.nym_address.to_string(), - ]); - } - - println!("The service providers in the directory are:"); - println!("{table}"); - } - } - Err(NymAPIError::NotFound) => { - println!("nym-api reports no service provider endpoint available"); - } - Err(e) => show_error(e), - } -} diff --git a/common/cosmwasm-smart-contracts/name-service/Cargo.toml b/common/cosmwasm-smart-contracts/name-service/Cargo.toml deleted file mode 100644 index 5e3a3081bd..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "nym-name-service-common" -version = "0.1.0" -edition = "2021" -license.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -cosmwasm-schema = { workspace = true } -cosmwasm-std = { workspace = true } -cw2 = { workspace = true, optional = true } -cw-controllers = { workspace = true } -cw-utils = { workspace = true } -nym-contracts-common = { path = "../contracts-common", version = "0.5.0" } -serde = { workspace = true, features = ["derive"] } -thiserror = { workspace = true } - -[features] -schema = ["cw2"] diff --git a/common/cosmwasm-smart-contracts/name-service/src/error.rs b/common/cosmwasm-smart-contracts/name-service/src/error.rs deleted file mode 100644 index 24d62c23cf..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/src/error.rs +++ /dev/null @@ -1,83 +0,0 @@ -use cosmwasm_std::{Addr, StdError}; -use cw_controllers::AdminError; -use nym_contracts_common::signing::verifier::ApiVerifierError; -use thiserror::Error; - -use crate::{Address, NameId, NymName}; - -#[derive(Error, Debug, PartialEq)] -pub enum NameServiceError { - #[error("{0}")] - Std(#[from] StdError), - - #[error("{0}")] - AdminError(#[from] AdminError), - - #[error("name id entry not found: {name_id}")] - NotFound { name_id: NameId }, - - #[error("name entry not found: {name}")] - NameNotFound { name: NymName }, - - #[error("{sender} is not registrator of name")] - Unauthorized { sender: Addr }, - - #[error("deposit required to register a name")] - DepositRequired { source: cw_utils::PaymentError }, - - #[error("insufficiant deposit: {funds}, required: {deposit_required}")] - InsufficientDeposit { - funds: cosmwasm_std::Uint128, - deposit_required: cosmwasm_std::Uint128, - }, - - #[error("deposit too large: {funds}, required: {deposit_required}")] - TooLargeDeposit { - funds: cosmwasm_std::Uint128, - deposit_required: cosmwasm_std::Uint128, - }, - - #[error("reached the max number of names ({max_names}) for owner {owner}")] - ReachedMaxNamesForOwner { max_names: u32, owner: Addr }, - - #[error("reached the max number of names ({max_names}) for address {0}", address.to_string())] - ReachedMaxNamesForAddress { max_names: u32, address: Address }, - - #[error("failed to parse {value} into a valid SemVer version: {error_message}")] - SemVerFailure { - value: String, - error_message: String, - }, - - #[error("failed to recover ed25519 public key from its base58 representation: {0}")] - MalformedEd25519IdentityKey(String), - - #[error("failed to recover ed25519 signature from its base58 representation: {0}")] - MalformedEd25519Signature(String), - - #[error("provided ed25519 signature did not verify correctly")] - InvalidEd25519Signature, - - #[error("failed to verify message signature: {source}")] - SignatureVerificationFailure { - #[from] - source: ApiVerifierError, - }, - - #[error("duplicate entries detected for name: {name}")] - DuplicateNames { name: NymName }, - - #[error("name already registered: {name}")] - NameAlreadyRegistered { name: NymName }, - - #[error("invalid nym address format: {0}")] - InvalidNymAddress(String), - - #[error("client identity in nym address does not match the provided identity key")] - IdentityKeyMismatch { - address: Address, - identity_key: String, - }, -} - -pub type Result = std::result::Result; diff --git a/common/cosmwasm-smart-contracts/name-service/src/events.rs b/common/cosmwasm-smart-contracts/name-service/src/events.rs deleted file mode 100644 index 5bf65e606d..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/src/events.rs +++ /dev/null @@ -1,66 +0,0 @@ -use cosmwasm_std::{Coin, Event}; - -use crate::RegisteredName; - -pub enum NameEventType { - Register, - DeleteId, - DeleteName, - UpdateDepositRequired, -} - -impl std::fmt::Display for NameEventType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - NameEventType::Register => write!(f, "register"), - NameEventType::DeleteId => write!(f, "delete_id"), - NameEventType::DeleteName => write!(f, "delete_name"), - NameEventType::UpdateDepositRequired => write!(f, "update_deposit_required"), - } - } -} - -impl From for String { - fn from(event_type: NameEventType) -> Self { - event_type.to_string() - } -} - -pub const ACTION: &str = "action"; - -pub const NAME_ID: &str = "name_id"; -pub const NAME: &str = "name"; -pub const OWNER: &str = "owner"; - -pub const DEPOSIT_REQUIRED: &str = "deposit_required"; - -pub fn new_register_event(name: RegisteredName) -> Event { - Event::new(NameEventType::Register) - .add_attribute(ACTION, NameEventType::Register) - .add_attribute(NAME_ID, name.id.to_string()) - .add_attribute(NAME, name.name.name.to_string()) - .add_attribute(name.name.address.event_tag(), name.name.address.to_string()) - .add_attribute(OWNER, name.owner.to_string()) -} - -pub fn new_delete_id_event(name: RegisteredName) -> Event { - Event::new(NameEventType::DeleteId) - .add_attribute(ACTION, NameEventType::DeleteId) - .add_attribute(NAME_ID, name.id.to_string()) - .add_attribute(NAME, name.name.name.to_string()) - .add_attribute(name.name.address.event_tag(), name.name.address.to_string()) -} - -pub fn new_delete_name_event(name: RegisteredName) -> Event { - Event::new(NameEventType::DeleteId) - .add_attribute(ACTION, NameEventType::DeleteName) - .add_attribute(NAME_ID, name.id.to_string()) - .add_attribute(NAME, name.name.name.to_string()) - .add_attribute(name.name.address.event_tag(), name.name.address.to_string()) -} - -pub fn new_update_deposit_required_event(deposit_required: Coin) -> Event { - Event::new(NameEventType::UpdateDepositRequired) - .add_attribute(ACTION, NameEventType::UpdateDepositRequired) - .add_attribute(DEPOSIT_REQUIRED, deposit_required.to_string()) -} diff --git a/common/cosmwasm-smart-contracts/name-service/src/lib.rs b/common/cosmwasm-smart-contracts/name-service/src/lib.rs deleted file mode 100644 index 71a702b7c1..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/src/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -pub mod error; -pub mod events; -pub mod msg; -pub mod response; -pub mod signing_types; -pub mod types; - -// Re-export all types at the top-level -pub use types::*; - -pub use cosmwasm_std::{Addr, Coin, Decimal, Fraction}; diff --git a/common/cosmwasm-smart-contracts/name-service/src/msg.rs b/common/cosmwasm-smart-contracts/name-service/src/msg.rs deleted file mode 100644 index cdac95c215..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/src/msg.rs +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{Address, NameDetails, NameId, NymName}; -use cosmwasm_schema::cw_serde; -use cosmwasm_std::Coin; -use nym_contracts_common::signing::MessageSignature; - -#[cfg(feature = "schema")] -use crate::{ - response::{ConfigResponse, NamesListResponse, PagedNamesListResponse}, - types::RegisteredName, -}; -#[cfg(feature = "schema")] -use cosmwasm_schema::QueryResponses; -#[cfg(feature = "schema")] -use nym_contracts_common::{signing::Nonce, ContractBuildInformation}; - -#[cw_serde] -pub struct InstantiateMsg { - pub deposit_required: Coin, -} - -impl InstantiateMsg { - pub fn new(deposit_required: Coin) -> Self { - Self { deposit_required } - } -} - -#[cw_serde] -pub struct MigrateMsg {} - -#[cw_serde] -pub enum ExecuteMsg { - /// Announcing a name pointing to a nym-address - Register { - name: NameDetails, - owner_signature: MessageSignature, - }, - - /// Delete a name entry by id - DeleteId { name_id: NameId }, - - /// Delete a name entry by name - DeleteName { name: NymName }, - - /// Change the deposit required for announcing a name - UpdateDepositRequired { deposit_required: Coin }, -} - -impl ExecuteMsg { - pub fn delete_id(name_id: NameId) -> Self { - ExecuteMsg::DeleteId { name_id } - } - - pub fn default_memo(&self) -> String { - match self { - ExecuteMsg::Register { - name, - owner_signature: _, - } => { - format!("registering {} as name: {}", name.address, name.name) - } - ExecuteMsg::DeleteId { name_id } => { - format!("deleting name with id {name_id}") - } - ExecuteMsg::DeleteName { name } => { - format!("deleting name: {name}") - } - ExecuteMsg::UpdateDepositRequired { deposit_required } => { - format!("updating the deposit required to {deposit_required}") - } - } - } -} - -#[cw_serde] -#[cfg_attr(feature = "schema", derive(QueryResponses))] -pub enum QueryMsg { - /// Query the name by it's assigned id - #[cfg_attr(feature = "schema", returns(RegisteredName))] - NameId { name_id: NameId }, - - /// Query the names by the registrator - #[cfg_attr(feature = "schema", returns(NamesListResponse))] - ByOwner { owner: String }, - - #[cfg_attr(feature = "schema", returns(RegisteredName))] - ByName { name: NymName }, - - #[cfg_attr(feature = "schema", returns(NamesListResponse))] - ByAddress { address: Address }, - - #[cfg_attr(feature = "schema", returns(PagedNamesListResponse))] - All { - limit: Option, - start_after: Option, - }, - - #[cfg_attr(feature = "schema", returns(Nonce))] - SigningNonce { address: String }, - - #[cfg_attr(feature = "schema", returns(ConfigResponse))] - Config {}, - - /// Gets build information of this contract, such as the commit hash used for the build or rustc version. - #[cfg_attr(feature = "schema", returns(ContractBuildInformation))] - GetContractVersion {}, - - /// Gets the stored contract version information that's required by the CW2 spec interface for migrations. - #[serde(rename = "get_cw2_contract_version")] - #[cfg_attr(feature = "schema", returns(cw2::ContractVersion))] - GetCW2ContractVersion {}, -} - -impl QueryMsg { - pub fn all() -> QueryMsg { - QueryMsg::All { - limit: None, - start_after: None, - } - } -} diff --git a/common/cosmwasm-smart-contracts/name-service/src/response.rs b/common/cosmwasm-smart-contracts/name-service/src/response.rs deleted file mode 100644 index 162021d7c7..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/src/response.rs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{NameId, RegisteredName}; -use cosmwasm_schema::cw_serde; -use cosmwasm_std::Coin; - -#[cw_serde] -pub struct NamesListResponse { - pub names: Vec, -} - -impl NamesListResponse { - pub fn new(names: Vec) -> NamesListResponse { - NamesListResponse { names } - } -} - -impl From<&[RegisteredName]> for NamesListResponse { - fn from(names: &[RegisteredName]) -> Self { - NamesListResponse { - names: names.to_vec(), - } - } -} - -#[cw_serde] -pub struct PagedNamesListResponse { - pub names: Vec, - pub per_page: usize, - - /// Field indicating paging information for the following queries if the caller wishes to get further entries. - pub start_next_after: Option, -} - -impl PagedNamesListResponse { - pub fn new( - names: Vec, - per_page: usize, - start_next_after: Option, - ) -> PagedNamesListResponse { - PagedNamesListResponse { - names, - per_page, - start_next_after, - } - } -} - -#[cw_serde] -pub struct ConfigResponse { - pub deposit_required: Coin, -} diff --git a/common/cosmwasm-smart-contracts/name-service/src/signing_types.rs b/common/cosmwasm-smart-contracts/name-service/src/signing_types.rs deleted file mode 100644 index 80a19a7e3d..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/src/signing_types.rs +++ /dev/null @@ -1,32 +0,0 @@ -use cosmwasm_std::{Addr, Coin}; -use nym_contracts_common::signing::{ - ContractMessageContent, MessageType, Nonce, SignableMessage, SigningPurpose, -}; -use serde::Serialize; - -use crate::NameDetails; - -pub type SignableNameRegisterMsg = SignableMessage>; - -#[derive(Serialize)] -pub struct NameRegister { - name: NameDetails, -} - -impl SigningPurpose for NameRegister { - fn message_type() -> MessageType { - MessageType::new("name-register") - } -} - -pub fn construct_name_register_sign_payload( - nonce: Nonce, - sender: Addr, - deposit: Coin, - name: NameDetails, -) -> SignableNameRegisterMsg { - let payload = NameRegister { name }; - let proxy = None; - let content = ContractMessageContent::new(sender, proxy, vec![deposit], payload); - SignableMessage::new(nonce, content) -} diff --git a/common/cosmwasm-smart-contracts/name-service/src/types.rs b/common/cosmwasm-smart-contracts/name-service/src/types.rs deleted file mode 100644 index 58746576a6..0000000000 --- a/common/cosmwasm-smart-contracts/name-service/src/types.rs +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Coin}; -use nym_contracts_common::IdentityKey; -use std::{ - fmt::{Display, Formatter}, - str::FromStr, -}; -use thiserror::Error; - -use crate::error::{NameServiceError, Result}; - -/// The directory of names are indexed by [`NameId`]. -pub type NameId = u32; - -#[cw_serde] -pub struct RegisteredName { - /// Unique id assigned to the registerd name. - pub id: NameId, - - /// The registerd name details. - pub name: NameDetails, - - /// name owner. - pub owner: Addr, - - /// Block height at which the name was added. - pub block_height: u64, - - /// The deposit used to announce the name. - pub deposit: Coin, -} - -impl RegisteredName { - // Shortcut for getting the actual name - pub fn entry(&self) -> &NymName { - &self.name.name - } -} - -#[cw_serde] -pub struct NameDetails { - /// The name pointing to the nym address - pub name: NymName, - - /// The address of the name alias. - pub address: Address, - - /// The identity key of the registered name. - pub identity_key: IdentityKey, -} - -/// String representation of a nym address, which is of the form -/// client_id.client_enc@gateway_id. -/// NOTE: entirely unvalidated. -#[cw_serde] -pub enum Address { - NymAddress(NymAddressInner), - // Possible extension: - //Gateway(String) -} - -#[cw_serde] -pub struct NymAddressInner { - client_id: String, - client_enc: String, - gateway_id: String, -} - -// ADDRESS . ENCRYPTION @ GATEWAY_ID -impl std::fmt::Display for NymAddressInner { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "{}.{}@{}", - self.client_id, self.client_enc, self.gateway_id - ) - } -} - -impl Address { - /// Create a new nym address. - pub fn new(address: &str) -> Result { - parse_nym_address(address) - .map(Self::NymAddress) - .ok_or_else(|| NameServiceError::InvalidNymAddress(address.to_string())) - } - - pub fn client_id(&self) -> &str { - match self { - Address::NymAddress(address) => &address.client_id, - } - } - - pub fn client_enc(&self) -> &str { - match self { - Address::NymAddress(address) => &address.client_enc, - } - } - - pub fn gateway_id(&self) -> &str { - match self { - Address::NymAddress(address) => &address.gateway_id, - } - } - - pub fn event_tag(&self) -> &str { - match self { - Address::NymAddress(_) => "nym_address", - //Address::Gateway(_) => "gatway_address", - } - } -} - -impl Display for Address { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - match self { - Address::NymAddress(address) => write!(f, "{}", address), - } - } -} - -// A valid nym address is of the form client_id.client_enc@gateway_id -fn parse_nym_address(address: &str) -> Option { - let parts: Vec<&str> = address.split('@').collect(); - if parts.len() != 2 { - return None; - } - - let client_part = parts[0]; - let gateway_part = parts[1]; - - // The client part consists of two parts separated by a dot - let client_parts: Vec<&str> = client_part.split('.').collect(); - if client_parts.len() != 2 { - return None; - } - - // Check that the gateway part does not contain any dots - if gateway_part.contains('.') { - return None; - } - - Some(NymAddressInner { - client_id: client_parts[0].to_string(), - client_enc: client_parts[1].to_string(), - gateway_id: gateway_part.to_string(), - }) -} - -/// Name stored and pointing a to a nym-address -#[cw_serde] -pub struct NymName(String); - -#[derive(Debug, Error)] -pub enum NymNameError { - #[error("invalid name")] - InvalidName, -} - -/// Defines what names are allowed -fn is_valid_name_char(c: char) -> bool { - // Normal lowercase letters - (c.is_alphabetic() && c.is_lowercase()) - // or numbers - || c.is_numeric() - // special case hyphen or underscore - || c == '-' || c == '_' -} - -impl NymName { - pub fn new(name: &str) -> Result { - // We are a bit restrictive in which names we allow, to start out with. Consider relaxing - // this in the future. - if !name.chars().all(is_valid_name_char) { - return Err(NymNameError::InvalidName); - } - Ok(Self(name.to_string())) - } - - pub fn as_str(&self) -> &str { - &self.0 - } -} - -impl FromStr for NymName { - type Err = NymNameError; - - fn from_str(s: &str) -> Result { - Self::new(s) - } -} - -impl Display for NymName { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.0) - } -} - -#[cfg(test)] -mod tests { - use super::NymName; - - #[test] - fn parse_nym_name() { - // Test some valid cases - assert!(NymName::new("foo").is_ok()); - assert!(NymName::new("foo-bar").is_ok()); - assert!(NymName::new("foo-bar-123").is_ok()); - assert!(NymName::new("foo_bar").is_ok()); - assert!(NymName::new("foo_bar_123").is_ok()); - - // And now test all some invalid ones - assert!(NymName::new("Foo").is_err()); - assert!(NymName::new("foo bar").is_err()); - assert!(NymName::new("foo!bar").is_err()); - assert!(NymName::new("foo#bar").is_err()); - assert!(NymName::new("foo$bar").is_err()); - assert!(NymName::new("foo%bar").is_err()); - assert!(NymName::new("foo&bar").is_err()); - assert!(NymName::new("foo'bar").is_err()); - assert!(NymName::new("foo(bar").is_err()); - assert!(NymName::new("foo)bar").is_err()); - assert!(NymName::new("foo*bar").is_err()); - assert!(NymName::new("foo+bar").is_err()); - assert!(NymName::new("foo,bar").is_err()); - assert!(NymName::new("foo.bar").is_err()); - assert!(NymName::new("foo.bar").is_err()); - assert!(NymName::new("foo/bar").is_err()); - assert!(NymName::new("foo/bar").is_err()); - assert!(NymName::new("foo:bar").is_err()); - assert!(NymName::new("foo;bar").is_err()); - assert!(NymName::new("foobar").is_err()); - assert!(NymName::new("foo?bar").is_err()); - assert!(NymName::new("foo@bar").is_err()); - assert!(NymName::new("fooBar").is_err()); - assert!(NymName::new("foo[bar").is_err()); - assert!(NymName::new("foo\"bar").is_err()); - assert!(NymName::new("foo\\bar").is_err()); - assert!(NymName::new("foo]bar").is_err()); - assert!(NymName::new("foo^bar").is_err()); - assert!(NymName::new("foo`bar").is_err()); - assert!(NymName::new("foo{bar").is_err()); - assert!(NymName::new("foo|bar").is_err()); - assert!(NymName::new("foo}bar").is_err()); - assert!(NymName::new("foo~bar").is_err()); - } -} diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/Cargo.toml b/common/cosmwasm-smart-contracts/service-provider-directory/Cargo.toml deleted file mode 100644 index 341c985e34..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "nym-service-provider-directory-common" -version = "0.1.0" -edition = "2021" -license.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -cosmwasm-schema = { workspace = true } -cosmwasm-std = { workspace = true } -cw2 = { workspace = true, optional = true } -cw-controllers = { workspace = true } -cw-utils = { workspace = true } -nym-contracts-common = { path = "../contracts-common", version = "0.5.0" } -thiserror = { workspace = true } - -[features] -schema = ["cw2"] diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/src/error.rs b/common/cosmwasm-smart-contracts/service-provider-directory/src/error.rs deleted file mode 100644 index 9d103be9c8..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/src/error.rs +++ /dev/null @@ -1,68 +0,0 @@ -use cosmwasm_std::{Addr, StdError}; -use cw_controllers::AdminError; -use nym_contracts_common::signing::verifier::ApiVerifierError; -use thiserror::Error; - -use crate::{NymAddress, ServiceId}; - -#[derive(Error, Debug, PartialEq)] -pub enum SpContractError { - #[error("{0}")] - Std(#[from] StdError), - - #[error("{0}")] - AdminError(#[from] AdminError), - - #[error("service not found: {service_id}")] - NotFound { service_id: ServiceId }, - - #[error("{sender} is not announcer of service")] - Unauthorized { sender: Addr }, - - #[error("deposit required to announce service")] - DepositRequired { source: cw_utils::PaymentError }, - - #[error("insufficiant deposit: {funds}, required: {deposit_required}")] - InsufficientDeposit { - funds: cosmwasm_std::Uint128, - deposit_required: cosmwasm_std::Uint128, - }, - - #[error("deposit too large: {funds}, required: {deposit_required}")] - TooLargeDeposit { - funds: cosmwasm_std::Uint128, - deposit_required: cosmwasm_std::Uint128, - }, - - #[error("reached the max number of providers ({max_providers}) for announcer {announcer}")] - ReachedMaxProvidersForAdmin { max_providers: u32, announcer: Addr }, - - #[error("reached the max number of aliases ({max_aliases}) for nym address {0}", nym_address.to_string())] - ReachedMaxAliasesForNymAddress { - max_aliases: u32, - nym_address: NymAddress, - }, - - #[error("failed to parse {value} into a valid SemVer version: {error_message}")] - SemVerFailure { - value: String, - error_message: String, - }, - - #[error("Failed to recover ed25519 public key from its base58 representation - {0}")] - MalformedEd25519IdentityKey(String), - - #[error("Failed to recover ed25519 signature from its base58 representation - {0}")] - MalformedEd25519Signature(String), - - #[error("Provided ed25519 signature did not verify correctly")] - InvalidEd25519Signature, - - #[error("failed to verify message signature: {source}")] - SignatureVerificationFailure { - #[from] - source: ApiVerifierError, - }, -} - -pub type Result = std::result::Result; diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/src/events.rs b/common/cosmwasm-smart-contracts/service-provider-directory/src/events.rs deleted file mode 100644 index 80ce9c3593..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/src/events.rs +++ /dev/null @@ -1,58 +0,0 @@ -use cosmwasm_std::{Coin, Event}; - -use crate::{Service, ServiceId}; - -pub enum ServiceProviderEventType { - Announce, - DeleteId, - DeleteNymAddress, - UpdateDepositRequired, -} - -impl std::fmt::Display for ServiceProviderEventType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - ServiceProviderEventType::Announce => write!(f, "announce"), - ServiceProviderEventType::DeleteId => write!(f, "delete_id"), - ServiceProviderEventType::DeleteNymAddress => write!(f, "delete_nym_address"), - ServiceProviderEventType::UpdateDepositRequired => write!(f, "update_deposit_required"), - } - } -} - -impl From for String { - fn from(event_type: ServiceProviderEventType) -> Self { - event_type.to_string() - } -} - -pub const ACTION: &str = "action"; - -pub const SERVICE_ID: &str = "service_id"; -pub const SERVICE_TYPE: &str = "service_type"; -pub const NYM_ADDRESS: &str = "nym_address"; -pub const OWNER: &str = "owner"; - -pub const DEPOSIT_REQUIRED: &str = "deposit_required"; - -pub fn new_announce_event(service_id: ServiceId, service: Service) -> Event { - Event::new(ServiceProviderEventType::Announce) - .add_attribute(ACTION, ServiceProviderEventType::Announce) - .add_attribute(SERVICE_ID, service_id.to_string()) - .add_attribute(SERVICE_TYPE, service.service.service_type.to_string()) - .add_attribute(NYM_ADDRESS, service.service.nym_address.to_string()) - .add_attribute(OWNER, service.announcer.to_string()) -} - -pub fn new_delete_id_event(service: Service) -> Event { - Event::new(ServiceProviderEventType::DeleteId) - .add_attribute(ACTION, ServiceProviderEventType::DeleteId) - .add_attribute(SERVICE_ID, service.service_id.to_string()) - .add_attribute(NYM_ADDRESS, service.service.nym_address.to_string()) -} - -pub fn new_update_deposit_required_event(deposit_required: Coin) -> Event { - Event::new(ServiceProviderEventType::UpdateDepositRequired) - .add_attribute(ACTION, ServiceProviderEventType::UpdateDepositRequired) - .add_attribute(DEPOSIT_REQUIRED, deposit_required.to_string()) -} diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/src/lib.rs b/common/cosmwasm-smart-contracts/service-provider-directory/src/lib.rs deleted file mode 100644 index 71a702b7c1..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/src/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -pub mod error; -pub mod events; -pub mod msg; -pub mod response; -pub mod signing_types; -pub mod types; - -// Re-export all types at the top-level -pub use types::*; - -pub use cosmwasm_std::{Addr, Coin, Decimal, Fraction}; diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/src/msg.rs b/common/cosmwasm-smart-contracts/service-provider-directory/src/msg.rs deleted file mode 100644 index 0c7928e079..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/src/msg.rs +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{NymAddress, ServiceDetails, ServiceId}; -use cosmwasm_schema::cw_serde; -use cosmwasm_std::Coin; -use nym_contracts_common::signing::MessageSignature; - -#[cfg(feature = "schema")] -use crate::{ - response::{ConfigResponse, PagedServicesListResponse, ServicesListResponse}, - types::Service, -}; -#[cfg(feature = "schema")] -use cosmwasm_schema::QueryResponses; -#[cfg(feature = "schema")] -use nym_contracts_common::{signing::Nonce, ContractBuildInformation}; - -#[cw_serde] -pub struct InstantiateMsg { - pub deposit_required: Coin, -} - -impl InstantiateMsg { - pub fn new(deposit_required: Coin) -> Self { - Self { deposit_required } - } -} - -#[cw_serde] -pub struct MigrateMsg {} - -#[cw_serde] -pub enum ExecuteMsg { - Announce { - service: ServiceDetails, - owner_signature: MessageSignature, - }, - DeleteId { - service_id: ServiceId, - }, - DeleteNymAddress { - nym_address: NymAddress, - }, - UpdateDepositRequired { - deposit_required: Coin, - }, -} - -impl ExecuteMsg { - pub fn delete_id(service_id: ServiceId) -> Self { - ExecuteMsg::DeleteId { service_id } - } - - pub fn default_memo(&self) -> String { - match self { - ExecuteMsg::Announce { - service, - owner_signature: _, - } => format!( - "announcing {} as type {}", - service.nym_address, service.service_type - ), - ExecuteMsg::DeleteId { service_id } => { - format!("deleting service with service id {service_id}") - } - ExecuteMsg::DeleteNymAddress { nym_address } => { - format!("deleting service with nym address {nym_address}") - } - ExecuteMsg::UpdateDepositRequired { deposit_required } => { - format!("updating the deposit required to {deposit_required}") - } - } - } -} - -#[cw_serde] -#[cfg_attr(feature = "schema", derive(QueryResponses))] -pub enum QueryMsg { - #[cfg_attr(feature = "schema", returns(Service))] - ServiceId { service_id: ServiceId }, - - #[cfg_attr(feature = "schema", returns(ServicesListResponse))] - ByAnnouncer { announcer: String }, - - #[cfg_attr(feature = "schema", returns(ServicesListResponse))] - ByNymAddress { nym_address: NymAddress }, - - #[cfg_attr(feature = "schema", returns(PagedServicesListResponse))] - All { - limit: Option, - start_after: Option, - }, - - #[cfg_attr(feature = "schema", returns(Nonce))] - SigningNonce { address: String }, - - #[cfg_attr(feature = "schema", returns(ConfigResponse))] - Config {}, - - /// Gets build information of this contract, such as the commit hash used for the build or rustc version. - #[cfg_attr(feature = "schema", returns(ContractBuildInformation))] - GetContractVersion {}, - - /// Gets the stored contract version information that's required by the CW2 spec interface for migrations. - #[serde(rename = "get_cw2_contract_version")] - #[cfg_attr(feature = "schema", returns(cw2::ContractVersion))] - GetCW2ContractVersion {}, -} - -impl QueryMsg { - pub fn all() -> QueryMsg { - QueryMsg::All { - limit: None, - start_after: None, - } - } -} diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/src/response.rs b/common/cosmwasm-smart-contracts/service-provider-directory/src/response.rs deleted file mode 100644 index dd9392c2d9..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/src/response.rs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{Service, ServiceId}; -use cosmwasm_schema::cw_serde; -use cosmwasm_std::Coin; - -#[cw_serde] -pub struct ServiceInfoResponse { - pub service_id: ServiceId, - pub service: Option, -} - -#[cw_serde] -pub struct ServicesListResponse { - pub services: Vec, -} - -impl ServicesListResponse { - pub fn new(services: Vec) -> ServicesListResponse { - ServicesListResponse { services } - } -} - -impl From<&[Service]> for ServicesListResponse { - fn from(services: &[Service]) -> Self { - Self { - services: services.to_vec(), - } - } -} - -#[cw_serde] -pub struct PagedServicesListResponse { - pub services: Vec, - pub per_page: usize, - - /// Field indicating paging information for the following queries if the caller wishes to get further entries. - pub start_next_after: Option, -} - -impl PagedServicesListResponse { - pub fn new( - services: Vec, - per_page: usize, - start_next_after: Option, - ) -> PagedServicesListResponse { - PagedServicesListResponse { - services, - per_page, - start_next_after, - } - } -} - -#[cw_serde] -pub struct ConfigResponse { - pub deposit_required: Coin, -} diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/src/signing_types.rs b/common/cosmwasm-smart-contracts/service-provider-directory/src/signing_types.rs deleted file mode 100644 index fb9752d10a..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/src/signing_types.rs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::ServiceDetails; -use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Coin}; -use nym_contracts_common::signing::{ - ContractMessageContent, MessageType, Nonce, SignableMessage, SigningPurpose, -}; - -pub type SignableServiceProviderAnnounceMsg = - SignableMessage>; - -#[cw_serde] -pub struct ServiceProviderAnnounce { - service: ServiceDetails, -} - -impl SigningPurpose for ServiceProviderAnnounce { - fn message_type() -> MessageType { - MessageType::new("service-provider-announce") - } -} - -pub fn construct_service_provider_announce_sign_payload( - nonce: Nonce, - sender: Addr, - deposit: Coin, - service: ServiceDetails, -) -> SignableServiceProviderAnnounceMsg { - let payload = ServiceProviderAnnounce { service }; - let proxy = None; - let content = ContractMessageContent::new(sender, proxy, vec![deposit], payload); - SignableMessage::new(nonce, content) -} diff --git a/common/cosmwasm-smart-contracts/service-provider-directory/src/types.rs b/common/cosmwasm-smart-contracts/service-provider-directory/src/types.rs deleted file mode 100644 index 845c05b768..0000000000 --- a/common/cosmwasm-smart-contracts/service-provider-directory/src/types.rs +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Coin}; -use nym_contracts_common::IdentityKey; -use std::fmt::{Display, Formatter}; - -/// The directory of services are indexed by [`ServiceId`]. -pub type ServiceId = u32; - -#[cw_serde] -pub struct Service { - /// Unique id assigned to the anounced service. - pub service_id: ServiceId, - /// The announced service. - pub service: ServiceDetails, - /// Address of the service owner. - pub announcer: Addr, - /// Block height at which the service was added. - pub block_height: u64, - /// The deposit used to announce the service. - pub deposit: Coin, -} - -#[cw_serde] -pub struct ServiceDetails { - /// The address of the service. - pub nym_address: NymAddress, - /// The service type. - pub service_type: ServiceType, - /// The identity key of the service. - pub identity_key: IdentityKey, -} - -/// The types of addresses supported. -#[cw_serde] -pub enum NymAddress { - /// String representation of a nym address, which is of the form - /// client_id.client_enc@gateway_id. - Address(String), - // String name that can looked up in the nym-name-service contract (once it exists) - //Name(String), -} - -impl NymAddress { - /// Create a new nym address. - pub fn new(address: &str) -> Self { - Self::Address(address.to_string()) - } - - pub fn as_str(&self) -> &str { - match self { - NymAddress::Address(address) => address, - //NymAddress::Name(name) => name, - } - } -} - -impl Display for NymAddress { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.as_str()) - } -} - -/// The type of services provider supported -#[cw_serde] -pub enum ServiceType { - NetworkRequester, -} - -impl std::fmt::Display for ServiceType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let service_type = match self { - ServiceType::NetworkRequester => "network_requester", - }; - write!(f, "{service_type}") - } -} diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index cd7002d7c3..83c95bd9d7 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -840,101 +840,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.59", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - [[package]] name = "generic-array" version = "0.12.4" @@ -1382,46 +1287,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "nym-name-service" -version = "0.1.0" -dependencies = [ - "anyhow", - "bs58 0.4.0", - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-multi-test", - "cw-storage-plus", - "cw-utils", - "cw2", - "nym-contracts-common", - "nym-crypto", - "nym-name-service-common", - "nym-sphinx-addressing", - "rand", - "rand_chacha", - "rstest", - "semver", - "serde", - "thiserror", - "vergen", -] - -[[package]] -name = "nym-name-service-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "cw2", - "nym-contracts-common", - "serde", - "thiserror", -] - [[package]] name = "nym-pemstore" version = "0.3.0" @@ -1429,53 +1294,6 @@ dependencies = [ "pem", ] -[[package]] -name = "nym-service-provider-directory" -version = "0.1.0" -dependencies = [ - "anyhow", - "bs58 0.4.0", - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-multi-test", - "cw-storage-plus", - "cw-utils", - "cw2", - "nym-contracts-common", - "nym-crypto", - "nym-service-provider-directory-common", - "rand_chacha", - "rstest", - "semver", - "serde", - "thiserror", - "vergen", -] - -[[package]] -name = "nym-service-provider-directory-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "cw2", - "nym-contracts-common", - "thiserror", -] - -[[package]] -name = "nym-sphinx-addressing" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-sphinx-types", - "serde", - "thiserror", -] - [[package]] name = "nym-sphinx-types" version = "0.2.0" @@ -1555,18 +1373,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkcs8" version = "0.9.0" @@ -1772,32 +1578,6 @@ dependencies = [ "subtle 2.4.1", ] -[[package]] -name = "rstest" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de1bb486a691878cd320c2f0d319ba91eeaa2e894066d8b5f8f117c000e9d962" -dependencies = [ - "futures", - "futures-timer", - "rstest_macros", - "rustc_version", -] - -[[package]] -name = "rstest_macros" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290ca1a1c8ca7edb7c3283bd44dc35dd54fdec6253a3912e201ba1072018fca8" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "rustc_version", - "syn 1.0.109", - "unicode-ident", -] - [[package]] name = "rustc_version" version = "0.4.0" @@ -1983,15 +1763,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - [[package]] name = "sphinx-packet" version = "0.1.1" diff --git a/contracts/Cargo.toml b/contracts/Cargo.toml index 245c083ae4..175bbcc767 100644 --- a/contracts/Cargo.toml +++ b/contracts/Cargo.toml @@ -8,8 +8,6 @@ members = [ "mixnet-vesting-integration-tests", "multisig/cw3-flex-multisig", "multisig/cw4-group", - "name-service", - "service-provider-directory", "vesting", ] diff --git a/contracts/Makefile b/contracts/Makefile index 941959bf0c..519bab061f 100644 --- a/contracts/Makefile +++ b/contracts/Makefile @@ -1,4 +1,4 @@ -schema: coconut-bandwidth-schema coconut-dkg-schema mixnet-schema name-service-schema service-provider-directory-schema vesting-schema multisig-schema group-schema +schema: coconut-bandwidth-schema coconut-dkg-schema mixnet-schema vesting-schema multisig-schema group-schema coconut-bandwidth-schema: $(MAKE) -C coconut-bandwidth generate-schema @@ -9,12 +9,6 @@ coconut-dkg-schema: mixnet-schema: $(MAKE) -C mixnet generate-schema -name-service-schema: - $(MAKE) -C name-service generate-schema - -service-provider-directory-schema: - $(MAKE) -C service-provider-directory generate-schema - vesting-schema: $(MAKE) -C vesting generate-schema diff --git a/contracts/name-service/.cargo/config b/contracts/name-service/.cargo/config deleted file mode 100644 index 2fb2c1afdb..0000000000 --- a/contracts/name-service/.cargo/config +++ /dev/null @@ -1,4 +0,0 @@ -[alias] -wasm = "build --release --lib --target wasm32-unknown-unknown" -unit-test = "test --lib" -schema = "run --bin schema --features=schema-gen" \ No newline at end of file diff --git a/contracts/name-service/Makefile b/contracts/name-service/Makefile deleted file mode 100644 index f138e2c879..0000000000 --- a/contracts/name-service/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -generate-schema: - cargo schema \ No newline at end of file diff --git a/contracts/name-service/build.rs b/contracts/name-service/build.rs deleted file mode 100644 index bd26c886d2..0000000000 --- a/contracts/name-service/build.rs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use vergen::{vergen, Config}; - -fn main() { - let mut config = Config::default(); - if std::env::var("DOCS_RS").is_ok() { - // If we don't have access to git information, such as in a docs.rs build, don't error - *config.git_mut().skip_if_error_mut() = true; - } - vergen(config).expect("failed to extract build metadata"); -} diff --git a/contracts/name-service/schema/nym-name-service.json b/contracts/name-service/schema/nym-name-service.json deleted file mode 100644 index 049c130fbb..0000000000 --- a/contracts/name-service/schema/nym-name-service.json +++ /dev/null @@ -1,1382 +0,0 @@ -{ - "contract_name": "nym-name-service", - "contract_version": "0.1.0", - "idl_version": "1.0.0", - "instantiate": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "execute": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Announcing a name pointing to a nym-address", - "type": "object", - "required": [ - "register" - ], - "properties": { - "register": { - "type": "object", - "required": [ - "name", - "owner_signature" - ], - "properties": { - "name": { - "$ref": "#/definitions/NameDetails" - }, - "owner_signature": { - "$ref": "#/definitions/MessageSignature" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Delete a name entry by id", - "type": "object", - "required": [ - "delete_id" - ], - "properties": { - "delete_id": { - "type": "object", - "required": [ - "name_id" - ], - "properties": { - "name_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Delete a name entry by name", - "type": "object", - "required": [ - "delete_name" - ], - "properties": { - "delete_name": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "$ref": "#/definitions/NymName" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Change the deposit required for announcing a name", - "type": "object", - "required": [ - "update_deposit_required" - ], - "properties": { - "update_deposit_required": { - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "MessageSignature": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "query": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "Query the name by it's assigned id", - "type": "object", - "required": [ - "name_id" - ], - "properties": { - "name_id": { - "type": "object", - "required": [ - "name_id" - ], - "properties": { - "name_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Query the names by the registrator", - "type": "object", - "required": [ - "by_owner" - ], - "properties": { - "by_owner": { - "type": "object", - "required": [ - "owner" - ], - "properties": { - "owner": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_name" - ], - "properties": { - "by_name": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "$ref": "#/definitions/NymName" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_address" - ], - "properties": { - "by_address": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "$ref": "#/definitions/Address" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "all" - ], - "properties": { - "all": { - "type": "object", - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "signing_nonce" - ], - "properties": { - "signing_nonce": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets build information of this contract, such as the commit hash used for the build or rustc version.", - "type": "object", - "required": [ - "get_contract_version" - ], - "properties": { - "get_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets the stored contract version information that's required by the CW2 spec interface for migrations.", - "type": "object", - "required": [ - "get_cw2_contract_version" - ], - "properties": { - "get_cw2_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - } - } - }, - "migrate": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MigrateMsg", - "type": "object", - "additionalProperties": false - }, - "sudo": null, - "responses": { - "all": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "PagedNamesListResponse", - "type": "object", - "required": [ - "names", - "per_page" - ], - "properties": { - "names": { - "type": "array", - "items": { - "$ref": "#/definitions/RegisteredName" - } - }, - "per_page": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "start_next_after": { - "description": "Field indicating paging information for the following queries if the caller wishes to get further entries.", - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "RegisteredName": { - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "by_address": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "NamesListResponse", - "type": "object", - "required": [ - "names" - ], - "properties": { - "names": { - "type": "array", - "items": { - "$ref": "#/definitions/RegisteredName" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "RegisteredName": { - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "by_name": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "RegisteredName", - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "by_owner": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "NamesListResponse", - "type": "object", - "required": [ - "names" - ], - "properties": { - "names": { - "type": "array", - "items": { - "$ref": "#/definitions/RegisteredName" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "RegisteredName": { - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "config": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ConfigResponse", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "get_c_w2_contract_version": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractVersion", - "type": "object", - "required": [ - "contract", - "version" - ], - "properties": { - "contract": { - "description": "contract is the crate name of the implementing contract, eg. `crate:cw20-base` we will use other prefixes for other languages, and their standard global namespacing", - "type": "string" - }, - "version": { - "description": "version is any string that this implementation knows. It may be simple counter \"1\", \"2\". or semantic version on release tags \"v0.7.0\", or some custom feature flag list. the only code that needs to understand the version parsing is code that knows how to migrate from the given contract (and is tied to it's implementation somehow)", - "type": "string" - } - }, - "additionalProperties": false - }, - "get_contract_version": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractBuildInformation", - "type": "object", - "required": [ - "build_timestamp", - "build_version", - "commit_branch", - "commit_sha", - "commit_timestamp", - "rustc_version" - ], - "properties": { - "build_timestamp": { - "description": "Provides the build timestamp, for example `2021-02-23T20:14:46.558472672+00:00`.", - "type": "string" - }, - "build_version": { - "description": "Provides the build version, for example `0.1.0-9-g46f83e1`.", - "type": "string" - }, - "commit_branch": { - "description": "Provides the name of the git branch that was used for the build, for example `master`.", - "type": "string" - }, - "commit_sha": { - "description": "Provides the hash of the commit that was used for the build, for example `46f83e112520533338245862d366f6a02cef07d4`.", - "type": "string" - }, - "commit_timestamp": { - "description": "Provides the timestamp of the commit that was used for the build, for example `2021-02-23T08:08:02-05:00`.", - "type": "string" - }, - "rustc_version": { - "description": "Provides the rustc version that was used for the build, for example `1.52.0-nightly`.", - "type": "string" - } - }, - "additionalProperties": false - }, - "name_id": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "RegisteredName", - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "signing_nonce": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "uint32", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - } -} diff --git a/contracts/name-service/schema/raw/execute.json b/contracts/name-service/schema/raw/execute.json deleted file mode 100644 index 22eadf827b..0000000000 --- a/contracts/name-service/schema/raw/execute.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Announcing a name pointing to a nym-address", - "type": "object", - "required": [ - "register" - ], - "properties": { - "register": { - "type": "object", - "required": [ - "name", - "owner_signature" - ], - "properties": { - "name": { - "$ref": "#/definitions/NameDetails" - }, - "owner_signature": { - "$ref": "#/definitions/MessageSignature" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Delete a name entry by id", - "type": "object", - "required": [ - "delete_id" - ], - "properties": { - "delete_id": { - "type": "object", - "required": [ - "name_id" - ], - "properties": { - "name_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Delete a name entry by name", - "type": "object", - "required": [ - "delete_name" - ], - "properties": { - "delete_name": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "$ref": "#/definitions/NymName" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Change the deposit required for announcing a name", - "type": "object", - "required": [ - "update_deposit_required" - ], - "properties": { - "update_deposit_required": { - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "MessageSignature": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/instantiate.json b/contracts/name-service/schema/raw/instantiate.json deleted file mode 100644 index 73867fda63..0000000000 --- a/contracts/name-service/schema/raw/instantiate.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/migrate.json b/contracts/name-service/schema/raw/migrate.json deleted file mode 100644 index 7fbe8c5708..0000000000 --- a/contracts/name-service/schema/raw/migrate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MigrateMsg", - "type": "object", - "additionalProperties": false -} diff --git a/contracts/name-service/schema/raw/query.json b/contracts/name-service/schema/raw/query.json deleted file mode 100644 index 38f26f8914..0000000000 --- a/contracts/name-service/schema/raw/query.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "Query the name by it's assigned id", - "type": "object", - "required": [ - "name_id" - ], - "properties": { - "name_id": { - "type": "object", - "required": [ - "name_id" - ], - "properties": { - "name_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Query the names by the registrator", - "type": "object", - "required": [ - "by_owner" - ], - "properties": { - "by_owner": { - "type": "object", - "required": [ - "owner" - ], - "properties": { - "owner": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_name" - ], - "properties": { - "by_name": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "$ref": "#/definitions/NymName" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_address" - ], - "properties": { - "by_address": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "$ref": "#/definitions/Address" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "all" - ], - "properties": { - "all": { - "type": "object", - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "signing_nonce" - ], - "properties": { - "signing_nonce": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets build information of this contract, such as the commit hash used for the build or rustc version.", - "type": "object", - "required": [ - "get_contract_version" - ], - "properties": { - "get_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets the stored contract version information that's required by the CW2 spec interface for migrations.", - "type": "object", - "required": [ - "get_cw2_contract_version" - ], - "properties": { - "get_cw2_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/response_to_all.json b/contracts/name-service/schema/raw/response_to_all.json deleted file mode 100644 index 24cd05dc11..0000000000 --- a/contracts/name-service/schema/raw/response_to_all.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "PagedNamesListResponse", - "type": "object", - "required": [ - "names", - "per_page" - ], - "properties": { - "names": { - "type": "array", - "items": { - "$ref": "#/definitions/RegisteredName" - } - }, - "per_page": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "start_next_after": { - "description": "Field indicating paging information for the following queries if the caller wishes to get further entries.", - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "RegisteredName": { - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/response_to_by_address.json b/contracts/name-service/schema/raw/response_to_by_address.json deleted file mode 100644 index ad54c03055..0000000000 --- a/contracts/name-service/schema/raw/response_to_by_address.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "NamesListResponse", - "type": "object", - "required": [ - "names" - ], - "properties": { - "names": { - "type": "array", - "items": { - "$ref": "#/definitions/RegisteredName" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "RegisteredName": { - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/response_to_by_name.json b/contracts/name-service/schema/raw/response_to_by_name.json deleted file mode 100644 index fb7d77259e..0000000000 --- a/contracts/name-service/schema/raw/response_to_by_name.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "RegisteredName", - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/response_to_by_owner.json b/contracts/name-service/schema/raw/response_to_by_owner.json deleted file mode 100644 index ad54c03055..0000000000 --- a/contracts/name-service/schema/raw/response_to_by_owner.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "NamesListResponse", - "type": "object", - "required": [ - "names" - ], - "properties": { - "names": { - "type": "array", - "items": { - "$ref": "#/definitions/RegisteredName" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "RegisteredName": { - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/response_to_config.json b/contracts/name-service/schema/raw/response_to_config.json deleted file mode 100644 index 16420c1130..0000000000 --- a/contracts/name-service/schema/raw/response_to_config.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ConfigResponse", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/response_to_get_c_w2_contract_version.json b/contracts/name-service/schema/raw/response_to_get_c_w2_contract_version.json deleted file mode 100644 index 3ded8c84d9..0000000000 --- a/contracts/name-service/schema/raw/response_to_get_c_w2_contract_version.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractVersion", - "type": "object", - "required": [ - "contract", - "version" - ], - "properties": { - "contract": { - "description": "contract is the crate name of the implementing contract, eg. `crate:cw20-base` we will use other prefixes for other languages, and their standard global namespacing", - "type": "string" - }, - "version": { - "description": "version is any string that this implementation knows. It may be simple counter \"1\", \"2\". or semantic version on release tags \"v0.7.0\", or some custom feature flag list. the only code that needs to understand the version parsing is code that knows how to migrate from the given contract (and is tied to it's implementation somehow)", - "type": "string" - } - }, - "additionalProperties": false -} diff --git a/contracts/name-service/schema/raw/response_to_get_contract_version.json b/contracts/name-service/schema/raw/response_to_get_contract_version.json deleted file mode 100644 index 60ae65f3d1..0000000000 --- a/contracts/name-service/schema/raw/response_to_get_contract_version.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractBuildInformation", - "type": "object", - "required": [ - "build_timestamp", - "build_version", - "commit_branch", - "commit_sha", - "commit_timestamp", - "rustc_version" - ], - "properties": { - "build_timestamp": { - "description": "Provides the build timestamp, for example `2021-02-23T20:14:46.558472672+00:00`.", - "type": "string" - }, - "build_version": { - "description": "Provides the build version, for example `0.1.0-9-g46f83e1`.", - "type": "string" - }, - "commit_branch": { - "description": "Provides the name of the git branch that was used for the build, for example `master`.", - "type": "string" - }, - "commit_sha": { - "description": "Provides the hash of the commit that was used for the build, for example `46f83e112520533338245862d366f6a02cef07d4`.", - "type": "string" - }, - "commit_timestamp": { - "description": "Provides the timestamp of the commit that was used for the build, for example `2021-02-23T08:08:02-05:00`.", - "type": "string" - }, - "rustc_version": { - "description": "Provides the rustc version that was used for the build, for example `1.52.0-nightly`.", - "type": "string" - } - }, - "additionalProperties": false -} diff --git a/contracts/name-service/schema/raw/response_to_name_id.json b/contracts/name-service/schema/raw/response_to_name_id.json deleted file mode 100644 index fb7d77259e..0000000000 --- a/contracts/name-service/schema/raw/response_to_name_id.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "RegisteredName", - "type": "object", - "required": [ - "block_height", - "deposit", - "id", - "name", - "owner" - ], - "properties": { - "block_height": { - "description": "Block height at which the name was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the name.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "id": { - "description": "Unique id assigned to the registerd name.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "name": { - "description": "The registerd name details.", - "allOf": [ - { - "$ref": "#/definitions/NameDetails" - } - ] - }, - "owner": { - "description": "name owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Address": { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id. NOTE: entirely unvalidated.", - "oneOf": [ - { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddressInner" - } - }, - "additionalProperties": false - } - ] - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NameDetails": { - "type": "object", - "required": [ - "address", - "identity_key", - "name" - ], - "properties": { - "address": { - "description": "The address of the name alias.", - "allOf": [ - { - "$ref": "#/definitions/Address" - } - ] - }, - "identity_key": { - "description": "The identity key of the registered name.", - "type": "string" - }, - "name": { - "description": "The name pointing to the nym address", - "allOf": [ - { - "$ref": "#/definitions/NymName" - } - ] - } - }, - "additionalProperties": false - }, - "NymAddressInner": { - "type": "object", - "required": [ - "client_enc", - "client_id", - "gateway_id" - ], - "properties": { - "client_enc": { - "type": "string" - }, - "client_id": { - "type": "string" - }, - "gateway_id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "NymName": { - "description": "Name stored and pointing a to a nym-address", - "type": "string" - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/name-service/schema/raw/response_to_signing_nonce.json b/contracts/name-service/schema/raw/response_to_signing_nonce.json deleted file mode 100644 index de85c3e56e..0000000000 --- a/contracts/name-service/schema/raw/response_to_signing_nonce.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "uint32", - "type": "integer", - "format": "uint32", - "minimum": 0.0 -} diff --git a/contracts/name-service/src/bin/schema.rs b/contracts/name-service/src/bin/schema.rs deleted file mode 100644 index 92f8f3f6ab..0000000000 --- a/contracts/name-service/src/bin/schema.rs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use cosmwasm_schema::write_api; -use nym_name_service_common::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; - -fn main() { - write_api! { - instantiate: InstantiateMsg, - query: QueryMsg, - execute: ExecuteMsg, - migrate: MigrateMsg, - } -} diff --git a/contracts/name-service/src/constants.rs b/contracts/name-service/src/constants.rs deleted file mode 100644 index 0b87f40264..0000000000 --- a/contracts/name-service/src/constants.rs +++ /dev/null @@ -1,18 +0,0 @@ -// We limit the these for simplicity and to avoid having to deal with paging. -pub const MAX_NUMBER_OF_NAMES_PER_OWNER: u32 = 100; -pub const MAX_NUMBER_OF_NAMES_FOR_ADDRESS: u32 = 100; - -pub const NAME_DEFAULT_RETRIEVAL_LIMIT: u32 = 100; -pub const NAME_MAX_RETRIEVAL_LIMIT: u32 = 150; - -// Storage keys -pub const CONFIG_KEY: &str = "config"; -pub const ADMIN_KEY: &str = "admin"; -pub const NAME_ID_COUNTER_KEY: &str = "nidc"; - -pub const NAMES_PK_NAMESPACE: &str = "nanames"; -pub const NAMES_OWNER_IDX_NAMESPACE: &str = "naowner"; -pub const NAMES_ADDRESS_IDX_NAMESPACE: &str = "naaddress"; -pub const NAMES_NAME_IDX_NAMESPACE: &str = "naname"; - -pub const SIGNING_NONCES_NAMESPACE: &str = "nasn"; diff --git a/contracts/name-service/src/contract.rs b/contracts/name-service/src/contract.rs deleted file mode 100644 index 43a560450b..0000000000 --- a/contracts/name-service/src/contract.rs +++ /dev/null @@ -1,384 +0,0 @@ -use crate::{ - state::{self, Config}, - NameServiceError, Result, -}; -use cosmwasm_std::{to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response}; -use nym_name_service_common::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; -use semver::Version; - -mod execute; -mod query; - -// version info for migration info -const CONTRACT_NAME: &str = "crate:nym-name-service"; -const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); - -pub fn instantiate( - mut deps: DepsMut<'_>, - _env: Env, - info: MessageInfo, - msg: InstantiateMsg, -) -> Result { - state::set_admin(deps.branch(), info.sender.clone())?; - - let config = Config { - deposit_required: msg.deposit_required, - }; - cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - state::save_config(deps.storage, &config)?; - - Ok(Response::new() - .add_attribute("method", "instantiate") - .add_attribute("admin", info.sender)) -} - -pub fn migrate( - deps: DepsMut<'_>, - _env: Env, - _msg: MigrateMsg, -) -> Result { - // Note: don't remove this particular bit of code as we have to ALWAYS check whether we have to - // update the stored version - let version: Version = CONTRACT_VERSION.parse().map_err(|error: semver::Error| { - NameServiceError::SemVerFailure { - value: CONTRACT_VERSION.to_string(), - error_message: error.to_string(), - } - })?; - - let storage_version_raw = cw2::get_contract_version(deps.storage)?.version; - let storage_version: Version = - storage_version_raw - .parse() - .map_err(|error: semver::Error| NameServiceError::SemVerFailure { - value: storage_version_raw, - error_message: error.to_string(), - })?; - - if storage_version < version { - cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - - // If state structure changed in any contract version in the way migration is needed, it - // should occur here, for example anything from `crate::queued_migrations::` - } - - Ok(Response::new()) -} - -pub fn execute( - deps: DepsMut<'_>, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, -) -> Result { - match msg { - ExecuteMsg::Register { - name, - owner_signature, - } => execute::register(deps, env, info, name, owner_signature), - ExecuteMsg::DeleteId { name_id } => execute::delete_id(deps, info, name_id), - ExecuteMsg::DeleteName { name } => execute::delete_name(deps, info, name), - ExecuteMsg::UpdateDepositRequired { deposit_required } => { - execute::update_deposit_required(deps, info, deposit_required) - } - } -} - -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result { - let response = match msg { - QueryMsg::NameId { name_id } => to_binary(&query::query_id(deps, name_id)?), - QueryMsg::ByOwner { owner } => to_binary(&query::query_owner(deps, owner)?), - QueryMsg::ByAddress { address } => to_binary(&query::query_address(deps, address)?), - QueryMsg::ByName { name } => to_binary(&query::query_name(deps, name)?), - QueryMsg::All { limit, start_after } => { - to_binary(&query::query_all_paged(deps, limit, start_after)?) - } - QueryMsg::SigningNonce { address } => { - to_binary(&query::query_current_signing_nonce(deps, address)?) - } - QueryMsg::Config {} => to_binary(&query::query_config(deps)?), - QueryMsg::GetContractVersion {} => to_binary(&query::query_contract_version()), - QueryMsg::GetCW2ContractVersion {} => to_binary(&cw2::get_contract_version(deps.storage)?), - }; - Ok(response?) -} - -#[cfg(test)] -mod tests { - use super::*; - - use crate::test_helpers::{ - assert::{ - assert_config, assert_current_nonce, assert_empty, assert_name, assert_names, - assert_not_found, - }, - fixture::new_name_details_with_sign, - helpers::{get_attribute, nyms, test_rng}, - }; - - use cosmwasm_std::{ - testing::{mock_dependencies, mock_env, mock_info}, - Addr, Coin, - }; - use nym_name_service_common::{NameId, RegisteredName}; - - const DENOM: &str = "unym"; - - #[test] - fn instantiate_contract() { - let mut deps = mock_dependencies(); - let msg = InstantiateMsg { - deposit_required: Coin::new(100u128, DENOM), - }; - let info = mock_info("creator", &[]); - let admin = info.sender.clone(); - - // Instantiate contract - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Check that it worked by querying the config, and checking that the list of names is - // empty - assert_config(deps.as_ref(), &admin, Coin::new(100u128, DENOM)); - assert_empty(deps.as_ref()); - } - - #[test] - fn register_fails_deposit_too_small() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(nyms(100)); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - let deposit = nyms(99); - let owner = "steve"; - let (name, owner_signature) = - new_name_details_with_sign(deps.as_mut(), &mut rng, "foo", owner, deposit); - let msg = ExecuteMsg::Register { - name, - owner_signature, - }; - - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(owner, &[nyms(99)]), - msg.clone() - ) - .unwrap_err(), - NameServiceError::InsufficientDeposit { - funds: 99u128.into(), - deposit_required: 100u128.into(), - } - ); - - // Since we signed for 99unym deposit. - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(owner, &[nyms(100)]), - msg - ) - .unwrap_err(), - NameServiceError::InvalidEd25519Signature, - ); - } - - #[test] - fn register_fails_deposit_too_large() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(nyms(100)); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - let deposit = nyms(101); - let owner = "steve"; - let (name, owner_signature) = - new_name_details_with_sign(deps.as_mut(), &mut rng, "foo", owner, deposit); - let msg = ExecuteMsg::Register { - name, - owner_signature, - }; - - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(owner, &[nyms(101)]), - msg.clone() - ) - .unwrap_err(), - NameServiceError::TooLargeDeposit { - funds: 101u128.into(), - deposit_required: 100u128.into(), - } - ); - - // Since we signed for 101unym deposit. - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(owner, &[nyms(100)]), - msg - ) - .unwrap_err(), - NameServiceError::InvalidEd25519Signature, - ); - } - - #[test] - fn register_fails_owner_mismatch() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(nyms(100)); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Setup - let deposit = nyms(100); - let owner = "steve"; - let (name, owner_signature) = - new_name_details_with_sign(deps.as_mut(), &mut rng, "my-name", owner, deposit); - - // Register - let msg = ExecuteMsg::Register { - name, - owner_signature, - }; - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info("timmy", &[nyms(100)]), - msg.clone(), - ) - .unwrap_err(), - NameServiceError::InvalidEd25519Signature, - ); - assert!(execute( - deps.as_mut(), - mock_env(), - mock_info("steve", &[nyms(100)]), - msg - ) - .is_ok()); - } - - #[test] - fn register_success() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(nyms(100)); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Setup - let deposit = nyms(100); - let owner = "steve"; - let (name, owner_signature) = - new_name_details_with_sign(deps.as_mut(), &mut rng, "my-name", owner, deposit.clone()); - - // Register - let msg = ExecuteMsg::Register { - name: name.clone(), - owner_signature, - }; - let info = mock_info("steve", &[nyms(100)]); - let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); - - // Check that the name has had name id assigned to it - let expected_id = 1; - let id: NameId = get_attribute(&res, "register", "name_id").parse().unwrap(); - assert_eq!(id, expected_id); - assert_eq!( - get_attribute(&res, "register", "name"), - "my-name".to_string() - ); - - // Check that the nonce has been incremented, but only for the owner - assert_current_nonce(deps.as_ref(), &Addr::unchecked("steve"), 1); - assert_current_nonce(deps.as_ref(), &Addr::unchecked("timmy"), 0); - - // The expected registered name - let expected_name = RegisteredName { - id: expected_id, - name, - owner: Addr::unchecked(owner), - block_height: 12345, - deposit, - }; - assert_names(deps.as_ref(), &[expected_name.clone()]); - assert_name(deps.as_ref(), &expected_name); - } - - #[test] - fn delete() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(Coin::new(100, "unym")); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Register - let deposit = nyms(100); - let steve = "steve"; - let (name, owner_signature) = - new_name_details_with_sign(deps.as_mut(), &mut rng, "my-name", steve, deposit.clone()); - let msg = ExecuteMsg::Register { - name: name.clone(), - owner_signature, - }; - let info_steve = mock_info("steve", &[nyms(100)]); - execute(deps.as_mut(), mock_env(), info_steve.clone(), msg).unwrap(); - - // The expected registerd name - let expected_id = 1; - let expected_name = RegisteredName { - id: expected_id, - name, - owner: Addr::unchecked(steve), - block_height: 12345, - deposit, - }; - assert_names(deps.as_ref(), &[expected_name]); - - // Removing someone else's name will fail - let msg = ExecuteMsg::delete_id(expected_id); - let info_timmy = mock_info("timmy", &[]); - assert_eq!( - execute(deps.as_mut(), mock_env(), info_timmy, msg).unwrap_err(), - NameServiceError::Unauthorized { - sender: Addr::unchecked("timmy") - } - ); - - // Removing an non-existent name will fail - let msg = ExecuteMsg::delete_id(expected_id + 1); - assert_eq!( - execute(deps.as_mut(), mock_env(), info_steve.clone(), msg).unwrap_err(), - NameServiceError::NotFound { - name_id: expected_id + 1 - } - ); - - // Remove as correct owner succeeds - let msg = ExecuteMsg::delete_id(expected_id); - let res = execute(deps.as_mut(), mock_env(), info_steve, msg).unwrap(); - assert_eq!( - get_attribute(&res, "delete_id", "name_id"), - expected_id.to_string() - ); - assert_names(deps.as_ref(), &[]); - assert_not_found(deps.as_ref(), expected_id); - } -} diff --git a/contracts/name-service/src/contract/execute.rs b/contracts/name-service/src/contract/execute.rs deleted file mode 100644 index 38084e0f57..0000000000 --- a/contracts/name-service/src/contract/execute.rs +++ /dev/null @@ -1,224 +0,0 @@ -use crate::{ - constants::{MAX_NUMBER_OF_NAMES_FOR_ADDRESS, MAX_NUMBER_OF_NAMES_PER_OWNER}, - state, NameServiceError, Result, -}; -use cosmwasm_std::{Addr, BankMsg, Coin, Deps, DepsMut, Env, MessageInfo, Response, Uint128}; -use nym_contracts_common::{ - signing::{MessageSignature, Verifier}, - IdentityKey, -}; -use nym_name_service_common::{ - events::{ - new_delete_id_event, new_delete_name_event, new_register_event, - new_update_deposit_required_event, - }, - signing_types::construct_name_register_sign_payload, - Address, NameDetails, NameId, NymName, RegisteredName, -}; - -use super::query; - -fn ensure_correct_deposit(will_deposit: Uint128, deposit_required: Uint128) -> Result<()> { - match will_deposit.cmp(&deposit_required) { - std::cmp::Ordering::Less => Err(NameServiceError::InsufficientDeposit { - funds: will_deposit, - deposit_required, - }), - std::cmp::Ordering::Equal => Ok(()), - std::cmp::Ordering::Greater => Err(NameServiceError::TooLargeDeposit { - funds: will_deposit, - deposit_required, - }), - } -} - -fn ensure_max_names_per_owner(deps: Deps, owner: Addr) -> Result<()> { - let current_entries = query::query_owner(deps, owner.to_string())?; - if current_entries.names.len() < MAX_NUMBER_OF_NAMES_PER_OWNER as usize { - Ok(()) - } else { - Err(NameServiceError::ReachedMaxNamesForOwner { - max_names: MAX_NUMBER_OF_NAMES_PER_OWNER, - owner, - }) - } -} - -fn ensure_max_names_per_address(deps: Deps, address: Address) -> Result<()> { - let current_entries = query::query_address(deps, address.clone())?; - if current_entries.names.len() < MAX_NUMBER_OF_NAMES_FOR_ADDRESS as usize { - Ok(()) - } else { - Err(NameServiceError::ReachedMaxNamesForAddress { - max_names: MAX_NUMBER_OF_NAMES_FOR_ADDRESS, - address, - }) - } -} - -fn ensure_name_exists(deps: Deps, name_id: NameId) -> Result<()> { - if state::names::has_name_id(deps.storage, name_id) { - Ok(()) - } else { - Err(NameServiceError::NotFound { name_id }) - } -} - -fn ensure_name_not_exists(deps: Deps, name: &NymName) -> Result<()> { - if state::names::has_name(deps.storage, name) { - Err(NameServiceError::NameAlreadyRegistered { name: name.clone() }) - } else { - Ok(()) - } -} - -fn ensure_identity_key_is_part_of_nym_address(address: &Address, identity_key: &str) -> Result<()> { - if address.client_id() == identity_key { - Ok(()) - } else { - Err(NameServiceError::IdentityKeyMismatch { - address: address.clone(), - identity_key: identity_key.to_string(), - }) - } -} - -fn ensure_sender_authorized(info: MessageInfo, names: &RegisteredName) -> Result<()> { - if info.sender == names.owner { - Ok(()) - } else { - Err(NameServiceError::Unauthorized { - sender: info.sender, - }) - } -} - -fn return_deposit(name_to_delete: &RegisteredName) -> BankMsg { - BankMsg::Send { - to_address: name_to_delete.owner.to_string(), - amount: vec![name_to_delete.deposit.clone()], - } -} - -fn verify_register_signature( - deps: Deps<'_>, - sender: Addr, - deposit: Coin, - name: NameDetails, - signature: MessageSignature, -) -> Result<()> { - // recover the public key - let public_key = decode_ed25519_identity_key(&name.identity_key)?; - - // reconstruct the payload - let nonce = state::get_signing_nonce(deps.storage, sender.clone())?; - - let msg = construct_name_register_sign_payload(nonce, sender, deposit, name); - - if deps.api.verify_message(msg, signature, &public_key)? { - Ok(()) - } else { - Err(NameServiceError::InvalidEd25519Signature) - } -} - -fn decode_ed25519_identity_key(encoded: &IdentityKey) -> Result<[u8; 32]> { - let mut public_key = [0u8; 32]; - let used = bs58::decode(encoded) - .into(&mut public_key) - .map_err(|err| NameServiceError::MalformedEd25519IdentityKey(err.to_string()))?; - - if used != 32 { - return Err(NameServiceError::MalformedEd25519IdentityKey( - "Too few bytes provided for the public key".into(), - )); - } - - Ok(public_key) -} - -/// Register a new name. It will be assigned a new name id. -pub fn register( - deps: DepsMut, - env: Env, - info: MessageInfo, - name: NameDetails, - owner_signature: MessageSignature, -) -> Result { - ensure_identity_key_is_part_of_nym_address(&name.address, &name.identity_key)?; - ensure_name_not_exists(deps.as_ref(), &name.name)?; - ensure_max_names_per_owner(deps.as_ref(), info.sender.clone())?; - ensure_max_names_per_address(deps.as_ref(), name.address.clone())?; - - let deposit_required = state::deposit_required(deps.storage)?; - let denom = deposit_required.denom.clone(); - let will_deposit = cw_utils::must_pay(&info, &denom) - .map_err(|err| NameServiceError::DepositRequired { source: err })?; - ensure_correct_deposit(will_deposit, deposit_required.amount)?; - - let deposit = Coin::new(will_deposit.u128(), denom); - - verify_register_signature( - deps.as_ref(), - info.sender.clone(), - deposit.clone(), - name.clone(), - owner_signature, - )?; - - state::increment_signing_nonce(deps.storage, info.sender.clone())?; - - let id = state::next_name_id_counter(deps.storage)?; - let new_name = RegisteredName { - id, - name, - owner: info.sender, - block_height: env.block.height, - deposit, - }; - state::names::save(deps.storage, &new_name)?; - - Ok(Response::new().add_event(new_register_event(new_name))) -} - -/// Delete an exsisting name. -pub fn delete_id(deps: DepsMut, info: MessageInfo, name_id: NameId) -> Result { - ensure_name_exists(deps.as_ref(), name_id)?; - let name_to_delete = state::names::load_id(deps.storage, name_id)?; - ensure_sender_authorized(info, &name_to_delete)?; - - state::names::remove_id(deps.storage, name_id)?; - let return_deposit_msg = return_deposit(&name_to_delete); - - Ok(Response::new() - .add_message(return_deposit_msg) - .add_event(new_delete_id_event(name_to_delete))) -} - -/// Delete an existing name by name. -pub(crate) fn delete_name(deps: DepsMut, info: MessageInfo, name: NymName) -> Result { - let name_to_delete = query::query_name(deps.as_ref(), name)?; - ensure_sender_authorized(info, &name_to_delete)?; - - state::names::remove_id(deps.storage, name_to_delete.id)?; - let return_deposit_msg = return_deposit(&name_to_delete); - - Ok(Response::new() - .add_message(return_deposit_msg) - .add_event(new_delete_name_event(name_to_delete))) -} - -/// Update the deposit required to register new names -pub(crate) fn update_deposit_required( - deps: DepsMut, - info: MessageInfo, - deposit_required: Coin, -) -> Result { - state::assert_admin(deps.as_ref(), &info.sender)?; - - let mut config = state::load_config(deps.storage)?; - config.deposit_required = deposit_required.clone(); - state::save_config(deps.storage, &config)?; - - Ok(Response::new().add_event(new_update_deposit_required_event(deposit_required))) -} diff --git a/contracts/name-service/src/contract/query.rs b/contracts/name-service/src/contract/query.rs deleted file mode 100644 index 29b7b4b057..0000000000 --- a/contracts/name-service/src/contract/query.rs +++ /dev/null @@ -1,71 +0,0 @@ -use cosmwasm_std::Deps; -use nym_contracts_common::{signing::Nonce, ContractBuildInformation}; -use nym_name_service_common::{ - response::{ConfigResponse, NamesListResponse, PagedNamesListResponse}, - Address, NameId, NymName, RegisteredName, -}; - -use crate::{ - state::{self, names::PagedLoad}, - Result, -}; - -pub fn query_id(deps: Deps, name_id: NameId) -> Result { - state::names::load_id(deps.storage, name_id) -} - -pub fn query_owner(deps: Deps, owner: String) -> Result { - let owner = deps.api.addr_validate(&owner)?; - let names = state::names::load_owner(deps.storage, owner)?; - Ok(NamesListResponse::new(names)) -} - -pub fn query_address(deps: Deps, address: Address) -> Result { - let names = state::names::load_address(deps.storage, &address)?; - Ok(NamesListResponse::new(names)) -} - -pub fn query_name(deps: Deps, name: NymName) -> Result { - state::names::load_name(deps.storage, &name) -} - -pub fn query_all_paged( - deps: Deps, - limit: Option, - start_after: Option, -) -> Result { - let PagedLoad { - names, - limit, - start_next_after, - } = state::names::load_all_paged(deps.storage, limit, start_after)?; - Ok(PagedNamesListResponse::new(names, limit, start_next_after)) -} - -pub fn query_current_signing_nonce(deps: Deps<'_>, address: String) -> Result { - let address = deps.api.addr_validate(&address)?; - state::get_signing_nonce(deps.storage, address) -} - -pub fn query_config(deps: Deps) -> Result { - let config = state::load_config(deps.storage)?; - Ok(config.into()) -} - -pub fn query_contract_version() -> ContractBuildInformation { - // as per docs - // env! macro will expand to the value of the named environment variable at - // compile time, yielding an expression of type `&'static str` - ContractBuildInformation { - build_timestamp: env!("VERGEN_BUILD_TIMESTAMP").to_string(), - build_version: env!("VERGEN_BUILD_SEMVER").to_string(), - commit_sha: option_env!("VERGEN_GIT_SHA").unwrap_or("NONE").to_string(), - commit_timestamp: option_env!("VERGEN_GIT_COMMIT_TIMESTAMP") - .unwrap_or("NONE") - .to_string(), - commit_branch: option_env!("VERGEN_GIT_BRANCH") - .unwrap_or("NONE") - .to_string(), - rustc_version: env!("VERGEN_RUSTC_SEMVER").to_string(), - } -} diff --git a/contracts/name-service/src/integration_tests/delete.rs b/contracts/name-service/src/integration_tests/delete.rs deleted file mode 100644 index b26b444ceb..0000000000 --- a/contracts/name-service/src/integration_tests/delete.rs +++ /dev/null @@ -1,143 +0,0 @@ -use cosmwasm_std::Addr; -use nym_name_service_common::{response::PagedNamesListResponse, NymName}; -use rstest::rstest; - -use crate::{ - constants::NAME_DEFAULT_RETRIEVAL_LIMIT, - test_helpers::{fixture::new_name, helpers::nyms}, - NameServiceError, -}; - -use super::test_setup::TestSetup; - -#[rstest::fixture] -fn setup() -> TestSetup { - TestSetup::new() -} - -#[rstest] -fn delete_name(mut setup: TestSetup) { - setup.sign_and_register( - &NymName::new("my_name").unwrap(), - &Addr::unchecked("owner"), - &nyms(100), - ); - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!(setup.balance("owner"), nyms(150)); - assert!(!setup.query_all().names.is_empty()); - setup.delete(1, Addr::unchecked("owner")); - - // Deleting the name returns the deposit to the owner - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance("owner"), nyms(250)); - assert!(setup.query_all().names.is_empty()); -} - -#[rstest] -fn only_owner_can_delete_name(mut setup: TestSetup) { - assert_eq!(setup.contract_balance(), nyms(0)); - setup.sign_and_register( - &NymName::new("name").unwrap(), - &Addr::unchecked("owner"), - &nyms(100), - ); - assert_eq!(setup.contract_balance(), nyms(100)); - assert!(!setup.query_all().names.is_empty()); - - let delete_resp = setup - .try_delete(1, Addr::unchecked("not_owner")) - .unwrap_err(); - - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!( - delete_resp.downcast::().unwrap(), - NameServiceError::Unauthorized { - sender: Addr::unchecked("not_owner") - } - ); -} - -#[rstest] -fn cant_delete_name_that_does_not_exist(mut setup: TestSetup) { - setup.sign_and_register( - &NymName::new("foo").unwrap(), - &Addr::unchecked("owner"), - &nyms(100), - ); - assert_eq!(setup.contract_balance(), nyms(100)); - assert!(!setup.query_all().names.is_empty()); - - let delete_resp = setup.try_delete(0, Addr::unchecked("owner")).unwrap_err(); - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!( - delete_resp.downcast::().unwrap(), - NameServiceError::NotFound { name_id: 0 } - ); - - let delete_resp = setup.try_delete(2, Addr::unchecked("owner")).unwrap_err(); - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!( - delete_resp.downcast::().unwrap(), - NameServiceError::NotFound { name_id: 2 } - ); - - assert!(!setup.query_all().names.is_empty()); - setup.delete(1, Addr::unchecked("owner")); - assert_eq!(setup.contract_balance(), nyms(0)); - assert!(setup.query_all().names.is_empty()); -} - -#[rstest] -fn register_multiple_names_and_deleting_by_name(mut setup: TestSetup) { - let owner1 = Addr::unchecked("wealthy_owner_1"); - let owner2 = Addr::unchecked("wealthy_owner_2"); - let name1 = NymName::new("name1").unwrap(); - let name2 = NymName::new("name2").unwrap(); - let name3 = NymName::new("name3").unwrap(); - let name4 = NymName::new("name4").unwrap(); - let name5 = NymName::new("name5").unwrap(); - - // We register the same address three times, but with different owners - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance(&owner1), nyms(1000)); - let s1 = setup.sign_and_register(&name1, &owner1, &nyms(100)); - let s2 = setup.sign_and_register(&name2, &owner1, &nyms(100)); - let s3 = setup.sign_and_register(&name3, &owner1, &nyms(100)); - let s4 = setup.sign_and_register(&name4, &owner2, &nyms(100)); - let s5 = setup.sign_and_register(&name5, &owner2, &nyms(100)); - - assert_eq!(setup.contract_balance(), nyms(500)); - assert_eq!(setup.balance(&owner1), nyms(700)); - assert_eq!( - setup.query_all(), - PagedNamesListResponse { - names: vec![ - new_name(1, &name1, s1.address(), &owner1, s1.identity_key()), - new_name(2, &name2, s2.address(), &owner1, s2.identity_key()), - new_name(3, &name3, s3.address(), &owner1, s3.identity_key()), - new_name(4, &name4, s4.address(), &owner2, s4.identity_key()), - new_name(5, &name5, s5.address(), &owner2, s5.identity_key()), - ], - per_page: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(5), - } - ); - - setup.delete_name(name1, owner1.clone()); - - assert_eq!(setup.contract_balance(), nyms(400)); - assert_eq!(setup.balance(&owner1), nyms(800)); - assert_eq!( - setup.query_all(), - PagedNamesListResponse { - names: vec![ - new_name(2, &name2, s2.address(), &owner1, s2.identity_key()), - new_name(3, &name3, s3.address(), &owner1, s3.identity_key()), - new_name(4, &name4, s4.address(), &owner2, s4.identity_key()), - new_name(5, &name5, s5.address(), &owner2, s5.identity_key()), - ], - per_page: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(5), - } - ); -} diff --git a/contracts/name-service/src/integration_tests/mod.rs b/contracts/name-service/src/integration_tests/mod.rs deleted file mode 100644 index 28905d63c4..0000000000 --- a/contracts/name-service/src/integration_tests/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Integration tests using cw-multi-test. - -mod delete; -mod name_id; -mod query; -mod register; -mod test_name; -mod test_setup; - -#[test] -fn instantiate_contract() { - test_setup::TestSetup::new(); -} diff --git a/contracts/name-service/src/integration_tests/name_id.rs b/contracts/name-service/src/integration_tests/name_id.rs deleted file mode 100644 index 9751a4c248..0000000000 --- a/contracts/name-service/src/integration_tests/name_id.rs +++ /dev/null @@ -1,66 +0,0 @@ -use cosmwasm_std::Addr; -use nym_name_service_common::NymName; - -use crate::test_helpers::{fixture::new_name, helpers::nyms}; - -use super::test_setup::TestSetup; - -#[test] -fn name_id_is_not_resused_when_deleting_and_then_adding_a_new_names() { - let mut setup = TestSetup::new(); - setup.sign_and_register( - &NymName::new("myname1").unwrap(), - &Addr::unchecked("owner1"), - &nyms(100), - ); - let s2 = setup.sign_and_register( - &NymName::new("myname2").unwrap(), - &Addr::unchecked("owner2"), - &nyms(100), - ); - setup.sign_and_register( - &NymName::new("myname3").unwrap(), - &Addr::unchecked("owner3"), - &nyms(100), - ); - - setup.delete(1, Addr::unchecked("owner1")); - setup.delete(3, Addr::unchecked("owner3")); - - assert_eq!( - setup.query_all().names, - vec![new_name( - 2, - &NymName::new("myname2").unwrap(), - s2.address(), - &Addr::unchecked("owner2"), - s2.identity_key(), - )] - ); - - let s4 = setup.sign_and_register( - &NymName::new("myname4").unwrap(), - &Addr::unchecked("owner4"), - &nyms(100), - ); - - assert_eq!( - setup.query_all().names, - vec![ - new_name( - 2, - &NymName::new("myname2").unwrap(), - s2.address(), - &Addr::unchecked("owner2"), - s2.identity_key(), - ), - new_name( - 4, - &NymName::new("myname4").unwrap(), - s4.address(), - &Addr::unchecked("owner4"), - s4.identity_key(), - ) - ] - ); -} diff --git a/contracts/name-service/src/integration_tests/query.rs b/contracts/name-service/src/integration_tests/query.rs deleted file mode 100644 index 2dc47b98ae..0000000000 --- a/contracts/name-service/src/integration_tests/query.rs +++ /dev/null @@ -1,85 +0,0 @@ -use cosmwasm_std::Addr; -use nym_name_service_common::{ - response::{ConfigResponse, PagedNamesListResponse}, - NymName, -}; - -use crate::{ - constants::NAME_DEFAULT_RETRIEVAL_LIMIT, - test_helpers::{fixture::new_name, helpers::nyms}, -}; - -use super::test_setup::TestSetup; - -#[test] -fn query_config() { - assert_eq!( - TestSetup::new().query_config(), - ConfigResponse { - deposit_required: nyms(100), - } - ); -} - -#[test] -fn check_paging() { - let mut setup = TestSetup::new(); - let owner1 = Addr::unchecked("wealthy_owner_1"); - let owner2 = Addr::unchecked("wealthy_owner_2"); - let name1 = NymName::new("name1").unwrap(); - let name2 = NymName::new("name2").unwrap(); - let name3 = NymName::new("name3").unwrap(); - let name4 = NymName::new("name4").unwrap(); - let name5 = NymName::new("name5").unwrap(); - - // We register the same address three times, but with different owners - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance(&owner1), nyms(1000)); - let s1 = setup.sign_and_register(&name1, &owner1, &nyms(100)); - let s2 = setup.sign_and_register(&name2, &owner1, &nyms(100)); - let s3 = setup.sign_and_register(&name3, &owner1, &nyms(100)); - let s4 = setup.sign_and_register(&name4, &owner2, &nyms(100)); - let s5 = setup.sign_and_register(&name5, &owner2, &nyms(100)); - assert_eq!(setup.contract_balance(), nyms(500)); - assert_eq!(setup.balance(&owner1), nyms(700)); - assert_eq!( - setup.query_all(), - PagedNamesListResponse { - names: vec![ - new_name(1, &name1, s1.address(), &owner1, s1.identity_key()), - new_name(2, &name2, s2.address(), &owner1, s2.identity_key()), - new_name(3, &name3, s3.address(), &owner1, s3.identity_key()), - new_name(4, &name4, s4.address(), &owner2, s4.identity_key()), - new_name(5, &name5, s5.address(), &owner2, s5.identity_key()), - ], - per_page: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(5), - } - ); - - setup.delete_name(name1, owner1.clone()); - - assert_eq!( - setup.query_all_with_limit(Some(2), None), - PagedNamesListResponse { - names: vec![ - new_name(2, &name2, s2.address(), &owner1, s2.identity_key()), - new_name(3, &name3, s3.address(), &owner1, s3.identity_key()), - ], - per_page: 2, - start_next_after: Some(3), - } - ); - - assert_eq!( - setup.query_all_with_limit(Some(2), Some(2)), - PagedNamesListResponse { - names: vec![ - new_name(3, &name3, s3.address(), &owner1, s3.identity_key()), - new_name(4, &name4, s4.address(), &owner2, s4.identity_key()), - ], - per_page: 2, - start_next_after: Some(4), - } - ); -} diff --git a/contracts/name-service/src/integration_tests/register.rs b/contracts/name-service/src/integration_tests/register.rs deleted file mode 100644 index e46499ce32..0000000000 --- a/contracts/name-service/src/integration_tests/register.rs +++ /dev/null @@ -1,275 +0,0 @@ -use cosmwasm_std::Addr; -use nym_crypto::asymmetric::identity; -use nym_name_service_common::{ - error::NameServiceError, response::PagedNamesListResponse, NameDetails, NymName, RegisteredName, -}; -use rstest::rstest; - -use crate::{ - constants::NAME_DEFAULT_RETRIEVAL_LIMIT, - test_helpers::{fixture::new_name, helpers::nyms}, -}; - -use super::test_setup::TestSetup; - -#[rstest::fixture] -fn setup() -> TestSetup { - TestSetup::new() -} - -#[rstest] -fn basic_register(mut setup: TestSetup) { - assert_eq!( - setup.query_all(), - PagedNamesListResponse { - names: vec![], - per_page: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: None, - } - ); - - // Register a first name - let owner = Addr::unchecked("owner"); - let name = NymName::new("steves-server").unwrap(); - let (nym_address, id_keypair) = setup.new_nym_address(); - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance(&owner), nyms(250)); - assert_eq!(setup.query_signing_nonce(owner.to_string()), 0); - - let reg_name = setup.new_name_from_address(&name, &nym_address, id_keypair); - let payload = setup.payload_to_sign(&owner, &nyms(100), ®_name.name); - let reg_name = reg_name.sign(payload); - setup.register(®_name, &owner); - - // Confirm that the client id in the name matches the identity key. - let address_client_id = reg_name.name.address.client_id(); - let identity_key = reg_name.keys.public_key().to_base58_string(); - assert_eq!(address_client_id, &identity_key); - - // Deposit is deposited to contract and deducted from owners's balance - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!(setup.balance(&owner), nyms(150)); - - // The signing nonce has been incremented - assert_eq!(setup.query_signing_nonce(owner.to_string()), 1); - - // We can query the full name list - assert_eq!( - setup.query_all(), - PagedNamesListResponse { - names: vec![RegisteredName { - id: 1, - name: NameDetails { - name: name.clone(), - address: nym_address.clone(), - identity_key: reg_name.identity_key().to_string(), - }, - owner: owner.clone(), - block_height: 12345, - deposit: nyms(100), - }], - per_page: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(1), - } - ); - - // ... and we can query by id - assert_eq!( - setup.query_id(1), - RegisteredName { - id: 1, - name: reg_name.details().clone(), - owner: owner.clone(), - block_height: 12345, - deposit: nyms(100), - } - ); - - // Register a second name - let owner2 = Addr::unchecked("owner2"); - let name2 = NymName::new("another_server").unwrap(); - let reg_name2 = setup.new_signed_name(&name2, &owner2, &nyms(100)); - let nym_address2 = reg_name2.address().clone(); - setup.register(®_name2, &owner2); - - assert_eq!(setup.contract_balance(), nyms(200)); - assert_eq!( - setup.query_all(), - PagedNamesListResponse { - names: vec![ - new_name(1, &name, &nym_address, &owner, reg_name.identity_key()), - new_name(2, &name2, &nym_address2, &owner2, reg_name2.identity_key()), - ], - per_page: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(2), - } - ); -} - -#[rstest] -fn register_fails_when_owner_mismatch(mut setup: TestSetup) { - let owner = Addr::unchecked("owner"); - let name = NymName::new("steves-server").unwrap(); - let reg_name = setup.new_signed_name(&name, &owner, &nyms(100)); - let res = setup - .try_register(®_name, &Addr::unchecked("owner2")) - .unwrap_err(); - assert_eq!( - res.downcast::().unwrap(), - NameServiceError::InvalidEd25519Signature - ); -} - -#[rstest] -fn signing_nonce_is_increased_when_registering(mut setup: TestSetup) { - let owner1 = Addr::unchecked("owner1"); - let owner2 = Addr::unchecked("owner2"); - - assert_eq!(setup.query_signing_nonce(owner1.to_string()), 0); - assert_eq!(setup.query_signing_nonce(owner2.to_string()), 0); - - setup.sign_and_register(&NymName::new("myname1").unwrap(), &owner1, &nyms(100)); - - assert_eq!(setup.query_signing_nonce(owner1.to_string()), 1); - assert_eq!(setup.query_signing_nonce(owner2.to_string()), 0); - - setup.sign_and_register(&NymName::new("myname2").unwrap(), &owner2, &nyms(100)); - - assert_eq!(setup.query_signing_nonce(owner1.to_string()), 1); - assert_eq!(setup.query_signing_nonce(owner2.to_string()), 1); - - setup.sign_and_register(&NymName::new("myname3").unwrap(), &owner2, &nyms(100)); - - assert_eq!(setup.query_signing_nonce(owner1.to_string()), 1); - assert_eq!(setup.query_signing_nonce(owner2.to_string()), 2); -} - -#[rstest] -fn creating_two_names_in_a_row_without_announcing_fails(mut setup: TestSetup) { - let owner = Addr::unchecked("wealthy_owner_1"); - let name1 = NymName::new("steves-server1").unwrap(); - let name2 = NymName::new("steves-server2").unwrap(); - let deposit = nyms(100); - - let s1 = setup.new_signed_name(&name1, &owner, &deposit); - - // This second name will be signed with the same nonce - let s2 = setup.new_signed_name(&name2, &owner, &deposit); - - // Announce the first service works, and this increments the nonce - setup.register(&s1, &owner); - - // Now the nonce has been incremented, and the signature will not match - let resp: NameServiceError = setup - .try_register(&s2, &owner) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(resp, NameServiceError::InvalidEd25519Signature,); -} - -#[rstest] -fn cant_register_a_name_without_funds(mut setup: TestSetup) { - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance("owner"), nyms(250)); - let name1 = setup.new_signed_name( - &NymName::new("my_name").unwrap(), - &Addr::unchecked("owner"), - &nyms(100), - ); - setup.register(&name1, &Addr::unchecked("owner")); - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!(setup.balance("owner"), nyms(150)); - - let name2 = setup.new_signed_name( - &NymName::new("my_name2").unwrap(), - &Addr::unchecked("owner"), - &nyms(100), - ); - setup.register(&name2, &Addr::unchecked("owner")); - assert_eq!(setup.contract_balance(), nyms(200)); - assert_eq!(setup.balance("owner"), nyms(50)); - let name3 = setup.new_signed_name( - &NymName::new("my_name3").unwrap(), - &Addr::unchecked("owner"), - &nyms(100), - ); - let res = setup - .try_register(&name3, &Addr::unchecked("owner")) - .unwrap_err(); - assert_eq!( - res.downcast::().unwrap(), - cosmwasm_std::StdError::Overflow { - source: cosmwasm_std::OverflowError::new( - cosmwasm_std::OverflowOperation::Sub, - "50", - "100" - ) - } - ); -} - -#[rstest] -fn cant_register_the_same_name_multiple_times(mut setup: TestSetup) { - let name1 = setup.new_signed_name( - &NymName::new("name").unwrap(), - &Addr::unchecked("owner"), - &nyms(100), - ); - setup.register(&name1, &Addr::unchecked("owner")); - let resp = setup - .try_register(&name1, &Addr::unchecked("owner")) - .unwrap_err(); - - assert_eq!( - resp.downcast::().unwrap(), - NameServiceError::NameAlreadyRegistered { - name: NymName::new("name").unwrap() - } - ); -} - -fn clone_keys(keys: &identity::KeyPair) -> identity::KeyPair { - let priv_bytes = keys.private_key().to_bytes(); - let pub_bytes = keys.public_key().to_bytes(); - identity::KeyPair::from_bytes(&priv_bytes, &pub_bytes).unwrap() -} - -#[rstest] -fn can_register_multiple_names_for_the_same_nym_address(mut setup: TestSetup) { - let name1 = NymName::new("name1").unwrap(); - let name2 = NymName::new("name2").unwrap(); - // let address = Address::new("nym.add@ress").unwrap(); - let (address, id_keys) = setup.new_nym_address(); - let owner = Addr::unchecked("owner"); - - // We duplicate the keypair here to ensure that the same keypair is used for both names. - // The private key lacks a clone method, for good reason, so we have to serialize and - // deserialize it. - let id_keys2 = clone_keys(&id_keys); - assert_eq!(id_keys.public_key(), id_keys2.public_key()); - assert_eq!( - id_keys.private_key().to_base58_string(), - id_keys2.private_key().to_base58_string() - ); - - // let reg_name1 = setup.new_signed_name(&name1, &owner, &nyms(100)); - let reg_name1 = setup.new_name_from_address(&name1, &address, id_keys); - let payload = setup.payload_to_sign(&owner, &nyms(100), ®_name1.name); - let reg_name1 = reg_name1.sign(payload); - setup.register(®_name1, &owner); - - // let reg_name2 = setup.new_signed_name(&name2, &owner, &nyms(100)); - let reg_name2 = setup.new_name_from_address(&name2, &address, id_keys2); - let payload = setup.payload_to_sign(&owner, &nyms(100), ®_name2.name); - let reg_name2 = reg_name2.sign(payload); - setup.register(®_name2, &owner); - - assert_eq!( - setup.query_all().names, - vec![ - new_name(1, &name1, &address, &owner, reg_name1.identity_key()), - new_name(2, &name2, &address, &owner, reg_name2.identity_key()), - ], - ); -} diff --git a/contracts/name-service/src/integration_tests/test_name.rs b/contracts/name-service/src/integration_tests/test_name.rs deleted file mode 100644 index 5057bc8075..0000000000 --- a/contracts/name-service/src/integration_tests/test_name.rs +++ /dev/null @@ -1,78 +0,0 @@ -use nym_contracts_common::{signing::MessageSignature, IdentityKey}; -use nym_crypto::asymmetric::identity; -use nym_name_service_common::{ - signing_types::SignableNameRegisterMsg, Address, NameDetails, NymName, -}; - -use crate::test_helpers::signing::ed25519_sign_message; - -pub struct TestName { - pub name: NameDetails, - pub id_keys: identity::KeyPair, -} - -impl TestName { - pub fn new(name: NymName, address: Address, id_keys: identity::KeyPair) -> Self { - let identity_key = id_keys.public_key().to_base58_string(); - assert_eq!( - identity_key, - address.client_id().to_string(), - "address and identity key must match" - ); - let name = NameDetails { - name, - address, - identity_key, - }; - Self { name, id_keys } - } - - pub fn identity_key(&self) -> &IdentityKey { - &self.name.identity_key - } - - pub fn details(&self) -> &NameDetails { - &self.name - } - - pub fn sign(self, payload: SignableNameRegisterMsg) -> SignedTestName { - let owner_signature = ed25519_sign_message(payload, self.id_keys.private_key()); - SignedTestName { - name: self.name, - keys: self.id_keys, - owner_signature, - } - } -} - -impl From for NameDetails { - fn from(test_name: TestName) -> Self { - test_name.name - } -} - -pub struct SignedTestName { - pub name: NameDetails, - pub keys: identity::KeyPair, - pub owner_signature: MessageSignature, -} - -impl SignedTestName { - pub fn identity_key(&self) -> &IdentityKey { - &self.name.identity_key - } - - pub fn details(&self) -> &NameDetails { - &self.name - } - - pub fn address(&self) -> &Address { - &self.name.address - } -} - -impl From for NameDetails { - fn from(signed_name: SignedTestName) -> Self { - signed_name.name - } -} diff --git a/contracts/name-service/src/integration_tests/test_setup.rs b/contracts/name-service/src/integration_tests/test_setup.rs deleted file mode 100644 index fd396aec46..0000000000 --- a/contracts/name-service/src/integration_tests/test_setup.rs +++ /dev/null @@ -1,222 +0,0 @@ -use cosmwasm_std::{coins, Addr, Coin, Uint128}; -use cw_multi_test::{App, AppBuilder, AppResponse, ContractWrapper, Executor}; -use nym_contracts_common::signing::Nonce; -use nym_crypto::asymmetric::identity; -use nym_name_service_common::{ - msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, - response::{ConfigResponse, PagedNamesListResponse}, - signing_types::{construct_name_register_sign_payload, SignableNameRegisterMsg}, - Address, NameDetails, NameId, NymName, RegisteredName, -}; -use rand_chacha::ChaCha20Rng; -use serde::de::DeserializeOwned; - -use crate::test_helpers::helpers::{get_app_attribute, test_rng}; - -use super::test_name::{SignedTestName, TestName}; - -const DENOM: &str = "unym"; -const ADDRESSES: &[&str] = &[ - "user", "admin", "owner", "owner1", "owner2", "owner3", "owner4", -]; -const WEALTHY_ADDRESSES: &[&str] = &["wealthy_owner_1", "wealthy_owner_2"]; - -/// Helper for being able to systematic integration tests -pub struct TestSetup { - app: App, - addr: Addr, - rng: ChaCha20Rng, -} - -impl Default for TestSetup { - fn default() -> Self { - TestSetup::new() - } -} - -impl TestSetup { - pub fn new() -> Self { - let mut app = AppBuilder::new().build(|router, _, storage| { - let mut init_balance = |account: &str, amount: u128| { - router - .bank - .init_balance(storage, &Addr::unchecked(account), coins(amount, DENOM)) - .unwrap(); - }; - ADDRESSES.iter().for_each(|addr| init_balance(addr, 250)); - WEALTHY_ADDRESSES - .iter() - .for_each(|addr| init_balance(addr, 1000)); - }); - let code = ContractWrapper::new(crate::execute, crate::instantiate, crate::query); - let code_id = app.store_code(Box::new(code)); - let addr = Self::instantiate(&mut app, code_id); - let rng = test_rng(); - TestSetup { app, addr, rng } - } - - fn instantiate(app: &mut App, code_id: u64) -> Addr { - app.instantiate_contract( - code_id, - Addr::unchecked("admin"), - &InstantiateMsg { - deposit_required: Coin::new(100, DENOM), - }, - &[], - "contract_label", - None, - ) - .unwrap() - } - - pub fn contract_balance(&self) -> Coin { - self.app.wrap().query_balance(&self.addr, DENOM).unwrap() - } - - pub fn query(&self, query_msg: &QueryMsg) -> T { - self.app - .wrap() - .query_wasm_smart(&self.addr, query_msg) - .unwrap() - } - - pub fn query_config(&self) -> ConfigResponse { - self.query(&QueryMsg::Config {}) - } - - pub fn query_id(&self, name_id: NameId) -> RegisteredName { - self.query(&QueryMsg::NameId { name_id }) - } - - pub fn query_all(&self) -> PagedNamesListResponse { - self.query(&QueryMsg::all()) - } - - pub fn query_all_with_limit( - &self, - limit: Option, - start_after: Option, - ) -> PagedNamesListResponse { - self.query(&QueryMsg::All { limit, start_after }) - } - - pub fn query_signing_nonce(&self, address: String) -> Nonce { - self.query(&QueryMsg::SigningNonce { address }) - } - - // Create a new random address and a corresponding keypair. - pub fn new_nym_address(&mut self) -> (Address, identity::KeyPair) { - crate::test_helpers::fixture::new_address(&mut self.rng) - } - - // Create a new name with a given address. It's up to the caller to make sure that the keys - // match. - pub fn new_name_from_address( - &mut self, - name: &NymName, - address: &Address, - id_keys: identity::KeyPair, - ) -> TestName { - TestName::new(name.clone(), address.clone(), id_keys) - } - - // Create a new name with a random address - pub fn new_name(&mut self, name: &NymName) -> TestName { - let (address, id_keys) = self.new_nym_address(); - self.new_name_from_address(name, &address, id_keys) - } - - pub fn payload_to_sign( - &mut self, - owner: &Addr, - deposit: &Coin, - name: &NameDetails, - ) -> SignableNameRegisterMsg { - let nonce = self.query_signing_nonce(owner.to_string()); - construct_name_register_sign_payload(nonce, owner.clone(), deposit.clone(), name.clone()) - } - - pub fn new_signed_name( - &mut self, - name: &NymName, - owner: &Addr, - deposit: &Coin, - ) -> SignedTestName { - let name = self.new_name(name); - let payload = self.payload_to_sign(owner, deposit, name.details()); - name.sign(payload) - } - - pub fn try_register( - &mut self, - name: &SignedTestName, - owner: &Addr, - ) -> anyhow::Result { - self.app.execute_contract( - owner.clone(), - self.addr.clone(), - &ExecuteMsg::Register { - name: name.name.clone(), - owner_signature: name.owner_signature.clone(), - }, - &[Coin { - denom: DENOM.to_string(), - amount: Uint128::new(100), - }], - ) - } - - pub fn register(&mut self, name: &SignedTestName, owner: &Addr) -> AppResponse { - let resp = self.try_register(name, owner).unwrap(); - assert_eq!( - get_app_attribute(&resp, "wasm-register", "action"), - "register" - ); - resp - } - - // Convenience function for creating a new signed name, and regsitering it - pub fn sign_and_register( - &mut self, - name: &NymName, - owner: &Addr, - deposit: &Coin, - ) -> SignedTestName { - let signed_name = self.new_signed_name(name, owner, deposit); - self.register(&signed_name, owner); - signed_name - } - - pub fn try_delete(&mut self, name_id: NameId, owner: Addr) -> anyhow::Result { - self.app.execute_contract( - owner, - self.addr.clone(), - &ExecuteMsg::DeleteId { name_id }, - &[], - ) - } - - pub fn delete(&mut self, name_id: NameId, owner: Addr) -> AppResponse { - let delete_resp = self.try_delete(name_id, owner).unwrap(); - assert_eq!( - get_app_attribute(&delete_resp, "wasm-delete_id", "action"), - "delete_id" - ); - delete_resp - } - - pub fn delete_name(&mut self, name: NymName, owner: Addr) -> AppResponse { - self.app - .execute_contract( - owner, - self.addr.clone(), - &ExecuteMsg::DeleteName { name }, - &[], - ) - .unwrap() - } - - pub fn balance(&self, address: impl Into) -> Coin { - self.app.wrap().query_balance(address, DENOM).unwrap() - } -} diff --git a/contracts/name-service/src/lib.rs b/contracts/name-service/src/lib.rs deleted file mode 100644 index 0f426dd72f..0000000000 --- a/contracts/name-service/src/lib.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! The nym name service contract is for users to register names for the nym addresses. - -#![warn(clippy::expect_used)] -#![warn(clippy::unwrap_used)] - -pub use nym_name_service_common::error::{NameServiceError, Result}; - -use nym_name_service_common::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; - -#[cfg(not(feature = "library"))] -use cosmwasm_std::entry_point; -use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response}; - -mod contract; -mod state; - -pub mod constants; - -#[cfg(test)] -mod integration_tests; -#[cfg(test)] -mod test_helpers; - -/// Contract entry point for instantiation. -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn instantiate( - deps: DepsMut<'_>, - env: Env, - info: MessageInfo, - msg: InstantiateMsg, -) -> Result { - contract::instantiate(deps, env, info, msg) -} - -/// Contract entry point for migrations. -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut<'_>, env: Env, msg: MigrateMsg) -> Result { - contract::migrate(deps, env, msg) -} - -/// Contract entry point for execution -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn execute( - deps: DepsMut<'_>, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, -) -> Result { - contract::execute(deps, env, info, msg) -} - -/// Contract entry point for queries -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result { - contract::query(deps, env, msg) -} diff --git a/contracts/name-service/src/state/admin.rs b/contracts/name-service/src/state/admin.rs deleted file mode 100644 index 026e353626..0000000000 --- a/contracts/name-service/src/state/admin.rs +++ /dev/null @@ -1,14 +0,0 @@ -use cosmwasm_std::{Addr, Deps, DepsMut}; -use cw_controllers::Admin; - -use crate::{constants::ADMIN_KEY, Result}; - -const ADMIN: Admin = Admin::new(ADMIN_KEY); - -pub(crate) fn set_admin(deps: DepsMut<'_>, admin: Addr) -> Result<()> { - Ok(ADMIN.set(deps, Some(admin))?) -} - -pub(crate) fn assert_admin(deps: Deps, sender: &Addr) -> Result<()> { - Ok(ADMIN.assert_admin(deps, sender)?) -} diff --git a/contracts/name-service/src/state/config.rs b/contracts/name-service/src/state/config.rs deleted file mode 100644 index aa27617492..0000000000 --- a/contracts/name-service/src/state/config.rs +++ /dev/null @@ -1,34 +0,0 @@ -use cosmwasm_std::{Coin, Storage}; -use cw_storage_plus::Item; -use nym_name_service_common::response::ConfigResponse; -use serde::{Deserialize, Serialize}; - -use crate::{constants::CONFIG_KEY, Result}; - -const CONFIG: Item = Item::new(CONFIG_KEY); - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub(crate) struct Config { - pub deposit_required: Coin, -} - -impl From for ConfigResponse { - fn from(config: Config) -> Self { - ConfigResponse { - deposit_required: config.deposit_required, - } - } -} - -pub(crate) fn save_config(store: &mut dyn Storage, config: &Config) -> Result<()> { - Ok(CONFIG.save(store, config)?) -} - -pub(crate) fn load_config(store: &dyn Storage) -> Result { - Ok(CONFIG.load(store)?) -} - -/// Return the deposit required to register a name. -pub(crate) fn deposit_required(store: &dyn Storage) -> Result { - Ok(CONFIG.load(store).map(|config| config.deposit_required)?) -} diff --git a/contracts/name-service/src/state/mod.rs b/contracts/name-service/src/state/mod.rs deleted file mode 100644 index 8d86c67201..0000000000 --- a/contracts/name-service/src/state/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub mod admin; -pub mod config; -pub mod name_id_counter; -pub mod names; -pub mod nonce; - -pub(crate) use admin::{assert_admin, set_admin}; -pub(crate) use config::{deposit_required, load_config, save_config, Config}; -pub(crate) use name_id_counter::next_name_id_counter; -pub(crate) use nonce::{get_signing_nonce, increment_signing_nonce}; diff --git a/contracts/name-service/src/state/name_id_counter.rs b/contracts/name-service/src/state/name_id_counter.rs deleted file mode 100644 index 3c5e2a56f9..0000000000 --- a/contracts/name-service/src/state/name_id_counter.rs +++ /dev/null @@ -1,97 +0,0 @@ -use cosmwasm_std::Storage; -use cw_storage_plus::Item; -use nym_name_service_common::NameId; - -use crate::{constants::NAME_ID_COUNTER_KEY, Result}; - -const NAME_ID_COUNTER: Item = Item::new(NAME_ID_COUNTER_KEY); - -/// Generate the next name id, store it and return it -pub(crate) fn next_name_id_counter(store: &mut dyn Storage) -> Result { - // The first id is 1. - let id = NAME_ID_COUNTER.may_load(store)?.unwrap_or_default() + 1; - NAME_ID_COUNTER.save(store, &id)?; - Ok(id) -} - -#[cfg(test)] -mod tests { - use cosmwasm_std::Addr; - use nym_name_service_common::RegisteredName; - - use crate::test_helpers::{ - assert::assert_names, - helpers::{nyms, test_rng}, - transactions::{delete_name_id, instantiate_test_contract, register_name}, - }; - - #[test] - fn get_next_name_id() { - let mut deps = instantiate_test_contract(); - let mut rng = test_rng(); - - let (id1, name1) = register_name(deps.as_mut(), &mut rng, "foo", "steve"); - let (id2, name2) = register_name(deps.as_mut(), &mut rng, "bar", "steve"); - let (id3, name3) = register_name(deps.as_mut(), &mut rng, "baz", "steve"); - assert_eq!(id1, 1); - assert_eq!(id2, 2); - assert_eq!(id3, 3); - assert_eq!(name1.name.as_str(), "foo"); - assert_eq!(name2.name.as_str(), "bar"); - assert_eq!(name3.name.as_str(), "baz"); - assert_names( - deps.as_ref(), - &[ - RegisteredName { - id: 1, - name: name1, - owner: Addr::unchecked("steve"), - block_height: 12345, - deposit: nyms(100), - }, - RegisteredName { - id: 2, - name: name2, - owner: Addr::unchecked("steve"), - block_height: 12345, - deposit: nyms(100), - }, - RegisteredName { - id: 3, - name: name3, - owner: Addr::unchecked("steve"), - block_height: 12345, - deposit: nyms(100), - }, - ], - ); - } - - #[test] - fn deleted_name_id_is_not_reused() { - let mut deps = instantiate_test_contract(); - let mut rng = test_rng(); - - // Register two names - let (_, name1) = register_name(deps.as_mut(), &mut rng, "one", "steve"); - register_name(deps.as_mut(), &mut rng, "two", "steve"); - - // Delete the last entry - delete_name_id(deps.as_mut(), 2, "steve"); - assert_names( - deps.as_ref(), - &[RegisteredName { - id: 1, - name: name1, - owner: Addr::unchecked("steve"), - block_height: 12345, - deposit: nyms(100), - }], - ); - - // Create a third entry. The index should not reuse the previous entry that we just - // deleted. - let (id3, _) = register_name(deps.as_mut(), &mut rng, "three", "steve"); - assert_eq!(id3, 3); - } -} diff --git a/contracts/name-service/src/state/names.rs b/contracts/name-service/src/state/names.rs deleted file mode 100644 index 8d552a8626..0000000000 --- a/contracts/name-service/src/state/names.rs +++ /dev/null @@ -1,637 +0,0 @@ -use cosmwasm_std::{Addr, Order, StdError, StdResult, Storage}; -use cw_storage_plus::{Bound, Index, IndexList, IndexedMap, MultiIndex, UniqueIndex}; -use nym_name_service_common::{Address, NameId, NymName, RegisteredName}; - -use crate::{ - constants::{ - MAX_NUMBER_OF_NAMES_FOR_ADDRESS, MAX_NUMBER_OF_NAMES_PER_OWNER, - NAMES_ADDRESS_IDX_NAMESPACE, NAMES_NAME_IDX_NAMESPACE, NAMES_OWNER_IDX_NAMESPACE, - NAMES_PK_NAMESPACE, NAME_DEFAULT_RETRIEVAL_LIMIT, NAME_MAX_RETRIEVAL_LIMIT, - }, - NameServiceError, Result, -}; - -struct NameIndex<'a> { - // A name can only point to a single address - pub(crate) name: UniqueIndex<'a, String, RegisteredName, NameId>, - // An addresses can be pointed to by multiple names. - pub(crate) address: MultiIndex<'a, String, RegisteredName, NameId>, - pub(crate) owner: MultiIndex<'a, Addr, RegisteredName, NameId>, -} - -impl<'a> IndexList for NameIndex<'a> { - fn get_indexes(&'_ self) -> Box> + '_> { - let v: Vec<&dyn Index> = vec![&self.name, &self.address, &self.owner]; - Box::new(v.into_iter()) - } -} - -fn names<'a>() -> IndexedMap<'a, NameId, RegisteredName, NameIndex<'a>> { - let indexes = NameIndex { - name: UniqueIndex::new(|d| d.name.name.to_string(), NAMES_NAME_IDX_NAMESPACE), - address: MultiIndex::new( - |_pk, d| d.name.address.to_string(), - NAMES_PK_NAMESPACE, - NAMES_ADDRESS_IDX_NAMESPACE, - ), - owner: MultiIndex::new( - |_pk, d| d.owner.clone(), - NAMES_PK_NAMESPACE, - NAMES_OWNER_IDX_NAMESPACE, - ), - }; - IndexedMap::new(NAMES_PK_NAMESPACE, indexes) -} - -pub fn save(store: &mut dyn Storage, new_name: &RegisteredName) -> Result<()> { - let name_id = new_name.id; - names().save(store, name_id, new_name)?; - Ok(()) -} - -#[cfg(test)] -pub fn save_all(state: &mut dyn Storage, names: &[RegisteredName]) -> Result<()> { - for name in names { - save(state, name)?; - } - Ok(()) -} - -pub fn remove_id(store: &mut dyn Storage, name_id: NameId) -> Result<()> { - Ok(names().remove(store, name_id)?) -} - -#[cfg(test)] -pub fn remove_name(store: &mut dyn Storage, name: NymName) -> Result { - let registered_name = load_name(store, &name)?; - remove_id(store, registered_name.id)?; - Ok(registered_name.id) -} - -pub fn has_name_id(store: &dyn Storage, name_id: NameId) -> bool { - names().has(store, name_id) -} - -pub fn has_name(store: &dyn Storage, name: &NymName) -> bool { - load_name(store, name).is_ok() -} - -pub fn load_id(store: &dyn Storage, name_id: NameId) -> Result { - names().load(store, name_id).map_err(|err| match err { - StdError::NotFound { .. } => NameServiceError::NotFound { name_id }, - err => err.into(), - }) -} - -pub fn load_name(store: &dyn Storage, name: &NymName) -> Result { - names() - .idx - .name - .item(store, name.to_string())? - .map(|record| record.1) - .ok_or(NameServiceError::NameNotFound { name: name.clone() }) -} - -pub fn load_address(store: &dyn Storage, address: &Address) -> Result> { - names() - .idx - .address - .prefix(address.to_string()) - .range(store, None, None, Order::Ascending) - .take(MAX_NUMBER_OF_NAMES_FOR_ADDRESS as usize) - .map(|res| res.map(|(_, name)| name)) - .collect::>>() - .map_err(NameServiceError::from) -} - -pub fn load_owner(store: &dyn Storage, owner: Addr) -> Result> { - names() - .idx - .owner - .prefix(owner) - .range(store, None, None, Order::Ascending) - .take(MAX_NUMBER_OF_NAMES_PER_OWNER as usize) - .map(|res| res.map(|(_, name)| name)) - .collect::>>() - .map_err(NameServiceError::from) -} - -#[derive(Debug, PartialEq)] -pub struct PagedLoad { - pub names: Vec, - pub limit: usize, - - /// Field indicating paging information for the following queries if the caller wishes to get further entries. - pub start_next_after: Option, -} - -pub fn load_all_paged( - store: &dyn Storage, - limit: Option, - start_after: Option, -) -> Result { - let limit = limit - .unwrap_or(NAME_DEFAULT_RETRIEVAL_LIMIT) - .min(NAME_MAX_RETRIEVAL_LIMIT) as usize; - - let start = start_after.map(Bound::exclusive); - - let names = names() - .range(store, start, None, Order::Ascending) - .take(limit) - .map(|res| res.map(|(_, name)| name)) - .collect::>>()?; - - let start_next_after = names.last().map(|name| name.id); - - Ok(PagedLoad { - names, - limit, - start_next_after, - }) -} - -#[cfg(test)] -mod tests { - use cosmwasm_std::{ - testing::{MockApi, MockQuerier}, - MemoryStorage, OwnedDeps, - }; - use rstest::rstest; - - use crate::test_helpers::{ - fixture::{name_fixture, name_fixture_full}, - transactions::instantiate_test_contract, - }; - - use super::*; - - type TestDeps = OwnedDeps; - - #[rstest::fixture] - fn deps() -> TestDeps { - instantiate_test_contract() - } - - #[rstest::fixture] - fn uniq_names() -> Vec { - vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(2, "two", "address.two@b", "owner_two"), - name_fixture_full(3, "three", "address.three@c", "owner_three"), - ] - } - - #[rstest::fixture] - fn overlapping_addresses() -> Vec { - vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(2, "two", "address.two@b", "owner_two"), - name_fixture_full(3, "three", "address.two@b", "owner_three"), - ] - } - - #[rstest::fixture] - fn overlapping_owners() -> Vec { - vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(2, "two", "address.two@b", "owner_two"), - name_fixture_full(3, "three", "address.three@c", "owner_two"), - ] - } - - fn assert_not_registered(store: &dyn Storage, names: Vec) { - let loaded = load_all_paged(store, None, None).unwrap(); - for name in &names { - assert!(!has_name_id(store, name.id)); - assert!(!has_name(store, name.entry())); - assert!(!loaded.names.iter().any(|l_name| l_name.id == name.id)); - assert!(!loaded.names.iter().any(|l_name| l_name == name)); - } - } - - fn assert_registered(store: &dyn Storage, names: Vec) { - let loaded = load_all_paged(store, None, None).unwrap(); - for name in &names { - assert!(has_name_id(store, name.id)); - assert!(has_name(store, name.entry())); - assert!(loaded.names.iter().filter(|n| n == &name).count() == 1); - } - } - - fn assert_only_these_registered(store: &dyn Storage, names: Vec) { - for name in &names { - assert!(has_name_id(store, name.id)); - assert!(has_name(store, name.entry())); - } - let last_id = names.last().unwrap().id; - assert_eq!( - load_all_paged(store, None, None).unwrap(), - PagedLoad { - names, - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(last_id), - } - ) - } - - #[rstest] - fn single_basic_save_works(mut deps: TestDeps) { - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - } - - #[rstest] - fn save_same_name_twice_fails(mut deps: TestDeps) { - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert!(matches!( - save(deps.as_mut().storage, &name_fixture(2)).unwrap_err(), - NameServiceError::Std(StdError::GenericErr { .. }) - )); - } - - #[rstest] - fn remove_id_works(mut deps: TestDeps) { - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert!(has_name_id(&deps.storage, 1)); - assert!(has_name(&deps.storage, name_fixture(1).entry())); - remove_id(deps.as_mut().storage, 1).unwrap(); - assert!(!has_name_id(&deps.storage, 1)); - assert!(!has_name(&deps.storage, name_fixture(1).entry())); - } - - #[rstest] - fn remove_name_works(mut deps: TestDeps) { - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert!(has_name_id(&deps.storage, 1)); - assert!(has_name(&deps.storage, name_fixture(1).entry())); - remove_name(deps.as_mut().storage, name_fixture(1).name.name).unwrap(); - assert!(!has_name_id(&deps.storage, 1)); - assert!(!has_name(&deps.storage, name_fixture(1).entry())); - } - - #[rstest] - fn has_name_works(mut deps: TestDeps) { - assert!(!has_name(&deps.storage, name_fixture(1).entry())); - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert!(has_name(&deps.storage, name_fixture(1).entry())); - } - - #[rstest] - fn has_name_id_works(mut deps: TestDeps) { - assert!(!has_name_id(&deps.storage, 1)); - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert!(has_name_id(&deps.storage, 1)); - } - - #[rstest] - fn has_name_id_with_incorrect_id_fails(mut deps: TestDeps) { - assert!(!has_name_id(&deps.storage, 2)); - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert!(!has_name_id(&deps.storage, 2)); - } - - #[rstest] - fn load_id_works(mut deps: TestDeps) { - assert_eq!( - load_id(deps.as_ref().storage, 1).unwrap_err(), - NameServiceError::NotFound { name_id: 1 } - ); - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert_eq!(load_id(deps.as_ref().storage, 1).unwrap(), name_fixture(1),); - } - - #[rstest] - fn load_name_works(mut deps: TestDeps) { - assert_eq!( - load_name(deps.as_ref().storage, name_fixture(1).entry()).unwrap_err(), - NameServiceError::NameNotFound { - name: name_fixture(1).name.name, - } - ); - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert_eq!( - load_name(deps.as_ref().storage, name_fixture(1).entry()).unwrap(), - name_fixture(1), - ); - } - - #[rstest] - fn load_address_works(mut deps: TestDeps) { - assert_eq!( - load_address(deps.as_ref().storage, &name_fixture(1).name.address).unwrap(), - vec![], - ); - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert_eq!( - load_address(deps.as_ref().storage, &name_fixture(1).name.address).unwrap(), - vec![name_fixture(1)], - ); - } - - #[rstest] - fn load_owner_works(mut deps: TestDeps) { - assert_eq!( - load_owner(deps.as_ref().storage, name_fixture(1).owner).unwrap(), - vec![], - ); - save(deps.as_mut().storage, &name_fixture(1)).unwrap(); - assert_eq!( - load_owner(deps.as_ref().storage, name_fixture(1).owner).unwrap(), - vec![name_fixture(1)], - ); - } - - #[rstest] - fn load_all_paged_works(mut deps: TestDeps, uniq_names: Vec) { - assert_eq!( - load_all_paged(&deps.storage, None, None).unwrap(), - PagedLoad { - names: vec![], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: None - } - ); - save(deps.as_mut().storage, &uniq_names[0]).unwrap(); - assert_eq!( - load_all_paged(&deps.storage, None, None).unwrap(), - PagedLoad { - names: vec![uniq_names[0].clone()], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(1), - } - ); - } - - #[rstest] - fn save_set_of_unique_names_works(mut deps: TestDeps, uniq_names: Vec) { - assert_not_registered(&deps.storage, uniq_names.clone()); - save_all(deps.as_mut().storage, &uniq_names).unwrap(); - assert_registered(&deps.storage, uniq_names.clone()); - assert_only_these_registered(&deps.storage, uniq_names); - } - - #[rstest] - fn load_name_for_unique_set_works(mut deps: TestDeps, uniq_names: Vec) { - save_all(deps.as_mut().storage, &uniq_names).unwrap(); - for name in uniq_names { - assert_eq!( - load_name(deps.as_ref().storage, name.entry()).unwrap(), - name.clone(), - ); - } - } - - #[rstest] - fn save_and_remove_name_id_from_set_of_unique_set_works( - mut deps: TestDeps, - uniq_names: Vec, - ) { - save_all(deps.as_mut().storage, &uniq_names).unwrap(); - remove_id(deps.as_mut().storage, 2).unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(3, "three", "address.three@c", "owner_three"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - } - - #[rstest] - fn save_and_remove_name_from_set_of_unique_set_works( - mut deps: TestDeps, - uniq_names: Vec, - ) { - save_all(deps.as_mut().storage, &uniq_names).unwrap(); - remove_name(deps.as_mut().storage, uniq_names[1].entry().clone()).unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(3, "three", "address.three@c", "owner_three"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - } - - #[rstest] - fn save_set_of_overlapping_addressed_works( - mut deps: TestDeps, - overlapping_addresses: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_addresses).unwrap(); - assert_registered(&deps.storage, overlapping_addresses.clone()); - assert_only_these_registered(&deps.storage, overlapping_addresses); - } - - #[rstest] - fn load_address_with_overlapping_addresses_works( - mut deps: TestDeps, - overlapping_addresses: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_addresses).unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(2, "two", "address.two@b", "owner_two"), - name_fixture_full(3, "three", "address.two@b", "owner_three"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - assert_eq!( - load_address( - deps.as_ref().storage, - &Address::new("address.two@b").unwrap() - ) - .unwrap(), - vec![ - name_fixture_full(2, "two", "address.two@b", "owner_two"), - name_fixture_full(3, "three", "address.two@b", "owner_three"), - ] - ); - } - - #[rstest] - fn save_and_remove_name_id_from_set_of_overlapping_addresses_works( - mut deps: TestDeps, - overlapping_addresses: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_addresses).unwrap(); - remove_id(deps.as_mut().storage, 2).unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(3, "three", "address.two@b", "owner_three"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - } - - #[rstest] - fn save_and_remove_name_from_set_of_overlapping_addresses_works( - mut deps: TestDeps, - overlapping_addresses: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_addresses).unwrap(); - remove_name( - deps.as_mut().storage, - overlapping_addresses[1].name.name.clone(), - ) - .unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(3, "three", "address.two@b", "owner_three"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - } - - #[rstest] - fn save_set_of_overlapping_owners_works( - mut deps: TestDeps, - overlapping_owners: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_owners).unwrap(); - assert_registered(&deps.storage, overlapping_owners.clone()); - assert_only_these_registered(&deps.storage, overlapping_owners); - } - - #[rstest] - fn load_owner_with_overlapping_owners_works( - mut deps: TestDeps, - overlapping_owners: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_owners).unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(2, "two", "address.two@b", "owner_two"), - name_fixture_full(3, "three", "address.three@c", "owner_two"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - assert_eq!( - load_owner(deps.as_ref().storage, Addr::unchecked("owner_two")).unwrap(), - vec![ - name_fixture_full(2, "two", "address.two@b", "owner_two"), - name_fixture_full(3, "three", "address.three@c", "owner_two"), - ] - ); - } - - #[rstest] - fn save_and_remove_name_id_from_set_of_overlapping_owners_works( - mut deps: TestDeps, - overlapping_owners: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_owners).unwrap(); - assert_registered(&deps.storage, overlapping_owners.clone()); - assert_only_these_registered(&deps.storage, overlapping_owners); - remove_id(deps.as_mut().storage, 2).unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(3, "three", "address.three@c", "owner_two"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - } - - #[rstest] - fn save_and_remove_name_from_set_of_overlapping_owners_works( - mut deps: TestDeps, - overlapping_owners: Vec, - ) { - save_all(deps.as_mut().storage, &overlapping_owners).unwrap(); - assert_registered(&deps.storage, overlapping_owners.clone()); - assert_only_these_registered(&deps.storage, overlapping_owners.clone()); - remove_name(deps.as_mut().storage, overlapping_owners[1].entry().clone()).unwrap(); - assert_eq!( - load_all_paged(deps.as_ref().storage, None, None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(3, "three", "address.three@c", "owner_two"), - ], - limit: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(3), - } - ); - } - - #[rstest] - fn load_all_paged_with_limit_works(mut deps: TestDeps, uniq_names: Vec) { - save_all(deps.as_mut().storage, &uniq_names).unwrap(); - assert_eq!( - load_all_paged(&deps.storage, Some(2), None).unwrap(), - PagedLoad { - names: vec![ - name_fixture_full(1, "one", "address.one@a", "owner_one"), - name_fixture_full(2, "two", "address.two@b", "owner_two"), - ], - limit: 2, - start_next_after: Some(2), - } - ); - assert_eq!( - load_all_paged(&deps.storage, Some(1), Some(2)).unwrap(), - PagedLoad { - names: vec![name_fixture_full( - 3, - "three", - "address.three@c", - "owner_three" - )], - limit: 1, - start_next_after: Some(3), - } - ); - assert_eq!( - load_all_paged(&deps.storage, Some(2), Some(2)).unwrap(), - PagedLoad { - names: vec![name_fixture_full( - 3, - "three", - "address.three@c", - "owner_three" - )], - limit: 2, - start_next_after: Some(3), - } - ); - } - - #[test] - #[ignore] - fn max_page_limit_is_applied() { - todo!(); - } -} diff --git a/contracts/name-service/src/state/nonce.rs b/contracts/name-service/src/state/nonce.rs deleted file mode 100644 index bf865af82a..0000000000 --- a/contracts/name-service/src/state/nonce.rs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{constants::SIGNING_NONCES_NAMESPACE, Result}; - -use cosmwasm_std::{Addr, Storage}; -use cw_storage_plus::Map; -use nym_contracts_common::signing::Nonce; - -pub const NONCES: Map<'_, Addr, Nonce> = Map::new(SIGNING_NONCES_NAMESPACE); - -pub fn get_signing_nonce(storage: &dyn Storage, address: Addr) -> Result { - let nonce = NONCES.may_load(storage, address)?.unwrap_or(0); - Ok(nonce) -} - -fn update_signing_nonce(storage: &mut dyn Storage, address: Addr, value: Nonce) -> Result<()> { - NONCES - .save(storage, address, &value) - .map_err(|err| err.into()) -} - -pub fn increment_signing_nonce(storage: &mut dyn Storage, address: Addr) -> Result<()> { - // get the current nonce - let nonce = get_signing_nonce(storage, address.clone())?; - - // increment it for the next use - update_signing_nonce(storage, address, nonce + 1) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test_helpers::transactions::instantiate_test_contract; - use cosmwasm_std::{ - testing::{MockApi, MockQuerier}, - MemoryStorage, OwnedDeps, - }; - use rstest::rstest; - - type TestDeps = OwnedDeps; - - #[rstest::fixture] - fn deps() -> TestDeps { - instantiate_test_contract() - } - - fn addr(s: &str) -> Addr { - Addr::unchecked(s) - } - - #[rstest] - fn getting_signing_nonce_doesnt_increment_it(deps: TestDeps) { - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 0); - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 0); - } - - #[rstest] - fn increment_works(mut deps: TestDeps) { - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 0); - increment_signing_nonce(&mut deps.storage, addr("gunnar")).unwrap(); - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 1); - } - - #[rstest] - fn incrementing_is_independent(mut deps: TestDeps) { - increment_signing_nonce(&mut deps.storage, addr("gunnar")).unwrap(); - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 1); - assert_eq!(get_signing_nonce(&deps.storage, addr("bjorn")).unwrap(), 0); - } -} diff --git a/contracts/name-service/src/test_helpers/assert.rs b/contracts/name-service/src/test_helpers/assert.rs deleted file mode 100644 index 1f2475b196..0000000000 --- a/contracts/name-service/src/test_helpers/assert.rs +++ /dev/null @@ -1,79 +0,0 @@ -use cosmwasm_std::{from_binary, testing::mock_env, Addr, Coin, Deps}; -use nym_contracts_common::signing::Nonce; -use nym_name_service_common::{ - msg::QueryMsg, - response::{ConfigResponse, PagedNamesListResponse}, - NameId, RegisteredName, -}; - -use crate::{constants::NAME_DEFAULT_RETRIEVAL_LIMIT, NameServiceError}; - -pub fn assert_config(deps: Deps, admin: &Addr, deposit_required: Coin) { - crate::state::assert_admin(deps, admin).unwrap(); - let res = crate::contract::query(deps, mock_env(), QueryMsg::Config {}).unwrap(); - let config: ConfigResponse = from_binary(&res).unwrap(); - assert_eq!(config, ConfigResponse { deposit_required }); -} - -pub fn assert_names(deps: Deps, expected_names: &[RegisteredName]) { - let res = crate::contract::query(deps, mock_env(), QueryMsg::all()).unwrap(); - let names: PagedNamesListResponse = from_binary(&res).unwrap(); - let start_next_after = expected_names.iter().last().map(|s| s.id); - assert_eq!( - names, - PagedNamesListResponse { - names: expected_names.to_vec(), - per_page: NAME_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after, - } - ); -} - -pub fn assert_name(deps: Deps, expected_name: &RegisteredName) { - let res = crate::contract::query( - deps, - mock_env(), - QueryMsg::NameId { - name_id: expected_name.id, - }, - ) - .unwrap(); - let names: RegisteredName = from_binary(&res).unwrap(); - assert_eq!(&names, expected_name); -} - -pub fn assert_empty(deps: Deps) { - let res = crate::contract::query(deps, mock_env(), QueryMsg::all()).unwrap(); - let names: PagedNamesListResponse = from_binary(&res).unwrap(); - assert!(names.names.is_empty()); -} - -pub fn assert_not_found(deps: Deps, expected_id: NameId) { - let res = crate::contract::query( - deps, - mock_env(), - QueryMsg::NameId { - name_id: expected_id, - }, - ) - .unwrap_err(); - assert!(matches!( - res, - NameServiceError::NotFound { - name_id: _expected_id - } - )); -} - -pub fn assert_current_nonce(deps: Deps, address: &Addr, expected_nonce: Nonce) { - let res = crate::contract::query( - deps, - mock_env(), - QueryMsg::SigningNonce { - address: address.to_string(), - }, - ) - .unwrap(); - let nonce: Nonce = from_binary(&res).unwrap(); - assert_eq!(nonce, expected_nonce); -} diff --git a/contracts/name-service/src/test_helpers/fixture.rs b/contracts/name-service/src/test_helpers/fixture.rs deleted file mode 100644 index 8a71681486..0000000000 --- a/contracts/name-service/src/test_helpers/fixture.rs +++ /dev/null @@ -1,141 +0,0 @@ -use cosmwasm_std::{Addr, Coin, DepsMut}; -use nym_contracts_common::{signing::MessageSignature, IdentityKeyRef}; -use nym_crypto::asymmetric::{encryption, identity}; -use nym_name_service_common::{Address, NameDetails, NameId, NymName, RegisteredName}; -use nym_sphinx_addressing::clients::Recipient; -use rand_chacha::rand_core::{CryptoRng, RngCore}; - -use super::{ - helpers::nyms, - signing::{ed25519_sign_message, name_register_sign_payload}, -}; - -pub fn new_name( - name_id: NameId, - name: &NymName, - address: &Address, - owner: &Addr, - identity_key: IdentityKeyRef, -) -> RegisteredName { - RegisteredName { - id: name_id, - name: NameDetails { - name: name.clone(), - address: address.clone(), - identity_key: identity_key.to_string(), - }, - owner: owner.clone(), - block_height: 12345, - deposit: nyms(100), - } -} - -pub fn name_fixture(id: NameId) -> RegisteredName { - new_name( - id, - &NymName::new("my-service").unwrap(), - &Address::new("client_id.client_key@gateway_id").unwrap(), - &Addr::unchecked("steve"), - "identity", - ) -} - -pub fn name_fixture_full(id: NameId, name: &str, address: &str, owner: &str) -> RegisteredName { - new_name( - id, - &NymName::new(name).unwrap(), - &Address::new(address).unwrap(), - &Addr::unchecked(owner), - "identity", - ) -} - -fn new_recipient(rng: &mut R) -> (Recipient, identity::KeyPair) -where - R: RngCore + CryptoRng, -{ - let client_id_keys = identity::KeyPair::new(rng); - let client_enc_keys = encryption::KeyPair::new(rng); - let gateway_id_keys = identity::KeyPair::new(rng); - - ( - Recipient::new( - *client_id_keys.public_key(), - *client_enc_keys.public_key(), - *gateway_id_keys.public_key(), - ), - client_id_keys, - ) -} - -pub fn new_address(rng: &mut R) -> (Address, identity::KeyPair) -where - R: RngCore + CryptoRng, -{ - let (recipient, client_id_keys) = new_recipient(rng); - let address = Address::new(&recipient.to_string()).unwrap(); - (address, client_id_keys) -} - -// Create a new name with a correctly generated nym address and matching identity key -pub fn new_name_details(rng: &mut R, name: &str) -> (NameDetails, identity::KeyPair) -where - R: RngCore + CryptoRng, -{ - let (address, client_id_keys) = new_address(rng); - let identity_key = client_id_keys.public_key().to_base58_string(); - - ( - NameDetails { - name: NymName::new(name).unwrap(), - address, - identity_key, - }, - client_id_keys, - ) -} - -// Create a new name, with a correctly generated nym adress and identity key, and sign it -pub fn new_name_details_with_sign( - deps: DepsMut<'_>, - rng: &mut R, - name: &str, - owner: &str, - deposit: Coin, -) -> (NameDetails, MessageSignature) -where - R: RngCore + CryptoRng, -{ - // Name - let (name, client_id_keys) = new_name_details(rng, name); - - // Sign - let sign_msg = name_register_sign_payload(deps.as_ref(), owner, name.clone(), deposit); - let owner_signature = ed25519_sign_message(sign_msg, client_id_keys.private_key()); - - (name, owner_signature) -} - -#[cfg(test)] -mod test { - use crate::test_helpers::helpers; - - use super::*; - - #[test] - fn new_recipient_creates_matching_identity_and_client_id_public_key() { - let mut test_rng = helpers::test_rng(); - let (recipient, client_id_keys) = new_recipient(&mut test_rng); - assert_eq!(recipient.identity(), client_id_keys.public_key()); - - // A test not for our code, but that we actually confirm our understanding of Recipient. - // One might view it as unnecessary, but it's a good sanity check for such a core assumption. - let recipient_str = format!( - "{}.{}@{}", - recipient.identity().to_base58_string(), - recipient.encryption_key().to_base58_string(), - recipient.gateway().to_base58_string() - ); - assert_eq!(recipient.to_string(), recipient_str); - } -} diff --git a/contracts/name-service/src/test_helpers/helpers.rs b/contracts/name-service/src/test_helpers/helpers.rs deleted file mode 100644 index 145802e061..0000000000 --- a/contracts/name-service/src/test_helpers/helpers.rs +++ /dev/null @@ -1,54 +0,0 @@ -use cosmwasm_std::{Coin, Event, Response}; -use cw_multi_test::AppResponse; -use rand_chacha::{rand_core::SeedableRng, ChaCha20Rng}; - -pub fn nyms(amount: u64) -> Coin { - Coin::new(amount.into(), "unym") -} - -pub fn test_rng() -> ChaCha20Rng { - let dummy_seed = [42u8; 32]; - ChaCha20Rng::from_seed(dummy_seed) -} - -pub fn get_event_types(response: &Response, event_type: &str) -> Vec { - response - .events - .iter() - .filter(|ev| ev.ty == event_type) - .cloned() - .collect() -} - -pub fn get_attribute(response: &Response, event_type: &str, key: &str) -> String { - get_event_types(response, event_type) - .first() - .unwrap() - .attributes - .iter() - .find(|attr| attr.key == key) - .unwrap() - .value - .clone() -} - -pub fn get_app_event_types(response: &AppResponse, event_type: &str) -> Vec { - response - .events - .iter() - .filter(|ev| ev.ty == event_type) - .cloned() - .collect() -} - -pub fn get_app_attribute(response: &AppResponse, event_type: &str, key: &str) -> String { - get_app_event_types(response, event_type) - .first() - .unwrap() - .attributes - .iter() - .find(|attr| attr.key == key) - .unwrap() - .value - .clone() -} diff --git a/contracts/name-service/src/test_helpers/mod.rs b/contracts/name-service/src/test_helpers/mod.rs deleted file mode 100644 index ee0717f4e4..0000000000 --- a/contracts/name-service/src/test_helpers/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod assert; -pub mod fixture; -pub mod helpers; -pub mod signing; -pub mod transactions; diff --git a/contracts/name-service/src/test_helpers/signing.rs b/contracts/name-service/src/test_helpers/signing.rs deleted file mode 100644 index 2a2a280290..0000000000 --- a/contracts/name-service/src/test_helpers/signing.rs +++ /dev/null @@ -1,39 +0,0 @@ -use cosmwasm_std::{Addr, Coin, Deps}; -use nym_contracts_common::signing::{ - MessageSignature, SignableMessage, SigningAlgorithm, SigningPurpose, -}; -use nym_crypto::asymmetric::identity; -use nym_name_service_common::{ - signing_types::{construct_name_register_sign_payload, SignableNameRegisterMsg}, - NameDetails, -}; -use serde::Serialize; - -use crate::state; - -pub fn name_register_sign_payload( - deps: Deps<'_>, - owner: &str, - name: NameDetails, - deposit: Coin, -) -> SignableNameRegisterMsg { - let owner = Addr::unchecked(owner); - let nonce = state::get_signing_nonce(deps.storage, owner.clone()).unwrap(); - construct_name_register_sign_payload(nonce, owner, deposit, name) -} - -pub fn ed25519_sign_message( - message: SignableMessage, - private_key: &identity::PrivateKey, -) -> MessageSignature { - match message.algorithm { - SigningAlgorithm::Ed25519 => { - let plaintext = message.to_plaintext().unwrap(); - let signature = private_key.sign(plaintext); - MessageSignature::from(signature.to_bytes().as_ref()) - } - SigningAlgorithm::Secp256k1 => { - unimplemented!() - } - } -} diff --git a/contracts/name-service/src/test_helpers/transactions.rs b/contracts/name-service/src/test_helpers/transactions.rs deleted file mode 100644 index 9b90515597..0000000000 --- a/contracts/name-service/src/test_helpers/transactions.rs +++ /dev/null @@ -1,70 +0,0 @@ -use cosmwasm_std::{ - coin, - testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier}, - DepsMut, MemoryStorage, OwnedDeps, -}; -use nym_name_service_common::{ - events::{NameEventType, NAME_ID}, - msg::{ExecuteMsg, InstantiateMsg}, - NameDetails, NameId, NymName, -}; -use rand_chacha::rand_core::{CryptoRng, RngCore}; - -use super::helpers::{get_attribute, nyms}; - -pub fn instantiate_test_contract() -> OwnedDeps { - let mut deps = mock_dependencies(); - let msg = InstantiateMsg { - deposit_required: coin(100, "unym"), - }; - let env = mock_env(); - let info = mock_info("creator", &[]); - let res = crate::instantiate(deps.as_mut(), env, info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - deps -} - -pub fn register_name( - mut deps: DepsMut<'_>, - rng: &mut R, - name: &str, - owner: &str, -) -> (NameId, NameDetails) -where - R: RngCore + CryptoRng, -{ - let deposit = nyms(100); - let (name, owner_signature) = super::fixture::new_name_details_with_sign( - deps.branch(), - rng, - name, - owner, - deposit.clone(), - ); - - // Register - let msg = ExecuteMsg::Register { - name: name.clone(), - owner_signature, - }; - let info = mock_info(owner, &[deposit]); - let res = crate::execute(deps, mock_env(), info, msg).unwrap(); - - let name_id: NameId = get_attribute(&res, &NameEventType::Register.to_string(), NAME_ID) - .parse() - .unwrap(); - (name_id, name) -} - -pub fn delete_name_id(deps: DepsMut<'_>, name_id: NameId, owner: &str) { - let msg = ExecuteMsg::DeleteId { name_id }; - let info = mock_info(owner, &[]); - crate::execute(deps, mock_env(), info, msg).unwrap(); -} - -#[allow(unused)] -pub fn delete_name(deps: DepsMut<'_>, name: NymName, owner: &str) { - let msg = ExecuteMsg::DeleteName { name }; - let info = mock_info(owner, &[]); - crate::execute(deps, mock_env(), info, msg).unwrap(); -} diff --git a/contracts/service-provider-directory/.cargo/config b/contracts/service-provider-directory/.cargo/config deleted file mode 100644 index 2f698e22b3..0000000000 --- a/contracts/service-provider-directory/.cargo/config +++ /dev/null @@ -1,5 +0,0 @@ -[alias] -wasm = "build --release --lib --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" -unit-test = "test --lib" -schema = "run --bin schema --features=schema-gen" \ No newline at end of file diff --git a/contracts/service-provider-directory/Makefile b/contracts/service-provider-directory/Makefile deleted file mode 100644 index f138e2c879..0000000000 --- a/contracts/service-provider-directory/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -generate-schema: - cargo schema \ No newline at end of file diff --git a/contracts/service-provider-directory/build.rs b/contracts/service-provider-directory/build.rs deleted file mode 100644 index bd26c886d2..0000000000 --- a/contracts/service-provider-directory/build.rs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use vergen::{vergen, Config}; - -fn main() { - let mut config = Config::default(); - if std::env::var("DOCS_RS").is_ok() { - // If we don't have access to git information, such as in a docs.rs build, don't error - *config.git_mut().skip_if_error_mut() = true; - } - vergen(config).expect("failed to extract build metadata"); -} diff --git a/contracts/service-provider-directory/schema/nym-service-provider-directory.json b/contracts/service-provider-directory/schema/nym-service-provider-directory.json deleted file mode 100644 index d923ef3f99..0000000000 --- a/contracts/service-provider-directory/schema/nym-service-provider-directory.json +++ /dev/null @@ -1,1104 +0,0 @@ -{ - "contract_name": "nym-service-provider-directory", - "contract_version": "0.1.0", - "idl_version": "1.0.0", - "instantiate": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "execute": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "type": "object", - "required": [ - "announce" - ], - "properties": { - "announce": { - "type": "object", - "required": [ - "owner_signature", - "service" - ], - "properties": { - "owner_signature": { - "$ref": "#/definitions/MessageSignature" - }, - "service": { - "$ref": "#/definitions/ServiceDetails" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "delete_id" - ], - "properties": { - "delete_id": { - "type": "object", - "required": [ - "service_id" - ], - "properties": { - "service_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "delete_nym_address" - ], - "properties": { - "delete_nym_address": { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddress" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_deposit_required" - ], - "properties": { - "update_deposit_required": { - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "MessageSignature": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "query": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "type": "object", - "required": [ - "service_id" - ], - "properties": { - "service_id": { - "type": "object", - "required": [ - "service_id" - ], - "properties": { - "service_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_announcer" - ], - "properties": { - "by_announcer": { - "type": "object", - "required": [ - "announcer" - ], - "properties": { - "announcer": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_nym_address" - ], - "properties": { - "by_nym_address": { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddress" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "all" - ], - "properties": { - "all": { - "type": "object", - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "signing_nonce" - ], - "properties": { - "signing_nonce": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets build information of this contract, such as the commit hash used for the build or rustc version.", - "type": "object", - "required": [ - "get_contract_version" - ], - "properties": { - "get_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets the stored contract version information that's required by the CW2 spec interface for migrations.", - "type": "object", - "required": [ - "get_cw2_contract_version" - ], - "properties": { - "get_cw2_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - } - } - }, - "migrate": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MigrateMsg", - "type": "object", - "additionalProperties": false - }, - "sudo": null, - "responses": { - "all": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "PagedServicesListResponse", - "type": "object", - "required": [ - "per_page", - "services" - ], - "properties": { - "per_page": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/Service" - } - }, - "start_next_after": { - "description": "Field indicating paging information for the following queries if the caller wishes to get further entries.", - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "Service": { - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "by_announcer": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ServicesListResponse", - "type": "object", - "required": [ - "services" - ], - "properties": { - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/Service" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "Service": { - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "by_nym_address": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ServicesListResponse", - "type": "object", - "required": [ - "services" - ], - "properties": { - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/Service" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "Service": { - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "config": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ConfigResponse", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "get_c_w2_contract_version": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractVersion", - "type": "object", - "required": [ - "contract", - "version" - ], - "properties": { - "contract": { - "description": "contract is the crate name of the implementing contract, eg. `crate:cw20-base` we will use other prefixes for other languages, and their standard global namespacing", - "type": "string" - }, - "version": { - "description": "version is any string that this implementation knows. It may be simple counter \"1\", \"2\". or semantic version on release tags \"v0.7.0\", or some custom feature flag list. the only code that needs to understand the version parsing is code that knows how to migrate from the given contract (and is tied to it's implementation somehow)", - "type": "string" - } - }, - "additionalProperties": false - }, - "get_contract_version": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractBuildInformation", - "type": "object", - "required": [ - "build_timestamp", - "build_version", - "commit_branch", - "commit_sha", - "commit_timestamp", - "rustc_version" - ], - "properties": { - "build_timestamp": { - "description": "Provides the build timestamp, for example `2021-02-23T20:14:46.558472672+00:00`.", - "type": "string" - }, - "build_version": { - "description": "Provides the build version, for example `0.1.0-9-g46f83e1`.", - "type": "string" - }, - "commit_branch": { - "description": "Provides the name of the git branch that was used for the build, for example `master`.", - "type": "string" - }, - "commit_sha": { - "description": "Provides the hash of the commit that was used for the build, for example `46f83e112520533338245862d366f6a02cef07d4`.", - "type": "string" - }, - "commit_timestamp": { - "description": "Provides the timestamp of the commit that was used for the build, for example `2021-02-23T08:08:02-05:00`.", - "type": "string" - }, - "rustc_version": { - "description": "Provides the rustc version that was used for the build, for example `1.52.0-nightly`.", - "type": "string" - } - }, - "additionalProperties": false - }, - "service_id": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Service", - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "signing_nonce": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "uint32", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/execute.json b/contracts/service-provider-directory/schema/raw/execute.json deleted file mode 100644 index 995ede2a3a..0000000000 --- a/contracts/service-provider-directory/schema/raw/execute.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "type": "object", - "required": [ - "announce" - ], - "properties": { - "announce": { - "type": "object", - "required": [ - "owner_signature", - "service" - ], - "properties": { - "owner_signature": { - "$ref": "#/definitions/MessageSignature" - }, - "service": { - "$ref": "#/definitions/ServiceDetails" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "delete_id" - ], - "properties": { - "delete_id": { - "type": "object", - "required": [ - "service_id" - ], - "properties": { - "service_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "delete_nym_address" - ], - "properties": { - "delete_nym_address": { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddress" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_deposit_required" - ], - "properties": { - "update_deposit_required": { - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "MessageSignature": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/instantiate.json b/contracts/service-provider-directory/schema/raw/instantiate.json deleted file mode 100644 index 73867fda63..0000000000 --- a/contracts/service-provider-directory/schema/raw/instantiate.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/migrate.json b/contracts/service-provider-directory/schema/raw/migrate.json deleted file mode 100644 index 7fbe8c5708..0000000000 --- a/contracts/service-provider-directory/schema/raw/migrate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MigrateMsg", - "type": "object", - "additionalProperties": false -} diff --git a/contracts/service-provider-directory/schema/raw/query.json b/contracts/service-provider-directory/schema/raw/query.json deleted file mode 100644 index f6abe3d45e..0000000000 --- a/contracts/service-provider-directory/schema/raw/query.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "type": "object", - "required": [ - "service_id" - ], - "properties": { - "service_id": { - "type": "object", - "required": [ - "service_id" - ], - "properties": { - "service_id": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_announcer" - ], - "properties": { - "by_announcer": { - "type": "object", - "required": [ - "announcer" - ], - "properties": { - "announcer": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "by_nym_address" - ], - "properties": { - "by_nym_address": { - "type": "object", - "required": [ - "nym_address" - ], - "properties": { - "nym_address": { - "$ref": "#/definitions/NymAddress" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "all" - ], - "properties": { - "all": { - "type": "object", - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "signing_nonce" - ], - "properties": { - "signing_nonce": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets build information of this contract, such as the commit hash used for the build or rustc version.", - "type": "object", - "required": [ - "get_contract_version" - ], - "properties": { - "get_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Gets the stored contract version information that's required by the CW2 spec interface for migrations.", - "type": "object", - "required": [ - "get_cw2_contract_version" - ], - "properties": { - "get_cw2_contract_version": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_all.json b/contracts/service-provider-directory/schema/raw/response_to_all.json deleted file mode 100644 index e9d7c842dd..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_all.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "PagedServicesListResponse", - "type": "object", - "required": [ - "per_page", - "services" - ], - "properties": { - "per_page": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/Service" - } - }, - "start_next_after": { - "description": "Field indicating paging information for the following queries if the caller wishes to get further entries.", - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "Service": { - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_by_announcer.json b/contracts/service-provider-directory/schema/raw/response_to_by_announcer.json deleted file mode 100644 index a0092cef6b..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_by_announcer.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ServicesListResponse", - "type": "object", - "required": [ - "services" - ], - "properties": { - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/Service" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "Service": { - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_by_nym_address.json b/contracts/service-provider-directory/schema/raw/response_to_by_nym_address.json deleted file mode 100644 index a0092cef6b..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_by_nym_address.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ServicesListResponse", - "type": "object", - "required": [ - "services" - ], - "properties": { - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/Service" - } - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "Service": { - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_config.json b/contracts/service-provider-directory/schema/raw/response_to_config.json deleted file mode 100644 index 16420c1130..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_config.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ConfigResponse", - "type": "object", - "required": [ - "deposit_required" - ], - "properties": { - "deposit_required": { - "$ref": "#/definitions/Coin" - } - }, - "additionalProperties": false, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_get_c_w2_contract_version.json b/contracts/service-provider-directory/schema/raw/response_to_get_c_w2_contract_version.json deleted file mode 100644 index 3ded8c84d9..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_get_c_w2_contract_version.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractVersion", - "type": "object", - "required": [ - "contract", - "version" - ], - "properties": { - "contract": { - "description": "contract is the crate name of the implementing contract, eg. `crate:cw20-base` we will use other prefixes for other languages, and their standard global namespacing", - "type": "string" - }, - "version": { - "description": "version is any string that this implementation knows. It may be simple counter \"1\", \"2\". or semantic version on release tags \"v0.7.0\", or some custom feature flag list. the only code that needs to understand the version parsing is code that knows how to migrate from the given contract (and is tied to it's implementation somehow)", - "type": "string" - } - }, - "additionalProperties": false -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_get_contract_version.json b/contracts/service-provider-directory/schema/raw/response_to_get_contract_version.json deleted file mode 100644 index 60ae65f3d1..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_get_contract_version.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ContractBuildInformation", - "type": "object", - "required": [ - "build_timestamp", - "build_version", - "commit_branch", - "commit_sha", - "commit_timestamp", - "rustc_version" - ], - "properties": { - "build_timestamp": { - "description": "Provides the build timestamp, for example `2021-02-23T20:14:46.558472672+00:00`.", - "type": "string" - }, - "build_version": { - "description": "Provides the build version, for example `0.1.0-9-g46f83e1`.", - "type": "string" - }, - "commit_branch": { - "description": "Provides the name of the git branch that was used for the build, for example `master`.", - "type": "string" - }, - "commit_sha": { - "description": "Provides the hash of the commit that was used for the build, for example `46f83e112520533338245862d366f6a02cef07d4`.", - "type": "string" - }, - "commit_timestamp": { - "description": "Provides the timestamp of the commit that was used for the build, for example `2021-02-23T08:08:02-05:00`.", - "type": "string" - }, - "rustc_version": { - "description": "Provides the rustc version that was used for the build, for example `1.52.0-nightly`.", - "type": "string" - } - }, - "additionalProperties": false -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_service_id.json b/contracts/service-provider-directory/schema/raw/response_to_service_id.json deleted file mode 100644 index 68f5ff143b..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_service_id.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Service", - "type": "object", - "required": [ - "announcer", - "block_height", - "deposit", - "service", - "service_id" - ], - "properties": { - "announcer": { - "description": "Address of the service owner.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "block_height": { - "description": "Block height at which the service was added.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "deposit": { - "description": "The deposit used to announce the service.", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "service": { - "description": "The announced service.", - "allOf": [ - { - "$ref": "#/definitions/ServiceDetails" - } - ] - }, - "service_id": { - "description": "Unique id assigned to the anounced service.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "NymAddress": { - "description": "The types of addresses supported.", - "oneOf": [ - { - "description": "String representation of a nym address, which is of the form client_id.client_enc@gateway_id.", - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "ServiceDetails": { - "type": "object", - "required": [ - "identity_key", - "nym_address", - "service_type" - ], - "properties": { - "identity_key": { - "description": "The identity key of the service.", - "type": "string" - }, - "nym_address": { - "description": "The address of the service.", - "allOf": [ - { - "$ref": "#/definitions/NymAddress" - } - ] - }, - "service_type": { - "description": "The service type.", - "allOf": [ - { - "$ref": "#/definitions/ServiceType" - } - ] - } - }, - "additionalProperties": false - }, - "ServiceType": { - "description": "The type of services provider supported", - "type": "string", - "enum": [ - "network_requester" - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/service-provider-directory/schema/raw/response_to_signing_nonce.json b/contracts/service-provider-directory/schema/raw/response_to_signing_nonce.json deleted file mode 100644 index de85c3e56e..0000000000 --- a/contracts/service-provider-directory/schema/raw/response_to_signing_nonce.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "uint32", - "type": "integer", - "format": "uint32", - "minimum": 0.0 -} diff --git a/contracts/service-provider-directory/src/bin/schema.rs b/contracts/service-provider-directory/src/bin/schema.rs deleted file mode 100644 index 0adf4b8827..0000000000 --- a/contracts/service-provider-directory/src/bin/schema.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use cosmwasm_schema::write_api; -use nym_service_provider_directory_common::msg::{ - ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, -}; - -fn main() { - write_api! { - instantiate: InstantiateMsg, - query: QueryMsg, - execute: ExecuteMsg, - migrate: MigrateMsg, - } -} diff --git a/contracts/service-provider-directory/src/constants.rs b/contracts/service-provider-directory/src/constants.rs deleted file mode 100644 index e83c6297e8..0000000000 --- a/contracts/service-provider-directory/src/constants.rs +++ /dev/null @@ -1,17 +0,0 @@ -// We limit the these for simplicity and to avoid having to deal with paging. -pub const MAX_NUMBER_OF_PROVIDERS_PER_ANNOUNCER: u32 = 100; -pub const MAX_NUMBER_OF_ALIASES_FOR_NYM_ADDRESS: u32 = 100; - -pub const SERVICE_DEFAULT_RETRIEVAL_LIMIT: u32 = 100; -pub const SERVICE_MAX_RETRIEVAL_LIMIT: u32 = 150; - -// Storage keys -pub const CONFIG_KEY: &str = "config"; -pub const ADMIN_KEY: &str = "admin"; -pub const SERVICE_ID_COUNTER_KEY: &str = "sidc"; - -pub const SERVICES_PK_NAMESPACE: &str = "sernames"; -pub const SERVICES_ANNOUNCER_IDX_NAMESPACE: &str = "serown"; -pub const SERVICES_NYM_ADDRESS_IDX_NAMESPACE: &str = "sernyma"; - -pub const SIGNING_NONCES_NAMESPACE: &str = "sn"; diff --git a/contracts/service-provider-directory/src/contract.rs b/contracts/service-provider-directory/src/contract.rs deleted file mode 100644 index 886ea79826..0000000000 --- a/contracts/service-provider-directory/src/contract.rs +++ /dev/null @@ -1,358 +0,0 @@ -use crate::{ - state::{self, Config}, - Result, SpContractError, -}; -use cosmwasm_std::{to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response}; -use nym_service_provider_directory_common::msg::{ - ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, -}; -use semver::Version; - -mod execute; -mod query; - -// version info for migration info -const CONTRACT_NAME: &str = "crate:nym-service-provider-directory"; -const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); - -pub fn instantiate( - mut deps: DepsMut<'_>, - _env: Env, - info: MessageInfo, - msg: InstantiateMsg, -) -> Result { - state::set_admin(deps.branch(), info.sender.clone())?; - - let config = Config { - deposit_required: msg.deposit_required, - }; - cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - state::save_config(deps.storage, &config)?; - - Ok(Response::new() - .add_attribute("method", "instantiate") - .add_attribute("admin", info.sender)) -} - -pub fn migrate( - deps: DepsMut<'_>, - _env: Env, - _msg: MigrateMsg, -) -> Result { - // Note: don't remove this particular bit of code as we have to ALWAYS check whether we have to - // update the stored version - let version: Version = CONTRACT_VERSION.parse().map_err(|error: semver::Error| { - SpContractError::SemVerFailure { - value: CONTRACT_VERSION.to_string(), - error_message: error.to_string(), - } - })?; - - let storage_version_raw = cw2::get_contract_version(deps.storage)?.version; - let storage_version: Version = - storage_version_raw - .parse() - .map_err(|error: semver::Error| SpContractError::SemVerFailure { - value: storage_version_raw, - error_message: error.to_string(), - })?; - - if storage_version < version { - cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - - // If state structure changed in any contract version in the way migration is needed, it - // should occur here, for example anything from `crate::queued_migrations::` - } - - Ok(Response::new()) -} - -pub fn execute( - deps: DepsMut<'_>, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, -) -> Result { - match msg { - ExecuteMsg::Announce { - service, - owner_signature, - } => execute::announce(deps, env, info, service, owner_signature), - ExecuteMsg::DeleteId { service_id } => execute::delete_id(deps, info, service_id), - ExecuteMsg::DeleteNymAddress { nym_address } => { - execute::delete_nym_address(deps, info, nym_address) - } - ExecuteMsg::UpdateDepositRequired { deposit_required } => { - execute::update_deposit_required(deps, info, deposit_required) - } - } -} - -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result { - let response = match msg { - QueryMsg::ServiceId { service_id } => to_binary(&query::query_id(deps, service_id)?), - QueryMsg::ByAnnouncer { announcer } => to_binary(&query::query_announcer(deps, announcer)?), - QueryMsg::ByNymAddress { nym_address } => { - to_binary(&query::query_nym_address(deps, nym_address)?) - } - QueryMsg::All { limit, start_after } => { - to_binary(&query::query_all_paged(deps, limit, start_after)?) - } - QueryMsg::SigningNonce { address } => { - to_binary(&query::query_current_signing_nonce(deps, address)?) - } - QueryMsg::Config {} => to_binary(&query::query_config(deps)?), - QueryMsg::GetContractVersion {} => to_binary(&query::query_contract_version()), - QueryMsg::GetCW2ContractVersion {} => to_binary(&cw2::get_contract_version(deps.storage)?), - }; - Ok(response?) -} - -#[cfg(test)] -mod tests { - use super::*; - - use crate::test_helpers::{ - assert::{ - assert_config, assert_current_nonce, assert_empty, assert_not_found, assert_service, - assert_services, - }, - fixture::new_service_details_with_sign, - helpers::{get_attribute, nyms, test_rng}, - }; - - use cosmwasm_std::{ - testing::{mock_dependencies, mock_env, mock_info}, - Addr, Coin, - }; - use nym_service_provider_directory_common::{Service, ServiceId}; - - const DENOM: &str = "unym"; - - #[test] - fn instantiate_contract() { - let mut deps = mock_dependencies(); - let msg = InstantiateMsg { - deposit_required: Coin::new(100u128, DENOM), - }; - let info = mock_info("creator", &[]); - let admin = info.sender.clone(); - - // Instantiate contract - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Check that it worked by querying the config, and checking that the list of services is - // empty - assert_config(deps.as_ref(), &admin, Coin::new(100u128, DENOM)); - assert_empty(deps.as_ref()); - } - - #[test] - fn announce_fails_incorrect_deposit_too_small() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(nyms(100)); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Setup service - let deposit = nyms(99); - let announcer = "steve"; - let (service, owner_signature) = - new_service_details_with_sign(deps.as_mut(), &mut rng, "nym", announcer, deposit); - let msg = ExecuteMsg::Announce { - service, - owner_signature, - }; - - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(announcer, &[nyms(99)]), - msg.clone() - ) - .unwrap_err(), - SpContractError::InsufficientDeposit { - funds: 99u128.into(), - deposit_required: 100u128.into(), - } - ); - - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(announcer, &[nyms(100)]), - msg, - ) - .unwrap_err(), - SpContractError::InvalidEd25519Signature, - ); - } - - // Announcing a service fails due to the signed deposit being different from the deposit in - // the message. - #[test] - fn announce_fails_incorrect_deposit_too_large() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(nyms(100)); - let info = mock_info("creator", &[]); - let admin = info.sender.clone(); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Setup service - let deposit = nyms(101); - let announcer = "steve"; - let (service, owner_signature) = - new_service_details_with_sign(deps.as_mut(), &mut rng, "nym", announcer, deposit); - let msg = ExecuteMsg::Announce { - service, - owner_signature, - }; - - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(announcer, &[nyms(100)]), - msg.clone() - ) - .unwrap_err(), - SpContractError::InvalidEd25519Signature, - ); - assert_eq!( - execute( - deps.as_mut(), - mock_env(), - mock_info(announcer, &[nyms(101)]), - msg, - ) - .unwrap_err(), - SpContractError::TooLargeDeposit { - funds: 101u128.into(), - deposit_required: 100u128.into(), - } - ); - - assert_config(deps.as_ref(), &admin, Coin::new(100, DENOM)); - assert_empty(deps.as_ref()); - } - - #[test] - fn announce_success() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(nyms(100)); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - assert_current_nonce(deps.as_ref(), &Addr::unchecked("steve"), 0); - - // Setup service - let deposit = nyms(100); - let owner = "steve"; - let (service, owner_signature) = - new_service_details_with_sign(deps.as_mut(), &mut rng, "nym", owner, deposit.clone()); - - // Announce - let msg = ExecuteMsg::Announce { - service: service.clone(), - owner_signature, - }; - let info = mock_info("steve", &[deposit.clone()]); - let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); - - // Check that the service has had service id assigned to it - let expected_id = 1; - let id: ServiceId = get_attribute(&res, "announce", "service_id") - .parse() - .unwrap(); - assert_eq!(id, expected_id); - assert_eq!( - get_attribute(&res, "announce", "service_type"), - "network_requester".to_string() - ); - - // Check that the nonce has been incremented, but only for the owner - assert_current_nonce(deps.as_ref(), &Addr::unchecked("steve"), 1); - assert_current_nonce(deps.as_ref(), &Addr::unchecked("timmy"), 0); - - // The expected announced service - let expected_service = Service { - service_id: expected_id, - service, - announcer: Addr::unchecked("steve"), - block_height: 12345, - deposit, - }; - assert_services(deps.as_ref(), &[expected_service.clone()]); - assert_service(deps.as_ref(), &expected_service); - } - - #[test] - fn delete() { - let mut rng = test_rng(); - let mut deps = mock_dependencies(); - let msg = InstantiateMsg::new(Coin::new(100, "unym")); - let info = mock_info("creator", &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - - // Announce - let deposit = nyms(100); - let steve = "steve"; - let (service, owner_signature) = - new_service_details_with_sign(deps.as_mut(), &mut rng, "nym", steve, deposit.clone()); - let msg = ExecuteMsg::Announce { - service: service.clone(), - owner_signature, - }; - let info_steve = mock_info(steve, &[deposit.clone()]); - execute(deps.as_mut(), mock_env(), info_steve.clone(), msg).unwrap(); - - // The expected announced service - let expected_id = 1; - let expected_service = Service { - service_id: expected_id, - service, - announcer: Addr::unchecked(steve), - block_height: 12345, - deposit, - }; - assert_services(deps.as_ref(), &[expected_service]); - - // Removing someone else's service will fail - let msg = ExecuteMsg::delete_id(expected_id); - let info_timmy = mock_info("timmy", &[]); - assert_eq!( - execute(deps.as_mut(), mock_env(), info_timmy, msg).unwrap_err(), - SpContractError::Unauthorized { - sender: Addr::unchecked("timmy") - } - ); - - // Removing an non-existent service will fail - let msg = ExecuteMsg::delete_id(expected_id + 1); - assert_eq!( - execute(deps.as_mut(), mock_env(), info_steve.clone(), msg).unwrap_err(), - SpContractError::NotFound { - service_id: expected_id + 1 - } - ); - - // Remove as correct announcer succeeds - let msg = ExecuteMsg::delete_id(expected_id); - let res = execute(deps.as_mut(), mock_env(), info_steve, msg).unwrap(); - assert_eq!( - get_attribute(&res, "delete_id", "service_id"), - expected_id.to_string() - ); - assert_services(deps.as_ref(), &[]); - assert_not_found(deps.as_ref(), expected_id); - } -} diff --git a/contracts/service-provider-directory/src/contract/execute.rs b/contracts/service-provider-directory/src/contract/execute.rs deleted file mode 100644 index f3e240f7ad..0000000000 --- a/contracts/service-provider-directory/src/contract/execute.rs +++ /dev/null @@ -1,210 +0,0 @@ -use crate::{ - constants::{MAX_NUMBER_OF_ALIASES_FOR_NYM_ADDRESS, MAX_NUMBER_OF_PROVIDERS_PER_ANNOUNCER}, - state, Result, SpContractError, -}; -use cosmwasm_std::{Addr, BankMsg, Coin, Deps, DepsMut, Env, MessageInfo, Response, Uint128}; -use nym_contracts_common::{ - signing::{MessageSignature, Verifier}, - IdentityKey, -}; -use nym_service_provider_directory_common::{ - events::{new_announce_event, new_delete_id_event, new_update_deposit_required_event}, - signing_types::construct_service_provider_announce_sign_payload, - NymAddress, Service, ServiceDetails, ServiceId, -}; - -use super::query; - -fn ensure_correct_deposit(will_deposit: Uint128, deposit_required: Uint128) -> Result<()> { - match will_deposit.cmp(&deposit_required) { - std::cmp::Ordering::Less => Err(SpContractError::InsufficientDeposit { - funds: will_deposit, - deposit_required, - }), - std::cmp::Ordering::Equal => Ok(()), - std::cmp::Ordering::Greater => Err(SpContractError::TooLargeDeposit { - funds: will_deposit, - deposit_required, - }), - } -} - -fn ensure_max_services_per_announcer(deps: Deps, announcer: Addr) -> Result<()> { - let current_entries = query::query_announcer(deps, announcer.to_string())?; - if current_entries.services.len() < MAX_NUMBER_OF_PROVIDERS_PER_ANNOUNCER as usize { - Ok(()) - } else { - Err(SpContractError::ReachedMaxProvidersForAdmin { - max_providers: MAX_NUMBER_OF_PROVIDERS_PER_ANNOUNCER, - announcer, - }) - } -} - -fn ensure_max_aliases_per_nym_address(deps: Deps, nym_address: NymAddress) -> Result<()> { - let current_entries = query::query_nym_address(deps, nym_address.clone())?; - if current_entries.services.len() < MAX_NUMBER_OF_ALIASES_FOR_NYM_ADDRESS as usize { - Ok(()) - } else { - Err(SpContractError::ReachedMaxAliasesForNymAddress { - max_aliases: MAX_NUMBER_OF_ALIASES_FOR_NYM_ADDRESS, - nym_address, - }) - } -} - -fn ensure_service_exists(deps: Deps, service_id: ServiceId) -> Result<()> { - if state::has_service(deps.storage, service_id) { - Ok(()) - } else { - Err(SpContractError::NotFound { service_id }) - } -} - -fn ensure_sender_authorized(info: MessageInfo, service: &Service) -> Result<()> { - if info.sender == service.announcer { - Ok(()) - } else { - Err(SpContractError::Unauthorized { - sender: info.sender, - }) - } -} - -fn return_deposit(service_to_delete: &Service) -> BankMsg { - BankMsg::Send { - to_address: service_to_delete.announcer.to_string(), - amount: vec![service_to_delete.deposit.clone()], - } -} - -fn verify_announce_signature( - deps: Deps<'_>, - sender: Addr, - deposit: Coin, - service: ServiceDetails, - signature: MessageSignature, -) -> Result<()> { - // recover the public key - let public_key = decode_ed25519_identity_key(&service.identity_key)?; - - // reconstruct the payload - let nonce = state::get_signing_nonce(deps.storage, sender.clone())?; - - let msg = construct_service_provider_announce_sign_payload(nonce, sender, deposit, service); - - if deps.api.verify_message(msg, signature, &public_key)? { - Ok(()) - } else { - Err(SpContractError::InvalidEd25519Signature) - } -} - -fn decode_ed25519_identity_key(encoded: &IdentityKey) -> Result<[u8; 32]> { - let mut public_key = [0u8; 32]; - let used = bs58::decode(encoded) - .into(&mut public_key) - .map_err(|err| SpContractError::MalformedEd25519IdentityKey(err.to_string()))?; - - if used != 32 { - return Err(SpContractError::MalformedEd25519IdentityKey( - "Too few bytes provided for the public key".into(), - )); - } - - Ok(public_key) -} - -/// Announce a new service. It will be assigned a new service provider id. -pub fn announce( - deps: DepsMut, - env: Env, - info: MessageInfo, - service: ServiceDetails, - owner_signature: MessageSignature, -) -> Result { - ensure_max_services_per_announcer(deps.as_ref(), info.sender.clone())?; - ensure_max_aliases_per_nym_address(deps.as_ref(), service.nym_address.clone())?; - - let deposit_required = state::deposit_required(deps.storage)?; - let denom = deposit_required.denom.clone(); - let will_deposit = cw_utils::must_pay(&info, &denom) - .map_err(|err| SpContractError::DepositRequired { source: err })?; - ensure_correct_deposit(will_deposit, deposit_required.amount)?; - - let deposit = Coin::new(will_deposit.u128(), denom); - - // Check that the sender actually owns the service provider by checking the signature - verify_announce_signature( - deps.as_ref(), - info.sender.clone(), - deposit.clone(), - service.clone(), - owner_signature, - )?; - - state::increment_signing_nonce(deps.storage, info.sender.clone())?; - - let service_id = state::next_service_id_counter(deps.storage)?; - let new_service = Service { - service_id, - service, - announcer: info.sender, - block_height: env.block.height, - deposit, - }; - state::save(deps.storage, &new_service)?; - - Ok(Response::new().add_event(new_announce_event(service_id, new_service))) -} - -/// Delete an exsisting service. -pub fn delete_id(deps: DepsMut, info: MessageInfo, service_id: ServiceId) -> Result { - ensure_service_exists(deps.as_ref(), service_id)?; - let service_to_delete = state::load_id(deps.storage, service_id)?; - ensure_sender_authorized(info, &service_to_delete)?; - - state::remove(deps.storage, service_id)?; - let return_deposit_msg = return_deposit(&service_to_delete); - - Ok(Response::new() - .add_message(return_deposit_msg) - .add_event(new_delete_id_event(service_to_delete))) -} - -/// Delete an existing service by nym address. If there are multiple entries for a given nym -/// address then all entries with the matching announcer will be attempted to removed. -pub(crate) fn delete_nym_address( - deps: DepsMut, - info: MessageInfo, - nym_address: NymAddress, -) -> Result { - let mut response = Response::new(); - let services_to_delete = query::query_nym_address(deps.as_ref(), nym_address)?.services; - - for service_to_delete in services_to_delete { - if info.sender == service_to_delete.announcer { - state::remove(deps.storage, service_to_delete.service_id)?; - let return_deposit_msg = return_deposit(&service_to_delete); - response = response - .add_message(return_deposit_msg) - .add_event(new_delete_id_event(service_to_delete)); - } - } - Ok(response) -} - -/// Update the deposit required to announce new services -pub(crate) fn update_deposit_required( - deps: DepsMut, - info: MessageInfo, - deposit_required: Coin, -) -> Result { - state::assert_admin(deps.as_ref(), &info.sender)?; - - let mut config = state::load_config(deps.storage)?; - config.deposit_required = deposit_required.clone(); - state::save_config(deps.storage, &config)?; - - Ok(Response::new().add_event(new_update_deposit_required_event(deposit_required))) -} diff --git a/contracts/service-provider-directory/src/contract/query.rs b/contracts/service-provider-directory/src/contract/query.rs deleted file mode 100644 index 9aae594474..0000000000 --- a/contracts/service-provider-directory/src/contract/query.rs +++ /dev/null @@ -1,71 +0,0 @@ -use cosmwasm_std::Deps; -use nym_contracts_common::{signing::Nonce, ContractBuildInformation}; -use nym_service_provider_directory_common::{ - response::{ConfigResponse, PagedServicesListResponse, ServicesListResponse}, - NymAddress, Service, ServiceId, -}; - -use crate::{ - state::{self, PagedLoad}, - Result, -}; - -pub fn query_id(deps: Deps, service_id: ServiceId) -> Result { - state::load_id(deps.storage, service_id) -} - -pub fn query_announcer(deps: Deps, announcer: String) -> Result { - let announcer = deps.api.addr_validate(&announcer)?; - let services = state::load_announcer(deps.storage, announcer)?; - Ok(ServicesListResponse::new(services)) -} - -pub fn query_nym_address(deps: Deps, nym_address: NymAddress) -> Result { - let services = state::load_nym_address(deps.storage, nym_address)?; - Ok(ServicesListResponse::new(services)) -} - -pub fn query_all_paged( - deps: Deps, - limit: Option, - start_after: Option, -) -> Result { - let PagedLoad { - services, - limit, - start_next_after, - } = state::load_all_paged(deps.storage, limit, start_after)?; - Ok(PagedServicesListResponse::new( - services, - limit, - start_next_after, - )) -} - -pub fn query_current_signing_nonce(deps: Deps<'_>, address: String) -> Result { - let address = deps.api.addr_validate(&address)?; - state::get_signing_nonce(deps.storage, address) -} - -pub fn query_config(deps: Deps) -> Result { - let config = state::load_config(deps.storage)?; - Ok(config.into()) -} - -pub fn query_contract_version() -> ContractBuildInformation { - // as per docs - // env! macro will expand to the value of the named environment variable at - // compile time, yielding an expression of type `&'static str` - ContractBuildInformation { - build_timestamp: env!("VERGEN_BUILD_TIMESTAMP").to_string(), - build_version: env!("VERGEN_BUILD_SEMVER").to_string(), - commit_sha: option_env!("VERGEN_GIT_SHA").unwrap_or("NONE").to_string(), - commit_timestamp: option_env!("VERGEN_GIT_COMMIT_TIMESTAMP") - .unwrap_or("NONE") - .to_string(), - commit_branch: option_env!("VERGEN_GIT_BRANCH") - .unwrap_or("NONE") - .to_string(), - rustc_version: env!("VERGEN_RUSTC_SEMVER").to_string(), - } -} diff --git a/contracts/service-provider-directory/src/integration_tests/announce.rs b/contracts/service-provider-directory/src/integration_tests/announce.rs deleted file mode 100644 index db937f0186..0000000000 --- a/contracts/service-provider-directory/src/integration_tests/announce.rs +++ /dev/null @@ -1,183 +0,0 @@ -use cosmwasm_std::Addr; -use nym_service_provider_directory_common::{ - response::PagedServicesListResponse, NymAddress, Service, ServiceDetails, ServiceType, -}; -use rstest::rstest; - -use crate::{ - constants::SERVICE_DEFAULT_RETRIEVAL_LIMIT, - test_helpers::{fixture::new_service, helpers::nyms}, - SpContractError, -}; - -use super::test_setup::TestSetup; - -#[rstest::fixture] -fn setup() -> TestSetup { - TestSetup::new() -} - -#[rstest] -fn basic_announce(mut setup: TestSetup) { - assert_eq!( - setup.query_all(), - PagedServicesListResponse { - services: vec![], - per_page: SERVICE_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: None, - } - ); - - // Announce a first service - let announcer = Addr::unchecked("announcer"); - let nym_address = NymAddress::new("nymAddress"); - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance(&announcer), nyms(250)); - assert_eq!(setup.query_signing_nonce(announcer.to_string()), 0); - - let service = setup.new_service(&nym_address); - let payload = setup.payload_to_sign(&announcer, &nyms(100), &service.service); - let service = service.sign(payload); - setup.announce_net_req(&service, &announcer); - - // Deposit is deposited to contract and deducted from announcers's balance - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!(setup.balance(&announcer), nyms(150)); - - // The signing nonce has been incremented - assert_eq!(setup.query_signing_nonce(announcer.to_string()), 1); - - // We can query the full service list - assert_eq!( - setup.query_all(), - PagedServicesListResponse { - services: vec![Service { - service_id: 1, - service: ServiceDetails { - nym_address: nym_address.clone(), - service_type: ServiceType::NetworkRequester, - identity_key: service.identity_key().to_string(), - }, - announcer: announcer.clone(), - block_height: 12345, - deposit: nyms(100), - }], - per_page: SERVICE_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(1), - } - ); - - // ... and we can query by id - assert_eq!( - setup.query_id(1), - Service { - service_id: 1, - service: service.details().clone(), - announcer: announcer.clone(), - block_height: 12345, - deposit: nyms(100), - } - ); - - // Announce a second service - let announcer2 = Addr::unchecked("announcer2"); - let nym_address2 = NymAddress::new("nymAddress2"); - let service2 = setup.new_signed_service(&nym_address2, &announcer2, &nyms(100)); - setup.announce_net_req(&service2, &announcer2); - assert_eq!(setup.query_signing_nonce(announcer2.to_string()), 1); - - assert_eq!(setup.contract_balance(), nyms(200)); - assert_eq!( - setup.query_all(), - PagedServicesListResponse { - services: vec![ - new_service(1, &nym_address, &announcer, service.identity_key()), - new_service(2, &nym_address2, &announcer2, service2.identity_key()) - ], - per_page: SERVICE_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(2), - } - ); -} - -#[rstest] -fn announce_fails_when_announcer_mismatch(mut setup: TestSetup) { - let announcer = Addr::unchecked("steve"); - let nym_address = NymAddress::new("foobar"); - let service = setup.new_signed_service(&nym_address, &announcer, &nyms(100)); - - // A difference announcer tries to announce the service - let announcer2 = Addr::unchecked("timmy"); - - let resp: SpContractError = setup - .try_announce_net_req(&service, &announcer2) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(resp, SpContractError::InvalidEd25519Signature); -} - -#[rstest] -fn signing_nonce_is_increased_when_announcing(mut setup: TestSetup) { - let announcer1 = Addr::unchecked("announcer1"); - let announcer2 = Addr::unchecked("announcer2"); - - assert_eq!(setup.query_signing_nonce(announcer1.to_string()), 0); - assert_eq!(setup.query_signing_nonce(announcer2.to_string()), 0); - - setup.sign_and_announce_net_req(&NymAddress::new("nymAddress1"), &announcer1, &nyms(100)); - - assert_eq!(setup.query_signing_nonce(announcer1.to_string()), 1); - assert_eq!(setup.query_signing_nonce(announcer2.to_string()), 0); - - setup.sign_and_announce_net_req(&NymAddress::new("nymAddress2"), &announcer2, &nyms(100)); - - assert_eq!(setup.query_signing_nonce(announcer1.to_string()), 1); - assert_eq!(setup.query_signing_nonce(announcer2.to_string()), 1); - - setup.sign_and_announce_net_req(&NymAddress::new("nymAddress3"), &announcer2, &nyms(100)); - - assert_eq!(setup.query_signing_nonce(announcer1.to_string()), 1); - assert_eq!(setup.query_signing_nonce(announcer2.to_string()), 2); -} - -#[rstest] -fn creating_two_services_in_a_row_without_announcing_fails(mut setup: TestSetup) { - let announcer = Addr::unchecked("wealthy_announcer_1"); - let nym_address1 = NymAddress::new("nymAddress1"); - let nym_address2 = NymAddress::new("nymAddress2"); - let deposit = nyms(100); - - let s1 = setup.new_signed_service(&nym_address1, &announcer, &deposit); - - // This second service will be signed with the same nonce - let s2 = setup.new_signed_service(&nym_address2, &announcer, &deposit); - - // Announce the first service works, and this increments the nonce - setup.announce_net_req(&s1, &announcer); - - // Now the nonce has been incremented, and the signature will not match - let resp: SpContractError = setup - .try_announce_net_req(&s2, &announcer) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(resp, SpContractError::InvalidEd25519Signature,); -} - -#[rstest] -fn announcing_the_same_service_twice_fails(mut setup: TestSetup) { - let announcer = Addr::unchecked("wealthy_announcer_1"); - let nym_address = NymAddress::new("nymAddress1"); - - let s1 = setup.new_signed_service(&nym_address, &announcer, &nyms(100)); - setup.announce_net_req(&s1, &announcer); - - // Now the nonce has been incremented, and the signature will not match - let resp: SpContractError = setup - .try_announce_net_req(&s1, &announcer) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(resp, SpContractError::InvalidEd25519Signature); -} diff --git a/contracts/service-provider-directory/src/integration_tests/delete.rs b/contracts/service-provider-directory/src/integration_tests/delete.rs deleted file mode 100644 index 3fb7275763..0000000000 --- a/contracts/service-provider-directory/src/integration_tests/delete.rs +++ /dev/null @@ -1,144 +0,0 @@ -use cosmwasm_std::Addr; -use nym_service_provider_directory_common::{response::PagedServicesListResponse, NymAddress}; - -use crate::{ - constants::SERVICE_DEFAULT_RETRIEVAL_LIMIT, - test_helpers::{fixture::new_service, helpers::nyms}, - SpContractError, -}; - -use super::test_setup::TestSetup; - -#[test] -fn delete_service() { - let mut setup = TestSetup::new(); - setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress"), - &Addr::unchecked("announcer"), - &nyms(100), - ); - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!(setup.balance("announcer"), nyms(150)); - assert!(!setup.query_all().services.is_empty()); - setup.delete(1, &Addr::unchecked("announcer")); - - // Deleting the service returns the deposit to the announcer - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance("announcer"), nyms(250)); - assert!(setup.query_all().services.is_empty()); -} - -#[test] -fn only_announcer_can_delete_service() { - let mut setup = TestSetup::new(); - assert_eq!(setup.contract_balance(), nyms(0)); - setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress"), - &Addr::unchecked("announcer"), - &nyms(100), - ); - assert_eq!(setup.contract_balance(), nyms(100)); - assert!(!setup.query_all().services.is_empty()); - - let delete_resp: SpContractError = setup - .try_delete(1, &Addr::unchecked("not_announcer")) - .unwrap_err() - .downcast() - .unwrap(); - - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!( - delete_resp, - SpContractError::Unauthorized { - sender: Addr::unchecked("not_announcer") - } - ); -} - -#[test] -fn cant_delete_service_that_does_not_exist() { - let mut setup = TestSetup::new(); - setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress"), - &Addr::unchecked("announcer"), - &nyms(100), - ); - assert_eq!(setup.contract_balance(), nyms(100)); - assert!(!setup.query_all().services.is_empty()); - - let delete_resp: SpContractError = setup - .try_delete(0, &Addr::unchecked("announcer")) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!(delete_resp, SpContractError::NotFound { service_id: 0 }); - - let delete_resp: SpContractError = setup - .try_delete(2, &Addr::unchecked("announcer")) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(setup.contract_balance(), nyms(100)); - assert_eq!(delete_resp, SpContractError::NotFound { service_id: 2 }); - - assert!(!setup.query_all().services.is_empty()); - setup.delete(1, &Addr::unchecked("announcer")); - assert_eq!(setup.contract_balance(), nyms(0)); - assert!(setup.query_all().services.is_empty()); -} - -#[test] -fn announce_multiple_services_and_deleting_by_name() { - let mut setup = TestSetup::new(); - let announcer1 = Addr::unchecked("wealthy_announcer_1"); - let announcer2 = Addr::unchecked("wealthy_announcer_2"); - let nym_address1 = NymAddress::new("nymAddress1"); - let nym_address2 = NymAddress::new("nymAddress2"); - let deposit = nyms(100); - - // We announce the same address three times, but with different annoucers - assert_eq!(setup.contract_balance(), nyms(0)); - assert_eq!(setup.balance(&announcer1), nyms(1000)); - let s1 = setup.sign_and_announce_net_req(&nym_address1, &announcer1, &deposit); - let s2 = setup.sign_and_announce_net_req(&nym_address1, &announcer1, &deposit); - let s3 = setup.sign_and_announce_net_req(&nym_address2, &announcer1, &deposit); - let s4 = setup.sign_and_announce_net_req(&nym_address1, &announcer2, &deposit); - let s5 = setup.sign_and_announce_net_req(&nym_address2, &announcer2, &deposit); - - assert_eq!(setup.contract_balance(), nyms(500)); - assert_eq!(setup.balance(&announcer1), nyms(700)); - assert_eq!( - setup.query_all(), - PagedServicesListResponse { - services: vec![ - new_service(1, &nym_address1, &announcer1, s1.identity_key()), - new_service(2, &nym_address1, &announcer1, s2.identity_key()), - new_service(3, &nym_address2, &announcer1, s3.identity_key()), - new_service(4, &nym_address1, &announcer2, s4.identity_key()), - new_service(5, &nym_address2, &announcer2, s5.identity_key()), - ], - per_page: SERVICE_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(5), - } - ); - - // Even though multiple of them point to the same nym address, we only delete the ones we actually - // own. - setup.delete_nym_address(&nym_address1, &announcer1); - - assert_eq!(setup.contract_balance(), nyms(300)); - assert_eq!(setup.balance(&announcer1), nyms(900)); - assert_eq!( - setup.query_all(), - PagedServicesListResponse { - services: vec![ - new_service(3, &nym_address2, &announcer1, s3.identity_key()), - new_service(4, &nym_address1, &announcer2, s4.identity_key()), - new_service(5, &nym_address2, &announcer2, s5.identity_key()), - ], - per_page: SERVICE_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after: Some(5), - } - ); -} diff --git a/contracts/service-provider-directory/src/integration_tests/mod.rs b/contracts/service-provider-directory/src/integration_tests/mod.rs deleted file mode 100644 index d802029012..0000000000 --- a/contracts/service-provider-directory/src/integration_tests/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Integration tests using cw-multi-test. - -mod announce; -mod delete; -mod query; -mod service_id; -mod test_service; -mod test_setup; - -#[test] -fn instantiate_contract() { - test_setup::TestSetup::new(); -} diff --git a/contracts/service-provider-directory/src/integration_tests/query.rs b/contracts/service-provider-directory/src/integration_tests/query.rs deleted file mode 100644 index c903f2394e..0000000000 --- a/contracts/service-provider-directory/src/integration_tests/query.rs +++ /dev/null @@ -1,77 +0,0 @@ -use cosmwasm_std::Addr; -use nym_service_provider_directory_common::{ - response::{ConfigResponse, PagedServicesListResponse}, - NymAddress, -}; - -use crate::test_helpers::{fixture::new_service, helpers::nyms}; - -use super::test_setup::TestSetup; - -#[test] -fn query_config() { - assert_eq!( - TestSetup::new().query_config(), - ConfigResponse { - deposit_required: nyms(100), - } - ); -} - -// add multiple services, then query all but with a paging limit less than the number of services -// added -#[test] -fn paging_works() { - let mut setup = TestSetup::new(); - let announcer1 = Addr::unchecked("wealthy_announcer_1"); - let announcer2 = Addr::unchecked("wealthy_announcer_2"); - let nym_address1 = NymAddress::new("nymAddress1"); - let nym_address2 = NymAddress::new("nymAddress2"); - let deposit = nyms(100); - - // We announce the same address three times, but with different announcers - let s1 = setup.sign_and_announce_net_req(&nym_address1, &announcer1, &deposit); - let s2 = setup.sign_and_announce_net_req(&nym_address1, &announcer1, &deposit); - let s3 = setup.sign_and_announce_net_req(&nym_address2, &announcer1, &deposit); - let s4 = setup.sign_and_announce_net_req(&nym_address1, &announcer2, &deposit); - let s5 = setup.sign_and_announce_net_req(&nym_address2, &announcer2, &deposit); - - assert_eq!( - setup.query_all_with_limit(Some(10), None), - PagedServicesListResponse { - services: vec![ - new_service(1, &nym_address1, &announcer1, s1.identity_key()), - new_service(2, &nym_address1, &announcer1, s2.identity_key()), - new_service(3, &nym_address2, &announcer1, s3.identity_key()), - new_service(4, &nym_address1, &announcer2, s4.identity_key()), - new_service(5, &nym_address2, &announcer2, s5.identity_key()), - ], - per_page: 10, - start_next_after: Some(5), - } - ); - - assert_eq!( - setup.query_all_with_limit(Some(3), None), - PagedServicesListResponse { - services: vec![ - new_service(1, &nym_address1, &announcer1, s1.identity_key()), - new_service(2, &nym_address1, &announcer1, s2.identity_key()), - new_service(3, &nym_address2, &announcer1, s3.identity_key()), - ], - per_page: 3, - start_next_after: Some(3), - } - ); - assert_eq!( - setup.query_all_with_limit(Some(3), Some(3)), - PagedServicesListResponse { - services: vec![ - new_service(4, &nym_address1, &announcer2, s4.identity_key()), - new_service(5, &nym_address2, &announcer2, s5.identity_key()), - ], - per_page: 3, - start_next_after: Some(5), - } - ); -} diff --git a/contracts/service-provider-directory/src/integration_tests/service_id.rs b/contracts/service-provider-directory/src/integration_tests/service_id.rs deleted file mode 100644 index 7c5a4324c9..0000000000 --- a/contracts/service-provider-directory/src/integration_tests/service_id.rs +++ /dev/null @@ -1,89 +0,0 @@ -use cosmwasm_std::Addr; -use nym_service_provider_directory_common::NymAddress; - -use crate::test_helpers::{fixture::new_service, helpers::nyms}; - -use super::test_setup::TestSetup; - -#[test] -fn service_id_increases_for_new_services() { - let mut setup = TestSetup::new(); - setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress1"), - &Addr::unchecked("announcer1"), - &nyms(100), - ); - setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress2"), - &Addr::unchecked("announcer2"), - &nyms(100), - ); - - assert_eq!( - setup - .query_all() - .services - .iter() - .map(|s| s.service_id) - .collect::>(), - vec![1, 2], - ); -} - -#[test] -fn service_id_is_not_resused_when_deleting_and_then_adding_a_new_service() { - let mut setup = TestSetup::new(); - setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress1"), - &Addr::unchecked("announcer1"), - &nyms(100), - ); - let s2 = setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress2"), - &Addr::unchecked("announcer2"), - &nyms(100), - ); - setup.sign_and_announce_net_req( - &NymAddress::new("nymAddress3"), - &Addr::unchecked("announcer3"), - &nyms(100), - ); - - setup.delete(1, &Addr::unchecked("announcer1")); - setup.delete(3, &Addr::unchecked("announcer3")); - - assert_eq!( - setup.query_all().services, - vec![new_service( - 2, - &NymAddress::new("nymAddress2"), - &Addr::unchecked("announcer2"), - s2.identity_key(), - )] - ); - - let s4 = setup.new_signed_service( - &NymAddress::new("nymAddress4"), - &Addr::unchecked("announcer4"), - &nyms(100), - ); - setup.announce_net_req(&s4, &Addr::unchecked("announcer4")); - - assert_eq!( - setup.query_all().services, - vec![ - new_service( - 2, - &NymAddress::new("nymAddress2"), - &Addr::unchecked("announcer2"), - s2.identity_key(), - ), - new_service( - 4, - &NymAddress::new("nymAddress4"), - &Addr::unchecked("announcer4"), - s4.identity_key(), - ) - ] - ); -} diff --git a/contracts/service-provider-directory/src/integration_tests/test_service.rs b/contracts/service-provider-directory/src/integration_tests/test_service.rs deleted file mode 100644 index 6d54648713..0000000000 --- a/contracts/service-provider-directory/src/integration_tests/test_service.rs +++ /dev/null @@ -1,70 +0,0 @@ -use nym_contracts_common::{signing::MessageSignature, IdentityKey}; -use nym_crypto::asymmetric::identity; -use nym_service_provider_directory_common::{ - signing_types::SignableServiceProviderAnnounceMsg, NymAddress, ServiceDetails, ServiceType, -}; -use rand_chacha::ChaCha20Rng; - -use crate::test_helpers::signing::ed25519_sign_message; - -pub struct TestService { - pub service: ServiceDetails, - pub keys: identity::KeyPair, -} - -impl TestService { - pub fn new(rng: &mut ChaCha20Rng, nym_address: NymAddress) -> Self { - let keys = identity::KeyPair::new(rng); - let service = ServiceDetails { - nym_address, - service_type: ServiceType::NetworkRequester, - identity_key: keys.public_key().to_base58_string(), - }; - Self { service, keys } - } - - pub fn identity_key(&self) -> &IdentityKey { - &self.service.identity_key - } - - pub fn details(&self) -> &ServiceDetails { - &self.service - } - - pub fn sign(self, payload: SignableServiceProviderAnnounceMsg) -> SignedTestService { - let owner_signature = ed25519_sign_message(payload, self.keys.private_key()); - SignedTestService { - service: self.service, - keys: self.keys, - owner_signature, - } - } -} - -impl From for ServiceDetails { - fn from(test_service: TestService) -> Self { - test_service.service - } -} - -pub struct SignedTestService { - pub service: ServiceDetails, - pub keys: identity::KeyPair, - pub owner_signature: MessageSignature, -} - -impl SignedTestService { - pub fn identity_key(&self) -> &IdentityKey { - &self.service.identity_key - } - - pub fn details(&self) -> &ServiceDetails { - &self.service - } -} - -impl From for ServiceDetails { - fn from(signed_service: SignedTestService) -> Self { - signed_service.service - } -} diff --git a/contracts/service-provider-directory/src/integration_tests/test_setup.rs b/contracts/service-provider-directory/src/integration_tests/test_setup.rs deleted file mode 100644 index 3438691b8e..0000000000 --- a/contracts/service-provider-directory/src/integration_tests/test_setup.rs +++ /dev/null @@ -1,233 +0,0 @@ -use anyhow::Result; -use cosmwasm_std::{coins, Addr, Coin, Uint128}; -use cw_multi_test::{App, AppBuilder, AppResponse, ContractWrapper, Executor}; -use nym_contracts_common::signing::Nonce; -use nym_service_provider_directory_common::{ - msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, - response::{ConfigResponse, PagedServicesListResponse}, - signing_types::{ - construct_service_provider_announce_sign_payload, SignableServiceProviderAnnounceMsg, - }, - NymAddress, Service, ServiceDetails, ServiceId, -}; -use rand_chacha::ChaCha20Rng; -use serde::de::DeserializeOwned; - -use crate::test_helpers::helpers::{get_app_attribute, test_rng}; - -use super::test_service::{SignedTestService, TestService}; - -const DENOM: &str = "unym"; -const ADDRESSES: &[&str] = &[ - "user", - "admin", - "announcer", - "announcer1", - "announcer2", - "announcer3", - "announcer4", - "steve", - "timmy", -]; -const WEALTHY_ADDRESSES: &[&str] = &["wealthy_announcer_1", "wealthy_announcer_2"]; - -/// Helper for being able to systematic integration tests -pub struct TestSetup { - app: App, - addr: Addr, - rng: ChaCha20Rng, -} - -impl Default for TestSetup { - fn default() -> Self { - TestSetup::new() - } -} - -impl TestSetup { - pub fn new() -> Self { - let mut app = AppBuilder::new().build(|router, _, storage| { - let mut init_balance = |account: &str, amount: u128| { - router - .bank - .init_balance(storage, &Addr::unchecked(account), coins(amount, DENOM)) - .unwrap(); - }; - ADDRESSES.iter().for_each(|addr| init_balance(addr, 250)); - WEALTHY_ADDRESSES - .iter() - .for_each(|addr| init_balance(addr, 1000)); - }); - let code = ContractWrapper::new(crate::execute, crate::instantiate, crate::query); - let code_id = app.store_code(Box::new(code)); - let addr = Self::instantiate(&mut app, code_id); - let rng = test_rng(); - TestSetup { app, addr, rng } - } - - fn instantiate(app: &mut App, code_id: u64) -> Addr { - app.instantiate_contract( - code_id, - Addr::unchecked("admin"), - &InstantiateMsg { - deposit_required: Coin::new(100, DENOM), - }, - &[], - "contract_label", - None, - ) - .unwrap() - } - - pub fn contract_balance(&self) -> Coin { - self.app.wrap().query_balance(&self.addr, DENOM).unwrap() - } - - pub fn query(&self, query_msg: &QueryMsg) -> T { - self.app - .wrap() - .query_wasm_smart(&self.addr, query_msg) - .unwrap() - } - - pub fn query_config(&self) -> ConfigResponse { - self.query(&QueryMsg::Config {}) - } - - pub fn query_id(&self, service_id: ServiceId) -> Service { - self.query(&QueryMsg::ServiceId { service_id }) - } - - pub fn query_all(&self) -> PagedServicesListResponse { - self.query(&QueryMsg::all()) - } - - pub fn query_all_with_limit( - &self, - limit: Option, - start_after: Option, - ) -> PagedServicesListResponse { - self.query(&QueryMsg::All { limit, start_after }) - } - - pub fn query_signing_nonce(&self, address: String) -> Nonce { - self.query(&QueryMsg::SigningNonce { address }) - } - - // Create a new service, together with its signing keypair - pub fn new_service(&mut self, nym_address: &NymAddress) -> TestService { - TestService::new(&mut self.rng, nym_address.clone()) - } - - // Create payload for the service operator to sign - pub fn payload_to_sign( - &mut self, - announcer: &Addr, - deposit: &Coin, - service: &ServiceDetails, - ) -> SignableServiceProviderAnnounceMsg { - let nonce = self.query_signing_nonce(announcer.to_string()); - construct_service_provider_announce_sign_payload( - nonce, - announcer.clone(), - deposit.clone(), - service.clone(), - ) - } - - // Convenience function for creating a new service and signing it. - pub fn new_signed_service( - &mut self, - nym_address: &NymAddress, - announcer: &Addr, - deposit: &Coin, - ) -> SignedTestService { - let service = self.new_service(nym_address); - let payload = self.payload_to_sign(announcer, deposit, service.details()); - service.sign(payload) - } - - // Announce a new service - pub fn try_announce_net_req( - &mut self, - service: &SignedTestService, - announcer: &Addr, - ) -> Result { - self.app.execute_contract( - announcer.clone(), - self.addr.clone(), - &ExecuteMsg::Announce { - service: service.service.clone(), - owner_signature: service.owner_signature.clone(), - }, - &[Coin { - denom: DENOM.to_string(), - amount: Uint128::new(100), - }], - ) - } - - pub fn announce_net_req( - &mut self, - service: &SignedTestService, - announcer: &Addr, - ) -> AppResponse { - let resp = self.try_announce_net_req(service, announcer).unwrap(); - assert_eq!( - get_app_attribute(&resp, "wasm-announce", "action"), - "announce" - ); - resp - } - - // Convenience function for create a new signed service and announcing it - pub fn sign_and_announce_net_req( - &mut self, - nym_address: &NymAddress, - announcer: &Addr, - deposit: &Coin, - ) -> SignedTestService { - let service = self.new_signed_service(nym_address, announcer, deposit); - let _ = self.announce_net_req(&service, announcer); - service - } - - pub fn try_delete(&mut self, service_id: ServiceId, announcer: &Addr) -> Result { - self.app.execute_contract( - announcer.clone(), - self.addr.clone(), - &ExecuteMsg::DeleteId { service_id }, - &[], - ) - } - - pub fn delete(&mut self, service_id: ServiceId, announcer: &Addr) -> AppResponse { - let delete_resp = self.try_delete(service_id, announcer).unwrap(); - assert_eq!( - get_app_attribute(&delete_resp, "wasm-delete_id", "action"), - "delete_id" - ); - delete_resp - } - - pub fn delete_nym_address( - &mut self, - nym_address: &NymAddress, - announcer: &Addr, - ) -> AppResponse { - self.app - .execute_contract( - announcer.clone(), - self.addr.clone(), - &ExecuteMsg::DeleteNymAddress { - nym_address: nym_address.clone(), - }, - &[], - ) - .unwrap() - } - - pub fn balance(&self, address: impl Into) -> Coin { - self.app.wrap().query_balance(address, DENOM).unwrap() - } -} diff --git a/contracts/service-provider-directory/src/lib.rs b/contracts/service-provider-directory/src/lib.rs deleted file mode 100644 index 58ba4f9aa8..0000000000 --- a/contracts/service-provider-directory/src/lib.rs +++ /dev/null @@ -1,58 +0,0 @@ -//! The service provider directory contract is for users to announce their service providers for -//! public use. - -#![warn(clippy::expect_used)] -#![warn(clippy::unwrap_used)] - -pub use nym_service_provider_directory_common::error::{Result, SpContractError}; - -use nym_service_provider_directory_common::msg::{ - ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, -}; - -#[cfg(not(feature = "library"))] -use cosmwasm_std::entry_point; -use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response}; - -mod constants; -mod contract; -mod state; - -#[cfg(test)] -mod integration_tests; -#[cfg(test)] -mod test_helpers; - -/// Contract entry point for instantiation. -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn instantiate( - deps: DepsMut<'_>, - env: Env, - info: MessageInfo, - msg: InstantiateMsg, -) -> Result { - contract::instantiate(deps, env, info, msg) -} - -/// Contract entry point for migrations. -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut<'_>, env: Env, msg: MigrateMsg) -> Result { - contract::migrate(deps, env, msg) -} - -/// Contract entry point for execution -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn execute( - deps: DepsMut<'_>, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, -) -> Result { - contract::execute(deps, env, info, msg) -} - -/// Contract entry point for queries -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result { - contract::query(deps, env, msg) -} diff --git a/contracts/service-provider-directory/src/state/admin.rs b/contracts/service-provider-directory/src/state/admin.rs deleted file mode 100644 index 026e353626..0000000000 --- a/contracts/service-provider-directory/src/state/admin.rs +++ /dev/null @@ -1,14 +0,0 @@ -use cosmwasm_std::{Addr, Deps, DepsMut}; -use cw_controllers::Admin; - -use crate::{constants::ADMIN_KEY, Result}; - -const ADMIN: Admin = Admin::new(ADMIN_KEY); - -pub(crate) fn set_admin(deps: DepsMut<'_>, admin: Addr) -> Result<()> { - Ok(ADMIN.set(deps, Some(admin))?) -} - -pub(crate) fn assert_admin(deps: Deps, sender: &Addr) -> Result<()> { - Ok(ADMIN.assert_admin(deps, sender)?) -} diff --git a/contracts/service-provider-directory/src/state/config.rs b/contracts/service-provider-directory/src/state/config.rs deleted file mode 100644 index 093edbffc2..0000000000 --- a/contracts/service-provider-directory/src/state/config.rs +++ /dev/null @@ -1,34 +0,0 @@ -use cosmwasm_std::{Coin, Storage}; -use cw_storage_plus::Item; -use nym_service_provider_directory_common::response::ConfigResponse; -use serde::{Deserialize, Serialize}; - -use crate::{constants::CONFIG_KEY, Result}; - -const CONFIG: Item = Item::new(CONFIG_KEY); - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub(crate) struct Config { - pub deposit_required: Coin, -} - -impl From for ConfigResponse { - fn from(config: Config) -> Self { - ConfigResponse { - deposit_required: config.deposit_required, - } - } -} - -pub(crate) fn save_config(store: &mut dyn Storage, config: &Config) -> Result<()> { - Ok(CONFIG.save(store, config)?) -} - -pub(crate) fn load_config(store: &dyn Storage) -> Result { - Ok(CONFIG.load(store)?) -} - -/// Return the deposit required to announce a service. -pub(crate) fn deposit_required(store: &dyn Storage) -> Result { - Ok(CONFIG.load(store).map(|config| config.deposit_required)?) -} diff --git a/contracts/service-provider-directory/src/state/mod.rs b/contracts/service-provider-directory/src/state/mod.rs deleted file mode 100644 index a36fbb1248..0000000000 --- a/contracts/service-provider-directory/src/state/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -mod admin; -mod config; -mod nonce; -mod service_id_counter; -mod services; - -pub(crate) use admin::{assert_admin, set_admin}; -pub(crate) use config::{deposit_required, load_config, save_config, Config}; -pub(crate) use nonce::{get_signing_nonce, increment_signing_nonce}; -pub(crate) use service_id_counter::next_service_id_counter; -pub(crate) use services::{ - has_service, load_all_paged, load_announcer, load_id, load_nym_address, remove, save, PagedLoad, -}; diff --git a/contracts/service-provider-directory/src/state/nonce.rs b/contracts/service-provider-directory/src/state/nonce.rs deleted file mode 100644 index bf865af82a..0000000000 --- a/contracts/service-provider-directory/src/state/nonce.rs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::{constants::SIGNING_NONCES_NAMESPACE, Result}; - -use cosmwasm_std::{Addr, Storage}; -use cw_storage_plus::Map; -use nym_contracts_common::signing::Nonce; - -pub const NONCES: Map<'_, Addr, Nonce> = Map::new(SIGNING_NONCES_NAMESPACE); - -pub fn get_signing_nonce(storage: &dyn Storage, address: Addr) -> Result { - let nonce = NONCES.may_load(storage, address)?.unwrap_or(0); - Ok(nonce) -} - -fn update_signing_nonce(storage: &mut dyn Storage, address: Addr, value: Nonce) -> Result<()> { - NONCES - .save(storage, address, &value) - .map_err(|err| err.into()) -} - -pub fn increment_signing_nonce(storage: &mut dyn Storage, address: Addr) -> Result<()> { - // get the current nonce - let nonce = get_signing_nonce(storage, address.clone())?; - - // increment it for the next use - update_signing_nonce(storage, address, nonce + 1) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test_helpers::transactions::instantiate_test_contract; - use cosmwasm_std::{ - testing::{MockApi, MockQuerier}, - MemoryStorage, OwnedDeps, - }; - use rstest::rstest; - - type TestDeps = OwnedDeps; - - #[rstest::fixture] - fn deps() -> TestDeps { - instantiate_test_contract() - } - - fn addr(s: &str) -> Addr { - Addr::unchecked(s) - } - - #[rstest] - fn getting_signing_nonce_doesnt_increment_it(deps: TestDeps) { - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 0); - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 0); - } - - #[rstest] - fn increment_works(mut deps: TestDeps) { - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 0); - increment_signing_nonce(&mut deps.storage, addr("gunnar")).unwrap(); - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 1); - } - - #[rstest] - fn incrementing_is_independent(mut deps: TestDeps) { - increment_signing_nonce(&mut deps.storage, addr("gunnar")).unwrap(); - assert_eq!(get_signing_nonce(&deps.storage, addr("gunnar")).unwrap(), 1); - assert_eq!(get_signing_nonce(&deps.storage, addr("bjorn")).unwrap(), 0); - } -} diff --git a/contracts/service-provider-directory/src/state/service_id_counter.rs b/contracts/service-provider-directory/src/state/service_id_counter.rs deleted file mode 100644 index 3a1ae1f2eb..0000000000 --- a/contracts/service-provider-directory/src/state/service_id_counter.rs +++ /dev/null @@ -1,95 +0,0 @@ -use cosmwasm_std::Storage; -use cw_storage_plus::Item; -use nym_service_provider_directory_common::ServiceId; - -use crate::{constants::SERVICE_ID_COUNTER_KEY, Result}; - -const SERVICE_ID_COUNTER: Item = Item::new(SERVICE_ID_COUNTER_KEY); - -/// Generate the next service provider id, store it and return it -pub(crate) fn next_service_id_counter(store: &mut dyn Storage) -> Result { - // The first id is 1. - let id = SERVICE_ID_COUNTER.may_load(store)?.unwrap_or_default() + 1; - SERVICE_ID_COUNTER.save(store, &id)?; - Ok(id) -} - -#[cfg(test)] -mod tests { - - use cosmwasm_std::Addr; - use nym_service_provider_directory_common::Service; - - use crate::test_helpers::{ - assert::assert_services, - helpers::{nyms, test_rng}, - transactions::{announce_service, delete_service, instantiate_test_contract}, - }; - - #[test] - fn get_next_service_id() { - let mut deps = instantiate_test_contract(); - let mut rng = test_rng(); - - let (id1, service1) = announce_service(deps.as_mut(), &mut rng, "addr1", "timmy"); - let (id2, service2) = announce_service(deps.as_mut(), &mut rng, "addr2", "timmy"); - let (id3, service3) = announce_service(deps.as_mut(), &mut rng, "addr3", "timmy"); - assert_eq!(id1, 1); - assert_eq!(id2, 2); - assert_eq!(id3, 3); - assert_services( - deps.as_ref(), - &[ - Service { - service_id: 1, - service: service1, - announcer: Addr::unchecked("timmy"), - block_height: 12345, - deposit: nyms(100), - }, - Service { - service_id: 2, - service: service2, - announcer: Addr::unchecked("timmy"), - block_height: 12345, - deposit: nyms(100), - }, - Service { - service_id: 3, - service: service3, - announcer: Addr::unchecked("timmy"), - block_height: 12345, - deposit: nyms(100), - }, - ], - ); - } - - #[test] - fn deleted_service_id_is_not_reused() { - let mut deps = instantiate_test_contract(); - let mut rng = test_rng(); - - // Announce - let (_, service1) = announce_service(deps.as_mut(), &mut rng, "addr1", "timmy"); - let _ = announce_service(deps.as_mut(), &mut rng, "addr2", "timmy"); - - //// Delete the last entry - delete_service(deps.as_mut(), 2, "timmy"); - assert_services( - deps.as_ref(), - &[Service { - service_id: 1, - service: service1, - announcer: Addr::unchecked("timmy"), - block_height: 12345, - deposit: nyms(100), - }], - ); - - // Create a third entry. The index should not reuse the previous entry that we just - // deleted. - let (id3, _) = announce_service(deps.as_mut(), &mut rng, "addr3", "timmy"); - assert_eq!(id3, 3); - } -} diff --git a/contracts/service-provider-directory/src/state/services.rs b/contracts/service-provider-directory/src/state/services.rs deleted file mode 100644 index f7c4697b45..0000000000 --- a/contracts/service-provider-directory/src/state/services.rs +++ /dev/null @@ -1,294 +0,0 @@ -use cosmwasm_std::{Addr, Order, StdError, StdResult, Storage}; -use cw_storage_plus::{Bound, Index, IndexList, IndexedMap, MultiIndex}; -use nym_service_provider_directory_common::{NymAddress, Service, ServiceId}; - -use crate::{ - constants::{ - MAX_NUMBER_OF_ALIASES_FOR_NYM_ADDRESS, MAX_NUMBER_OF_PROVIDERS_PER_ANNOUNCER, - SERVICES_ANNOUNCER_IDX_NAMESPACE, SERVICES_NYM_ADDRESS_IDX_NAMESPACE, - SERVICES_PK_NAMESPACE, SERVICE_DEFAULT_RETRIEVAL_LIMIT, SERVICE_MAX_RETRIEVAL_LIMIT, - }, - Result, SpContractError, -}; - -struct ServiceIndex<'a> { - pub(crate) nym_address: MultiIndex<'a, String, Service, ServiceId>, - pub(crate) announcer: MultiIndex<'a, Addr, Service, ServiceId>, -} - -impl<'a> IndexList for ServiceIndex<'a> { - fn get_indexes(&'_ self) -> Box> + '_> { - let v: Vec<&dyn Index> = vec![&self.nym_address, &self.announcer]; - Box::new(v.into_iter()) - } -} - -fn services<'a>() -> IndexedMap<'a, ServiceId, Service, ServiceIndex<'a>> { - let indexes = ServiceIndex { - nym_address: MultiIndex::new( - |_pk, d| d.service.nym_address.to_string(), - SERVICES_PK_NAMESPACE, - SERVICES_NYM_ADDRESS_IDX_NAMESPACE, - ), - announcer: MultiIndex::new( - |_pk, d| d.announcer.clone(), - SERVICES_PK_NAMESPACE, - SERVICES_ANNOUNCER_IDX_NAMESPACE, - ), - }; - IndexedMap::new(SERVICES_PK_NAMESPACE, indexes) -} - -pub fn save(store: &mut dyn Storage, new_service: &Service) -> Result<()> { - let service_id = new_service.service_id; - services().save(store, service_id, new_service)?; - Ok(()) -} - -pub fn remove(store: &mut dyn Storage, service_id: ServiceId) -> Result<()> { - Ok(services().remove(store, service_id)?) -} - -pub fn has_service(store: &dyn Storage, service_id: ServiceId) -> bool { - services().has(store, service_id) -} - -pub fn load_id(store: &dyn Storage, service_id: ServiceId) -> Result { - services().load(store, service_id).map_err(|err| match err { - StdError::NotFound { .. } => SpContractError::NotFound { service_id }, - err => err.into(), - }) -} - -pub fn load_announcer(store: &dyn Storage, announcer: Addr) -> Result> { - let services = services() - .idx - .announcer - .prefix(announcer) - .range(store, None, None, Order::Ascending) - .take(MAX_NUMBER_OF_PROVIDERS_PER_ANNOUNCER as usize) - .map(|res| res.map(|item| item.1)) - .collect::>>()?; - Ok(services) -} - -pub fn load_nym_address(store: &dyn Storage, nym_address: NymAddress) -> Result> { - let services = services() - .idx - .nym_address - .prefix(nym_address.to_string()) - .range(store, None, None, Order::Ascending) - .take(MAX_NUMBER_OF_ALIASES_FOR_NYM_ADDRESS as usize) - .map(|res| res.map(|item| item.1)) - .collect::>>()?; - Ok(services) -} - -#[derive(Debug, PartialEq)] -pub struct PagedLoad { - pub services: Vec, - pub limit: usize, - - /// Field indicating paging information for the following queries if the caller wishes to get further entries. - pub start_next_after: Option, -} - -pub fn load_all_paged( - store: &dyn Storage, - limit: Option, - start_after: Option, -) -> Result { - let limit = limit - .unwrap_or(SERVICE_DEFAULT_RETRIEVAL_LIMIT) - .min(SERVICE_MAX_RETRIEVAL_LIMIT) as usize; - - let start = start_after.map(Bound::exclusive); - - let services = services() - .range(store, start, None, Order::Ascending) - .take(limit) - .map(|res| res.map(|item| item.1)) - .collect::>>()?; - - let start_next_after = services.last().map(|service| service.service_id); - - Ok(PagedLoad { - services, - limit, - start_next_after, - }) -} - -#[cfg(test)] -mod tests { - use cosmwasm_std::{ - testing::{MockApi, MockQuerier}, - MemoryStorage, OwnedDeps, - }; - use rstest::rstest; - - use crate::test_helpers::{ - fixture::{service_fixture, service_fixture_with_address}, - transactions::instantiate_test_contract, - }; - - use super::*; - - type TestDeps = OwnedDeps; - - #[rstest::fixture] - fn deps() -> TestDeps { - instantiate_test_contract() - } - - #[rstest] - fn save_works(mut deps: TestDeps) { - assert!(!has_service(&deps.storage, 1)); - save(deps.as_mut().storage, &service_fixture(1)).unwrap(); - assert!(has_service(&deps.storage, 1)); - } - - #[rstest] - fn save_and_check_incorrect_id_fails(mut deps: TestDeps) { - assert!(!has_service(&deps.storage, 2)); - save(deps.as_mut().storage, &service_fixture(1)).unwrap(); - assert!(!has_service(&deps.storage, 2)); - } - - #[rstest] - fn remove_works(mut deps: TestDeps) { - let id = 1; - save(deps.as_mut().storage, &service_fixture(id)).unwrap(); - assert!(has_service(&deps.storage, id)); - remove(deps.as_mut().storage, id).unwrap(); - assert!(!has_service(&deps.storage, id)); - } - - #[rstest] - fn load_by_id_works(mut deps: TestDeps) { - let id = 1; - save(deps.as_mut().storage, &service_fixture(id)).unwrap(); - let service = load_id(deps.as_ref().storage, id).unwrap(); - assert_eq!(service, service_fixture(id)); - } - - #[rstest] - fn load_by_wrong_id_returns_not_found(mut deps: TestDeps) { - let id = 1; - save(deps.as_mut().storage, &service_fixture(id)).unwrap(); - assert_eq!( - load_id(deps.as_ref().storage, id + 1).unwrap_err(), - SpContractError::NotFound { service_id: id + 1 } - ); - } - - #[rstest] - fn load_by_announcer_works(mut deps: TestDeps) { - save(deps.as_mut().storage, &service_fixture_with_address(1, "a")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(2, "b")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(3, "c")).unwrap(); - assert_eq!( - load_announcer(&deps.storage, Addr::unchecked("steve")).unwrap(), - vec![ - service_fixture_with_address(1, "a"), - service_fixture_with_address(2, "b"), - service_fixture_with_address(3, "c"), - ] - ); - } - - #[rstest] - fn load_by_wrong_announcer_returns_empty(mut deps: TestDeps) { - save(deps.as_mut().storage, &service_fixture_with_address(1, "a")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(2, "b")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(3, "c")).unwrap(); - assert_eq!( - load_announcer(&deps.storage, Addr::unchecked("timmy")).unwrap(), - vec![] - ); - } - - #[rstest] - fn load_by_nym_address_works(mut deps: TestDeps) { - save(deps.as_mut().storage, &service_fixture_with_address(1, "a")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(2, "b")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(3, "c")).unwrap(); - assert_eq!( - load_nym_address(&deps.storage, NymAddress::new("b")).unwrap(), - vec![service_fixture_with_address(2, "b")] - ); - } - - #[rstest] - fn load_by_wrong_nym_address_returns_empty(mut deps: TestDeps) { - save(deps.as_mut().storage, &service_fixture_with_address(1, "a")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(2, "b")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(3, "c")).unwrap(); - assert_eq!( - load_nym_address(&deps.storage, NymAddress::new("d")).unwrap(), - vec![] - ); - } - - #[rstest] - fn load_all_paged_with_no_limit_works(mut deps: TestDeps) { - save(deps.as_mut().storage, &service_fixture_with_address(1, "a")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(2, "b")).unwrap(); - assert_eq!( - load_all_paged(&deps.storage, None, None).unwrap(), - PagedLoad { - services: vec![ - service_fixture_with_address(1, "a"), - service_fixture_with_address(2, "b") - ], - start_next_after: Some(2), - limit: 100, - } - ); - } - - #[rstest] - fn load_all_paged_with_limit_works(mut deps: TestDeps) { - save(deps.as_mut().storage, &service_fixture_with_address(1, "a")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(2, "b")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(3, "c")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(4, "d")).unwrap(); - save(deps.as_mut().storage, &service_fixture_with_address(5, "e")).unwrap(); - assert_eq!( - load_all_paged(&deps.storage, Some(2), None).unwrap(), - PagedLoad { - services: vec![ - service_fixture_with_address(1, "a"), - service_fixture_with_address(2, "b") - ], - limit: 2, - start_next_after: Some(2), - } - ); - assert_eq!( - load_all_paged(&deps.storage, Some(2), Some(2)).unwrap(), - PagedLoad { - services: vec![ - service_fixture_with_address(3, "c"), - service_fixture_with_address(4, "d") - ], - limit: 2, - start_next_after: Some(4), - } - ); - assert_eq!( - load_all_paged(&deps.storage, Some(2), Some(4)).unwrap(), - PagedLoad { - services: vec![service_fixture_with_address(5, "e")], - start_next_after: Some(5), - limit: 2, - } - ); - } - - #[test] - #[ignore] - fn max_page_limit_is_applied() { - todo!(); - } -} diff --git a/contracts/service-provider-directory/src/test_helpers/assert.rs b/contracts/service-provider-directory/src/test_helpers/assert.rs deleted file mode 100644 index 392babc34d..0000000000 --- a/contracts/service-provider-directory/src/test_helpers/assert.rs +++ /dev/null @@ -1,79 +0,0 @@ -use cosmwasm_std::{from_binary, testing::mock_env, Addr, Coin, Deps}; -use nym_contracts_common::signing::Nonce; -use nym_service_provider_directory_common::{ - msg::QueryMsg, - response::{ConfigResponse, PagedServicesListResponse}, - Service, ServiceId, -}; - -use crate::{constants::SERVICE_DEFAULT_RETRIEVAL_LIMIT, SpContractError}; - -pub fn assert_config(deps: Deps, admin: &Addr, deposit_required: Coin) { - crate::state::assert_admin(deps, admin).unwrap(); - let res = crate::contract::query(deps, mock_env(), QueryMsg::Config {}).unwrap(); - let config: ConfigResponse = from_binary(&res).unwrap(); - assert_eq!(config, ConfigResponse { deposit_required }); -} - -pub fn assert_services(deps: Deps, expected_services: &[Service]) { - let res = crate::contract::query(deps, mock_env(), QueryMsg::all()).unwrap(); - let services: PagedServicesListResponse = from_binary(&res).unwrap(); - let start_next_after = expected_services.iter().last().map(|s| s.service_id); - assert_eq!( - services, - PagedServicesListResponse { - services: expected_services.to_vec(), - per_page: SERVICE_DEFAULT_RETRIEVAL_LIMIT as usize, - start_next_after, - } - ); -} - -pub fn assert_service(deps: Deps, expected_service: &Service) { - let res = crate::contract::query( - deps, - mock_env(), - QueryMsg::ServiceId { - service_id: expected_service.service_id, - }, - ) - .unwrap(); - let services: Service = from_binary(&res).unwrap(); - assert_eq!(&services, expected_service); -} - -pub fn assert_empty(deps: Deps) { - let res = crate::contract::query(deps, mock_env(), QueryMsg::all()).unwrap(); - let services: PagedServicesListResponse = from_binary(&res).unwrap(); - assert!(services.services.is_empty()); -} - -pub fn assert_not_found(deps: Deps, expected_id: ServiceId) { - let res = crate::contract::query( - deps, - mock_env(), - QueryMsg::ServiceId { - service_id: expected_id, - }, - ) - .unwrap_err(); - assert!(matches!( - res, - SpContractError::NotFound { - service_id: _expected_id - } - )); -} - -pub fn assert_current_nonce(deps: Deps, address: &Addr, expected_nonce: Nonce) { - let res = crate::contract::query( - deps, - mock_env(), - QueryMsg::SigningNonce { - address: address.to_string(), - }, - ) - .unwrap(); - let nonce: Nonce = from_binary(&res).unwrap(); - assert_eq!(nonce, expected_nonce); -} diff --git a/contracts/service-provider-directory/src/test_helpers/fixture.rs b/contracts/service-provider-directory/src/test_helpers/fixture.rs deleted file mode 100644 index 0da1ae861c..0000000000 --- a/contracts/service-provider-directory/src/test_helpers/fixture.rs +++ /dev/null @@ -1,87 +0,0 @@ -use cosmwasm_std::{Addr, Coin, DepsMut}; -use nym_contracts_common::{signing::MessageSignature, IdentityKeyRef}; -use nym_crypto::asymmetric::identity; -use nym_service_provider_directory_common::{ - NymAddress, Service, ServiceDetails, ServiceId, ServiceType, -}; -use rand_chacha::rand_core::{CryptoRng, RngCore}; - -use super::{ - helpers::nyms, - signing::{ed25519_sign_message, service_provider_announce_sign_payload}, -}; - -pub fn new_service( - service_id: ServiceId, - nym_address: &NymAddress, - announcer: &Addr, - identity_key: IdentityKeyRef, -) -> Service { - Service { - service_id, - service: ServiceDetails { - nym_address: nym_address.clone(), - service_type: ServiceType::NetworkRequester, - identity_key: identity_key.to_string(), - }, - announcer: announcer.clone(), - block_height: 12345, - deposit: nyms(100), - } -} - -pub fn service_fixture(service_id: ServiceId) -> Service { - new_service( - service_id, - &NymAddress::new("nym"), - &Addr::unchecked("steve"), - "identity", - ) -} - -pub fn service_fixture_with_address(service_id: ServiceId, nym_address: &str) -> Service { - new_service( - service_id, - &NymAddress::new(nym_address), - &Addr::unchecked("steve"), - "identity", - ) -} - -// Create a new service, using a correctly generted identity key -pub fn new_service_details(rng: &mut R, nym_address: &str) -> (ServiceDetails, identity::KeyPair) -where - R: RngCore + CryptoRng, -{ - let keypair = identity::KeyPair::new(rng); - ( - ServiceDetails { - nym_address: NymAddress::new(nym_address), - service_type: ServiceType::NetworkRequester, - identity_key: keypair.public_key().to_base58_string(), - }, - keypair, - ) -} - -// Create a new service, with a correctly generated identity key, and sign it -pub fn new_service_details_with_sign( - deps: DepsMut<'_>, - rng: &mut R, - nym_address: &str, - announcer: &str, - deposit: Coin, -) -> (ServiceDetails, MessageSignature) -where - R: RngCore + CryptoRng, -{ - // Service - let (service, keypair) = new_service_details(rng, nym_address); - - // Sign - let sign_msg = - service_provider_announce_sign_payload(deps.as_ref(), announcer, service.clone(), deposit); - let owner_signature = ed25519_sign_message(sign_msg, keypair.private_key()); - - (service, owner_signature) -} diff --git a/contracts/service-provider-directory/src/test_helpers/helpers.rs b/contracts/service-provider-directory/src/test_helpers/helpers.rs deleted file mode 100644 index 145802e061..0000000000 --- a/contracts/service-provider-directory/src/test_helpers/helpers.rs +++ /dev/null @@ -1,54 +0,0 @@ -use cosmwasm_std::{Coin, Event, Response}; -use cw_multi_test::AppResponse; -use rand_chacha::{rand_core::SeedableRng, ChaCha20Rng}; - -pub fn nyms(amount: u64) -> Coin { - Coin::new(amount.into(), "unym") -} - -pub fn test_rng() -> ChaCha20Rng { - let dummy_seed = [42u8; 32]; - ChaCha20Rng::from_seed(dummy_seed) -} - -pub fn get_event_types(response: &Response, event_type: &str) -> Vec { - response - .events - .iter() - .filter(|ev| ev.ty == event_type) - .cloned() - .collect() -} - -pub fn get_attribute(response: &Response, event_type: &str, key: &str) -> String { - get_event_types(response, event_type) - .first() - .unwrap() - .attributes - .iter() - .find(|attr| attr.key == key) - .unwrap() - .value - .clone() -} - -pub fn get_app_event_types(response: &AppResponse, event_type: &str) -> Vec { - response - .events - .iter() - .filter(|ev| ev.ty == event_type) - .cloned() - .collect() -} - -pub fn get_app_attribute(response: &AppResponse, event_type: &str, key: &str) -> String { - get_app_event_types(response, event_type) - .first() - .unwrap() - .attributes - .iter() - .find(|attr| attr.key == key) - .unwrap() - .value - .clone() -} diff --git a/contracts/service-provider-directory/src/test_helpers/mod.rs b/contracts/service-provider-directory/src/test_helpers/mod.rs deleted file mode 100644 index ee0717f4e4..0000000000 --- a/contracts/service-provider-directory/src/test_helpers/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod assert; -pub mod fixture; -pub mod helpers; -pub mod signing; -pub mod transactions; diff --git a/contracts/service-provider-directory/src/test_helpers/signing.rs b/contracts/service-provider-directory/src/test_helpers/signing.rs deleted file mode 100644 index 1d9aed1266..0000000000 --- a/contracts/service-provider-directory/src/test_helpers/signing.rs +++ /dev/null @@ -1,41 +0,0 @@ -use cosmwasm_std::{Addr, Coin, Deps}; -use nym_contracts_common::signing::{ - MessageSignature, SignableMessage, SigningAlgorithm, SigningPurpose, -}; -use nym_crypto::asymmetric::identity; -use nym_service_provider_directory_common::{ - signing_types::{ - construct_service_provider_announce_sign_payload, SignableServiceProviderAnnounceMsg, - }, - ServiceDetails, -}; -use serde::Serialize; - -use crate::state; - -pub fn service_provider_announce_sign_payload( - deps: Deps<'_>, - owner: &str, - service: ServiceDetails, - deposit: Coin, -) -> SignableServiceProviderAnnounceMsg { - let owner = Addr::unchecked(owner); - let nonce = state::get_signing_nonce(deps.storage, owner.clone()).unwrap(); - construct_service_provider_announce_sign_payload(nonce, owner, deposit, service) -} - -pub fn ed25519_sign_message( - message: SignableMessage, - private_key: &identity::PrivateKey, -) -> MessageSignature { - match message.algorithm { - SigningAlgorithm::Ed25519 => { - let plaintext = message.to_plaintext().unwrap(); - let signature = private_key.sign(plaintext); - MessageSignature::from(signature.to_bytes().as_ref()) - } - SigningAlgorithm::Secp256k1 => { - unimplemented!() - } - } -} diff --git a/contracts/service-provider-directory/src/test_helpers/transactions.rs b/contracts/service-provider-directory/src/test_helpers/transactions.rs deleted file mode 100644 index 9a28a0c93b..0000000000 --- a/contracts/service-provider-directory/src/test_helpers/transactions.rs +++ /dev/null @@ -1,69 +0,0 @@ -use cosmwasm_std::{ - coin, - testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier}, - DepsMut, MemoryStorage, OwnedDeps, -}; - -use nym_service_provider_directory_common::{ - events::{ServiceProviderEventType, SERVICE_ID}, - msg::{ExecuteMsg, InstantiateMsg}, - ServiceDetails, ServiceId, -}; -use rand_chacha::rand_core::{CryptoRng, RngCore}; - -use super::helpers::{get_attribute, nyms}; - -pub fn instantiate_test_contract() -> OwnedDeps { - let mut deps = mock_dependencies(); - let msg = InstantiateMsg { - deposit_required: coin(100, "unym"), - }; - let env = mock_env(); - let info = mock_info("creator", &[]); - let res = crate::instantiate(deps.as_mut(), env, info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - deps -} - -pub fn announce_service( - mut deps: DepsMut<'_>, - rng: &mut R, - nym_address: &str, - announcer: &str, -) -> (ServiceId, ServiceDetails) -where - R: RngCore + CryptoRng, -{ - let deposit = nyms(100); - let (service, owner_signature) = super::fixture::new_service_details_with_sign( - deps.branch(), - rng, - nym_address, - announcer, - deposit.clone(), - ); - - // Announce - let msg = ExecuteMsg::Announce { - service: service.clone(), - owner_signature, - }; - let info = mock_info(announcer, &[deposit]); - let res = crate::execute(deps, mock_env(), info, msg).unwrap(); - - let service_id: ServiceId = get_attribute( - &res, - &ServiceProviderEventType::Announce.to_string(), - SERVICE_ID, - ) - .parse() - .unwrap(); - - (service_id, service) -} - -pub fn delete_service(deps: DepsMut<'_>, service_id: ServiceId, announcer: &str) { - let msg = ExecuteMsg::DeleteId { service_id }; - let info = mock_info(announcer, &[]); - crate::execute(deps, mock_env(), info, msg).unwrap(); -} diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 049d518102..0e82727fe0 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -88,8 +88,6 @@ nym-mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet nym-vesting-contract-common = { path = "../common/cosmwasm-smart-contracts/vesting-contract" } nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common" } nym-multisig-contract-common = { path = "../common/cosmwasm-smart-contracts/multisig-contract" } -nym-service-provider-directory-common = { path = "../common/cosmwasm-smart-contracts/service-provider-directory" } -nym-name-service-common = { path = "../common/cosmwasm-smart-contracts/name-service" } nym-coconut = { path = "../common/nymcoconut", features = ["key-zeroize"] } nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } diff --git a/nym-api/src/nym_contract_cache/cache/data.rs b/nym-api/src/nym_contract_cache/cache/data.rs index 91852658ba..c04404f2df 100644 --- a/nym-api/src/nym_contract_cache/cache/data.rs +++ b/nym-api/src/nym_contract_cache/cache/data.rs @@ -7,8 +7,6 @@ use nym_mixnet_contract_common::{ families::FamilyHead, GatewayBond, IdentityKey, Interval, MixId, MixNodeDetails, RewardingParams, }; -use nym_name_service_common::RegisteredName; -use nym_service_provider_directory_common::Service; use nym_validator_client::nyxd::AccountId; use std::collections::{HashMap, HashSet}; @@ -27,9 +25,6 @@ pub(crate) struct ValidatorCacheData { pub(crate) mix_to_family: Cache>, - pub(crate) service_providers: Cache>, - pub(crate) registered_names: Cache>, - pub(crate) contracts_info: Cache, } @@ -45,8 +40,6 @@ impl ValidatorCacheData { current_interval: Cache::default(), current_reward_params: Cache::default(), mix_to_family: Cache::default(), - service_providers: Cache::default(), - registered_names: Cache::default(), contracts_info: Cache::default(), } } diff --git a/nym-api/src/nym_contract_cache/cache/mod.rs b/nym-api/src/nym_contract_cache/cache/mod.rs index cb366a38d3..811e44f347 100644 --- a/nym-api/src/nym_contract_cache/cache/mod.rs +++ b/nym-api/src/nym_contract_cache/cache/mod.rs @@ -9,8 +9,6 @@ use nym_mixnet_contract_common::{ families::FamilyHead, GatewayBond, IdentityKey, Interval, MixId, MixNodeBond, MixNodeDetails, RewardingParams, }; -use nym_name_service_common::RegisteredName; -use nym_service_provider_directory_common::Service; use rocket::fairing::AdHoc; use std::{ collections::HashSet, @@ -56,8 +54,6 @@ impl NymContractCache { rewarding_params: RewardingParams, current_interval: Interval, mix_to_family: Vec<(IdentityKey, FamilyHead)>, - services: Option>, - names: Option>, nym_contracts_info: CachedContractsInfo, ) { match time::timeout(Duration::from_millis(100), self.inner.write()).await { @@ -73,13 +69,6 @@ impl NymContractCache { .current_interval .unchecked_update(Some(current_interval)); cache.mix_to_family.unchecked_update(mix_to_family); - // Just return empty lists when these are not available - cache - .service_providers - .unchecked_update(services.unwrap_or_default()); - cache - .registered_names - .unchecked_update(names.unwrap_or_default()); cache.contracts_info.unchecked_update(nym_contracts_info) } Err(err) => { @@ -312,26 +301,6 @@ impl NymContractCache { self.mixnode_details(mix_id).await.1 } - pub(crate) async fn services(&self) -> Cache> { - match time::timeout(Duration::from_millis(100), self.inner.read()).await { - Ok(cache) => cache.service_providers.clone_cache(), - Err(err) => { - error!("{err}"); - Cache::new(Vec::new()) - } - } - } - - pub(crate) async fn names(&self) -> Cache> { - match time::timeout(Duration::from_millis(100), self.inner.read()).await { - Ok(cache) => cache.registered_names.clone_cache(), - Err(err) => { - error!("{err}"); - Cache::new(Vec::new()) - } - } - } - pub fn initialised(&self) -> bool { self.initialised.load(Ordering::Relaxed) } diff --git a/nym-api/src/nym_contract_cache/cache/refresher.rs b/nym-api/src/nym_contract_cache/cache/refresher.rs index ef94eec15d..b855e48f83 100644 --- a/nym-api/src/nym_contract_cache/cache/refresher.rs +++ b/nym-api/src/nym_contract_cache/cache/refresher.rs @@ -10,8 +10,7 @@ use futures::future::join_all; use nym_mixnet_contract_common::{MixId, MixNodeDetails, RewardedSetNodeStatus}; use nym_task::TaskClient; use nym_validator_client::nyxd::contract_traits::{ - MixnetQueryClient, NameServiceQueryClient, NymContractsProvider, PagedNameServiceQueryClient, - PagedSpDirectoryQueryClient, SpDirectoryQueryClient, VestingQueryClient, + MixnetQueryClient, NymContractsProvider, VestingQueryClient, }; use nym_validator_client::nyxd::CosmWasmClient; use std::{collections::HashMap, sync::atomic::Ordering, time::Duration}; @@ -55,8 +54,6 @@ impl NymContractCacheRefresher { let mixnet = query_guard!(client_guard, mixnet_contract_address()); let vesting = query_guard!(client_guard, vesting_contract_address()); - let name_service = query_guard!(client_guard, name_service_contract_address()); - let service_provider = query_guard!(client_guard, service_provider_contract_address()); let coconut_bandwidth = query_guard!(client_guard, coconut_bandwidth_contract_address()); let coconut_dkg = query_guard!(client_guard, dkg_contract_address()); let group = query_guard!(client_guard, group_contract_address()); @@ -65,10 +62,6 @@ impl NymContractCacheRefresher { // get cw2 versions let mixnet_cw2_future = query_guard!(client_guard, get_mixnet_contract_cw2_version()); let vesting_cw2_future = query_guard!(client_guard, get_vesting_contract_cw2_version()); - let service_provider_cw2_future = - query_guard!(client_guard, get_name_service_contract_cw2_version()); - let name_service_cw2_future = - query_guard!(client_guard, get_name_service_contract_cw2_version()); // group and multisig contract save that information in their storage but don't expose it via queries // so a temporary workaround... @@ -97,51 +90,17 @@ impl NymContractCacheRefresher { None }; - let mut cw2_info = join_all(vec![ - mixnet_cw2_future, - vesting_cw2_future, - service_provider_cw2_future, - name_service_cw2_future, - ]) - .await; + let mut cw2_info = join_all(vec![mixnet_cw2_future, vesting_cw2_future]).await; // get detailed build info let mixnet_detailed_future = query_guard!(client_guard, get_mixnet_contract_version()); let vesting_detailed_future = query_guard!(client_guard, get_vesting_contract_version()); - let service_provider_detailed_future = - query_guard!(client_guard, get_sp_contract_version()); - let name_service_detailed_future = - query_guard!(client_guard, get_name_service_contract_version()); - let mut build_info = join_all(vec![ - mixnet_detailed_future, - vesting_detailed_future, - service_provider_detailed_future, - name_service_detailed_future, - ]) - .await; + let mut build_info = join_all(vec![mixnet_detailed_future, vesting_detailed_future]).await; // the below unwraps are fine as we definitely have the specified number of entries // Note to whoever updates this code in the future: `pop` removes **LAST** element, // so make sure you call them in correct order, depending on what's specified in the `join_all` - updated.insert( - "nym-name-service-contract".to_string(), - CachedContractInfo::new( - name_service, - cw2_info.pop().unwrap().ok(), - build_info.pop().unwrap().ok(), - ), - ); - - updated.insert( - "nym-service-provider-directory-contract".to_string(), - CachedContractInfo::new( - service_provider, - cw2_info.pop().unwrap().ok(), - build_info.pop().unwrap().ok(), - ), - ); - updated.insert( "nym-vesting-contract".to_string(), CachedContractInfo::new( @@ -193,9 +152,6 @@ impl NymContractCacheRefresher { let (rewarded_set, active_set) = Self::collect_rewarded_and_active_set_details(&mixnodes, &rewarded_set_map); - // The service providers and names are optional - let services = self.nyxd_client.get_all_services().await.ok(); - let names = self.nyxd_client.get_all_names().await.ok(); let contract_info = self.get_nym_contracts_info().await?; info!( @@ -213,8 +169,6 @@ impl NymContractCacheRefresher { rewarding_params, current_interval, mix_to_family, - services, - names, contract_info, ) .await; diff --git a/nym-api/src/nym_contract_cache/mod.rs b/nym-api/src/nym_contract_cache/mod.rs index 280bdb5534..15d861e51e 100644 --- a/nym-api/src/nym_contract_cache/mod.rs +++ b/nym-api/src/nym_contract_cache/mod.rs @@ -27,8 +27,6 @@ pub(crate) fn nym_contract_cache_routes(settings: &OpenApiSettings) -> (Vec) -> Json> { Json(*cache.current_interval().await) } - -#[openapi(tag = "contract-cache")] -#[get("/services")] -pub async fn get_services(cache: &State) -> Json { - let services = cache.services().await.clone(); - Json(services.as_slice().into()) -} - -#[openapi(tag = "contract-cache")] -#[get("/names")] -pub async fn get_registered_names(cache: &State) -> Json { - let names = cache.names().await.clone(); - Json(names.as_slice().into()) -} diff --git a/nym-api/src/support/nyxd/mod.rs b/nym-api/src/support/nyxd/mod.rs index 79fb39b663..99a6afa21e 100644 --- a/nym-api/src/support/nyxd/mod.rs +++ b/nym-api/src/support/nyxd/mod.rs @@ -30,16 +30,14 @@ use nym_mixnet_contract_common::{ CurrentIntervalResponse, EpochStatus, ExecuteMsg, GatewayBond, IdentityKey, LayerAssignment, MixId, RewardedSetNodeStatus, }; -use nym_name_service_common::msg::QueryMsg as NameServiceQueryMsg; -use nym_service_provider_directory_common::msg::QueryMsg as SpQueryMsg; -use nym_validator_client::nyxd::contract_traits::{NameServiceQueryClient, PagedDkgQueryClient}; +use nym_validator_client::nyxd::contract_traits::PagedDkgQueryClient; use nym_validator_client::nyxd::error::NyxdError; use nym_validator_client::nyxd::{ contract_traits::{ CoconutBandwidthQueryClient, DkgQueryClient, DkgSigningClient, GroupQueryClient, MixnetQueryClient, MixnetSigningClient, MultisigQueryClient, MultisigSigningClient, NymContractsProvider, PagedMixnetQueryClient, PagedMultisigQueryClient, - PagedVestingQueryClient, SpDirectoryQueryClient, + PagedVestingQueryClient, }, cosmwasm_client::types::ExecuteResult, CosmWasmClient, Fee, @@ -601,29 +599,3 @@ impl DkgQueryClient for Client { nyxd_query!(self, query_dkg_contract(query).await) } } - -#[async_trait] -impl SpDirectoryQueryClient for Client { - async fn query_service_provider_contract( - &self, - query: SpQueryMsg, - ) -> std::result::Result - where - for<'a> T: Deserialize<'a>, - { - nyxd_query!(self, query_service_provider_contract(query).await) - } -} - -#[async_trait] -impl NameServiceQueryClient for Client { - async fn query_name_service_contract( - &self, - query: NameServiceQueryMsg, - ) -> std::result::Result - where - for<'a> T: Deserialize<'a>, - { - nyxd_query!(self, query_name_service_contract(query).await) - } -} diff --git a/nym-connect/desktop/Cargo.lock b/nym-connect/desktop/Cargo.lock index 808e429faa..80c9de63b7 100644 --- a/nym-connect/desktop/Cargo.lock +++ b/nym-connect/desktop/Cargo.lock @@ -4183,19 +4183,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "nym-name-service-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "nym-contracts-common", - "serde", - "thiserror", -] - [[package]] name = "nym-network-defaults" version = "0.1.0" @@ -4272,18 +4259,6 @@ dependencies = [ "pem", ] -[[package]] -name = "nym-service-provider-directory-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "nym-contracts-common", - "thiserror", -] - [[package]] name = "nym-service-providers-common" version = "0.1.0" @@ -4570,9 +4545,7 @@ dependencies = [ "nym-http-api-client", "nym-mixnet-contract-common", "nym-multisig-contract-common", - "nym-name-service-common", "nym-network-defaults", - "nym-service-provider-directory-common", "nym-vesting-contract-common", "prost", "reqwest 0.12.4", diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 2bb7e00138..3396831f8f 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -3296,19 +3296,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "nym-name-service-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "nym-contracts-common", - "serde", - "thiserror", -] - [[package]] name = "nym-network-defaults" version = "0.1.0" @@ -3350,18 +3337,6 @@ dependencies = [ "pem", ] -[[package]] -name = "nym-service-provider-directory-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "nym-contracts-common", - "thiserror", -] - [[package]] name = "nym-sphinx-types" version = "0.2.0" @@ -3445,9 +3420,7 @@ dependencies = [ "nym-http-api-client", "nym-mixnet-contract-common", "nym-multisig-contract-common", - "nym-name-service-common", "nym-network-defaults", - "nym-service-provider-directory-common", "nym-vesting-contract-common", "prost", "reqwest 0.12.4", diff --git a/tools/nym-cli/src/validator/mixnet/operators/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/mod.rs index feb336524c..0e14e36a21 100644 --- a/tools/nym-cli/src/validator/mixnet/operators/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/operators/mod.rs @@ -7,8 +7,6 @@ use nym_network_defaults::NymNetworkDetails; pub(crate) mod gateways; pub(crate) mod identity_key; pub(crate) mod mixnodes; -pub(crate) mod name; -pub(crate) mod services; pub(crate) async fn execute( global_args: ClientArgs, @@ -22,8 +20,8 @@ pub(crate) async fn execute( nym_cli_commands::validator::mixnet::operators::MixnetOperatorsCommands::Mixnode( mixnode, ) => mixnodes::execute(global_args, mixnode, network_details).await, - nym_cli_commands::validator::mixnet::operators::MixnetOperatorsCommands::ServiceProvider(service) => services::execute(global_args, service, network_details).await, - nym_cli_commands::validator::mixnet::operators::MixnetOperatorsCommands::Name(name) => name::execute(global_args, name, network_details).await, - nym_cli_commands::validator::mixnet::operators::MixnetOperatorsCommands::IdentityKey(identity_key) => identity_key::execute(global_args, identity_key, network_details).await, + nym_cli_commands::validator::mixnet::operators::MixnetOperatorsCommands::IdentityKey( + identity_key, + ) => identity_key::execute(global_args, identity_key, network_details).await, } } diff --git a/tools/nym-cli/src/validator/mixnet/operators/name/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/name/mod.rs deleted file mode 100644 index 5ab1f3dcba..0000000000 --- a/tools/nym-cli/src/validator/mixnet/operators/name/mod.rs +++ /dev/null @@ -1,36 +0,0 @@ -use nym_cli_commands::context::{create_signing_client, ClientArgs}; -use nym_network_defaults::NymNetworkDetails; - -pub(crate) async fn execute( - global_args: ClientArgs, - name: nym_cli_commands::validator::mixnet::operators::name::MixnetOperatorsName, - network_details: &NymNetworkDetails, -) -> anyhow::Result<()> { - let res = match name.command { - nym_cli_commands::validator::mixnet::operators::name::MixnetOperatorsNameCommands::Register(register) => { - let res = nym_cli_commands::validator::mixnet::operators::name::register::register(register, create_signing_client(global_args, network_details)?).await; - match res { - Ok(_) => println!("Successfully registered the name"), - Err(_) => println!("Failed to register name") - }; - res - }, - nym_cli_commands::validator::mixnet::operators::name::MixnetOperatorsNameCommands::Delete(delete) => { - let res = nym_cli_commands::validator::mixnet::operators::name::delete::delete(delete, create_signing_client(global_args, network_details)?).await; - match res { - Ok(_) => println!("Successfully deleted the name"), - Err(_) => println!("Failed to delete name") - }; - res - }, - nym_cli_commands::validator::mixnet::operators::name::MixnetOperatorsNameCommands::CreateNameRegisterPayload(args) => { - let res = nym_cli_commands::validator::mixnet::operators::name::register_sign_payload::create_payload(args, create_signing_client(global_args, network_details)?).await; - match res { - Ok(_) => (), - Err(_) => println!("Failed to create payload") - }; - res - } - }; - Ok(res?) -} diff --git a/tools/nym-cli/src/validator/mixnet/operators/services/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/services/mod.rs deleted file mode 100644 index 1ee172d7c4..0000000000 --- a/tools/nym-cli/src/validator/mixnet/operators/services/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -use nym_cli_commands::context::{create_signing_client, ClientArgs}; -use nym_network_defaults::NymNetworkDetails; - -pub(crate) async fn execute( - global_args: ClientArgs, - service: nym_cli_commands::validator::mixnet::operators::service::MixnetOperatorsService, - network_details: &NymNetworkDetails, -) -> anyhow::Result<()> { - match service.command { - nym_cli_commands::validator::mixnet::operators::service::MixnetOperatorsServiceCommands::Announce(announce) => nym_cli_commands::validator::mixnet::operators::service::announce::announce(announce, create_signing_client(global_args, network_details)?).await, - nym_cli_commands::validator::mixnet::operators::service::MixnetOperatorsServiceCommands::Delete(delete) => nym_cli_commands::validator::mixnet::operators::service::delete::delete(delete, create_signing_client(global_args, network_details)?).await, - nym_cli_commands::validator::mixnet::operators::service::MixnetOperatorsServiceCommands::CreateServiceAnnounceSignPayload(args) => nym_cli_commands::validator::mixnet::operators::service::announce_sign_payload::create_payload(args, create_signing_client(global_args, network_details)?).await, - } - Ok(()) -} diff --git a/tools/nym-cli/src/validator/mixnet/query/mod.rs b/tools/nym-cli/src/validator/mixnet/query/mod.rs index 8f0e299720..8726787fc3 100644 --- a/tools/nym-cli/src/validator/mixnet/query/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/query/mod.rs @@ -23,20 +23,6 @@ pub(crate) async fn execute( ) .await } - nym_cli_commands::validator::mixnet::query::MixnetQueryCommands::ServiceProviders(args) => { - nym_cli_commands::validator::mixnet::query::query_all_service_providers::query( - args, - &create_query_client_with_nym_api(network_details)?, - ) - .await - } - nym_cli_commands::validator::mixnet::query::MixnetQueryCommands::Names(args) => { - nym_cli_commands::validator::mixnet::query::query_all_names::query( - args, - &create_query_client_with_nym_api(network_details)?, - ) - .await - } } Ok(()) }