diff --git a/Cargo.lock b/Cargo.lock index 3cd2da7190..8092e3156e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -621,6 +621,14 @@ dependencies = [ "serde", ] +[[package]] +name = "coconut-dkg-common" +version = "0.1.0" +dependencies = [ + "schemars", + "serde", +] + [[package]] name = "coconut-interface" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 43e8273e46..e575901d9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ members = [ "common/crypto/dkg", "common/bandwidth-claim-contract", "common/cosmwasm-smart-contracts/coconut-bandwidth-contract", + "common/cosmwasm-smart-contracts/coconut-dkg-contract", "common/cosmwasm-smart-contracts/contracts-common", "common/cosmwasm-smart-contracts/mixnet-contract", "common/cosmwasm-smart-contracts/vesting-contract", diff --git a/common/cosmwasm-smart-contracts/coconut-dkg-contract/Cargo.toml b/common/cosmwasm-smart-contracts/coconut-dkg-contract/Cargo.toml new file mode 100644 index 0000000000..ac75f1164b --- /dev/null +++ b/common/cosmwasm-smart-contracts/coconut-dkg-contract/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "coconut-dkg-common" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +schemars = "0.8" +serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/common/cosmwasm-smart-contracts/coconut-dkg-contract/src/lib.rs b/common/cosmwasm-smart-contracts/coconut-dkg-contract/src/lib.rs new file mode 100644 index 0000000000..f1fcac4d04 --- /dev/null +++ b/common/cosmwasm-smart-contracts/coconut-dkg-contract/src/lib.rs @@ -0,0 +1,4 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub mod msg; diff --git a/common/cosmwasm-smart-contracts/coconut-dkg-contract/src/msg.rs b/common/cosmwasm-smart-contracts/coconut-dkg-contract/src/msg.rs new file mode 100644 index 0000000000..c9c579db39 --- /dev/null +++ b/common/cosmwasm-smart-contracts/coconut-dkg-contract/src/msg.rs @@ -0,0 +1,20 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct InstantiateMsg {} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum ExecuteMsg {} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg {} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct MigrateMsg {} diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index 587865525c..248797bf30 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -213,6 +213,26 @@ dependencies = [ "serde", ] +[[package]] +name = "coconut-dkg" +version = "0.1.0" +dependencies = [ + "coconut-dkg-common", + "config", + "cosmwasm-std", + "cosmwasm-storage", + "serde", + "thiserror", +] + +[[package]] +name = "coconut-dkg-common" +version = "0.1.0" +dependencies = [ + "schemars", + "serde", +] + [[package]] name = "config" version = "0.1.0" @@ -241,9 +261,9 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.0.0-beta7" +version = "1.0.0-beta8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c2565b1e73a816fb659ef4838fc356143fbd35f43c48a51d2d7d4e5d6679d3" +checksum = "37e70111e9701c3ec43bfbff0e523cd4cb115876b4d3433813436dd0934ee962" dependencies = [ "digest 0.9.0", "ed25519-zebra", @@ -254,9 +274,9 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.0.0-beta7" +version = "1.0.0-beta8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa89fcdf8dbbe0088e663d0a814aa7368e7ebe8fb045a3a150fb5fdc2ffe3b45" +checksum = "58bc2ad5d86be5f6068833f63e20786768db6890019c095dd7775232184fb7b3" dependencies = [ "syn", ] @@ -273,9 +293,9 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.0.0-beta7" +version = "1.0.0-beta8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcb8f99a61d0b9069e1afc80a4ffea87dcc3523edd992080923870b13a677da0" +checksum = "915ca82bd944f116f3a9717481f3fa657e4a73f28c4887288761ebb24e6fbe10" dependencies = [ "base64", "cosmwasm-crypto", @@ -290,9 +310,9 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.0.0-beta7" +version = "1.0.0-beta8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07f856099c824aa8f2488e62d1da3fc06383d3fdbc764573595f451be43441a2" +checksum = "1c4be9fd8c9d3ae7d0c32a925ecbc20707007ce0cba1f7538c0d78b7a2d3729b" dependencies = [ "cosmwasm-std", "serde", @@ -1467,9 +1487,9 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "uint" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" +checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" dependencies = [ "byteorder", "crunchy", diff --git a/contracts/Cargo.toml b/contracts/Cargo.toml index d748532df6..0499312a58 100644 --- a/contracts/Cargo.toml +++ b/contracts/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["bandwidth-claim", "coconut-bandwidth", "mixnet", "vesting"] +members = ["bandwidth-claim", "coconut-bandwidth", "coconut-dkg", "mixnet", "vesting"] [profile.release] opt-level = 3 diff --git a/contracts/coconut-dkg/Cargo.toml b/contracts/coconut-dkg/Cargo.toml new file mode 100644 index 0000000000..8e8207e99a --- /dev/null +++ b/contracts/coconut-dkg/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "coconut-dkg" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +coconut-dkg-common = { path = "../../common/cosmwasm-smart-contracts/coconut-dkg-contract" } +config = { path = "../../common/config"} + +cosmwasm-std = "1.0.0-beta8" +cosmwasm-storage = "1.0.0-beta8" +serde = { version = "1.0.103", default-features = false, features = ["derive"] } +thiserror = "1.0.23" diff --git a/contracts/coconut-dkg/src/error.rs b/contracts/coconut-dkg/src/error.rs new file mode 100644 index 0000000000..8302728323 --- /dev/null +++ b/contracts/coconut-dkg/src/error.rs @@ -0,0 +1,20 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use cosmwasm_std::StdError; +use thiserror::Error; + +use config::defaults::DENOM; + +/// Custom errors for contract failure conditions. +#[derive(Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("Received multiple coin types")] + MultipleDenoms, + + #[error("Wrong coin denomination, you must send {}", DENOM)] + WrongDenom, +} diff --git a/contracts/coconut-dkg/src/lib.rs b/contracts/coconut-dkg/src/lib.rs new file mode 100644 index 0000000000..e835b4e873 --- /dev/null +++ b/contracts/coconut-dkg/src/lib.rs @@ -0,0 +1,84 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::error::ContractError; +use coconut_dkg_common::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; +use cosmwasm_std::{entry_point, Deps, DepsMut, Env, MessageInfo, QueryResponse, Response}; + +mod error; +mod queries; +mod support; +mod transactions; + +/// Instantiate the contract. +/// +/// `deps` contains Storage, API and Querier +/// `env` contains block, message and contract info +/// `msg` is the contract initialization message, sort of like a constructor call. +#[entry_point] +pub fn instantiate( + _deps: DepsMut<'_>, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> Result { + Ok(Response::default()) +} + +/// Handle an incoming message +#[entry_point] +pub fn execute( + _deps: DepsMut<'_>, + _env: Env, + _info: MessageInfo, + msg: ExecuteMsg, +) -> Result { + match msg { + _ => (), + } + + Ok(Default::default()) +} + +#[entry_point] +pub fn query(_deps: Deps<'_>, _env: Env, msg: QueryMsg) -> Result { + match msg { + _ => (), + } + + Ok(Default::default()) +} + +#[entry_point] +pub fn migrate(_deps: DepsMut<'_>, _env: Env, _msg: MigrateMsg) -> Result { + Ok(Default::default()) +} + +#[cfg(test)] +mod tests { + use super::*; + use config::defaults::DENOM; + use cosmwasm_std::coins; + use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; + + #[test] + fn initialize_contract() { + let mut deps = mock_dependencies(); + let env = mock_env(); + let msg = InstantiateMsg {}; + let info = mock_info("creator", &[]); + + let res = instantiate(deps.as_mut(), env.clone(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // Contract balance should be 0 + assert_eq!( + coins(0, DENOM), + vec![deps + .as_ref() + .querier + .query_balance(env.contract.address, DENOM) + .unwrap()] + ); + } +} diff --git a/contracts/coconut-dkg/src/queries.rs b/contracts/coconut-dkg/src/queries.rs new file mode 100644 index 0000000000..87d5c392c8 --- /dev/null +++ b/contracts/coconut-dkg/src/queries.rs @@ -0,0 +1,2 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 diff --git a/contracts/coconut-dkg/src/support/mod.rs b/contracts/coconut-dkg/src/support/mod.rs new file mode 100644 index 0000000000..6c9e519bd5 --- /dev/null +++ b/contracts/coconut-dkg/src/support/mod.rs @@ -0,0 +1,3 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 +pub mod tests; diff --git a/contracts/coconut-dkg/src/support/tests.rs b/contracts/coconut-dkg/src/support/tests.rs new file mode 100644 index 0000000000..fd4a396f04 --- /dev/null +++ b/contracts/coconut-dkg/src/support/tests.rs @@ -0,0 +1,19 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +#[cfg(test)] +pub mod helpers { + use crate::instantiate; + use coconut_dkg_common::msg::InstantiateMsg; + use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier}; + use cosmwasm_std::{Empty, MemoryStorage, OwnedDeps}; + + pub fn init_contract() -> OwnedDeps> { + let mut deps = mock_dependencies(); + let msg = InstantiateMsg {}; + let env = mock_env(); + let info = mock_info("creator", &[]); + instantiate(deps.as_mut(), env, info, msg).unwrap(); + deps + } +} diff --git a/contracts/coconut-dkg/src/transactions.rs b/contracts/coconut-dkg/src/transactions.rs new file mode 100644 index 0000000000..87d5c392c8 --- /dev/null +++ b/contracts/coconut-dkg/src/transactions.rs @@ -0,0 +1,2 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 4a7efe07fa..a1e1a3b357 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -5387,6 +5387,7 @@ dependencies = [ name = "validator-api-requests" version = "0.1.0" dependencies = [ + "mixnet-contract-common", "serde", ]