diff --git a/Cargo.lock b/Cargo.lock index d96ba293e4..ad14550e51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,6 +213,17 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "bitvec" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98fcd36dda4e17b7d7abc64cb549bf0201f4ab71e00700c798ca7e62ed3761fa" +dependencies = [ + "funty", + "radium", + "wyz", +] + [[package]] name = "blake2" version = "0.8.1" @@ -448,6 +459,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "const-oid" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" + [[package]] name = "const_fn" version = "0.4.7" @@ -494,26 +511,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] -name = "cosmwasm-derive" -version = "0.13.2" +name = "cosmwasm-crypto" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de70197a0fe4e402aa260da00ec62d9bf091afe87866e9f3347691d591b60f89" +checksum = "038089cdadfe61e4e85617d91cecec2c49f828db8e5986bb85e29d0b29c59b77" +dependencies = [ + "digest 0.9.0", + "ed25519-zebra", + "k256", + "rand_core 0.5.1", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bf3da935843795a7f52678262ef06398878b0cf4c89b69612d8525ea27b84" dependencies = [ "syn", ] [[package]] name = "cosmwasm-std" -version = "0.13.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02173c4eb78ef76863f5190f60a45278d11e7c8b142327c149e18128b2b97f85" +checksum = "22de097cf4f7e7f575f51a22de7260932756ccfe499e005f98244a3043470e48" dependencies = [ "base64 0.13.0", + "cosmwasm-crypto", "cosmwasm-derive", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -557,6 +589,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto" version = "0.1.0" @@ -594,7 +632,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ "generic-array 0.14.4", - "subtle 2.2.3", + "subtle 2.4.0", ] [[package]] @@ -604,7 +642,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" dependencies = [ "generic-array 0.14.4", - "subtle 2.2.3", + "subtle 2.4.0", ] [[package]] @@ -635,7 +673,7 @@ dependencies = [ "byteorder", "digest 0.9.0", "rand_core 0.5.1", - "subtle 2.2.3", + "subtle 2.4.0", "zeroize", ] @@ -649,6 +687,15 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "der" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +dependencies = [ + "const-oid", +] + [[package]] name = "derive_more" version = "0.99.13" @@ -747,6 +794,23 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" + +[[package]] +name = "ecdsa" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +dependencies = [ + "elliptic-curve", + "hmac 0.10.1", + "signature", +] + [[package]] name = "ed25519" version = "1.0.1" @@ -770,12 +834,44 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ed25519-zebra" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core 0.5.1", + "serde", + "sha2 0.9.1", + "thiserror", +] + [[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "elliptic-curve" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2db227e61a43a34915680bdda462ec0e212095518020a88a1f91acd16092c39" +dependencies = [ + "bitvec", + "digest 0.9.0", + "ff", + "funty", + "generic-array 0.14.4", + "group", + "pkcs8", + "rand_core 0.5.1", + "subtle 2.4.0", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.24" @@ -804,6 +900,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +[[package]] +name = "ff" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +dependencies = [ + "bitvec", + "rand_core 0.5.1", + "subtle 2.4.0", +] + [[package]] name = "figment" version = "0.10.5" @@ -859,6 +966,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + [[package]] name = "futures" version = "0.3.9" @@ -1062,6 +1175,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "group" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +dependencies = [ + "ff", + "rand_core 0.5.1", + "subtle 2.4.0", +] + [[package]] name = "h2" version = "0.3.1" @@ -1110,6 +1234,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hkdf" version = "0.8.0" @@ -1328,6 +1458,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4476a0808212a9e81ce802eb1a0cfc60e73aea296553bacc0fac7e1268bc572a" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa", + "elliptic-curve", + "sha2 0.9.1", +] + [[package]] name = "keystream" version = "1.0.0" @@ -2095,6 +2237,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +dependencies = [ + "der", +] + [[package]] name = "pkg-config" version = "0.3.18" @@ -2197,6 +2348,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" + [[package]] name = "rand" version = "0.7.3" @@ -2529,10 +2686,11 @@ dependencies = [ [[package]] name = "schemars" -version = "0.7.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be77ed66abed6954aabf6a3e31a84706bedbf93750d267e92ef4a6d90bbd6a61" +checksum = "bc6ab463ae35acccb5cba66c0084c985257b797d288b6050cc2f6ac1b266cb78" dependencies = [ + "dyn-clone", "schemars_derive", "serde", "serde_json", @@ -2540,9 +2698,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.7.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11af7a475c9ee266cfaa9e303a47c830ebe072bf3101ab907a7b7b9d816fa01d" +checksum = "902fdfbcf871ae8f653bddf4b2c05905ddaabc08f69d32a915787e3be0d31356" dependencies = [ "proc-macro2", "quote", @@ -2629,9 +2787,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.2.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120bad73306616e91acd7ceed522ba96032a51cffeef3cc813de7f367df71e37" +checksum = "50eef3672ec8fa45f3457fd423ba131117786784a895548021976117c1ded449" dependencies = [ "serde", ] @@ -2752,6 +2910,10 @@ name = "signature" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +dependencies = [ + "digest 0.9.0", + "rand_core 0.5.1", +] [[package]] name = "slab" @@ -2878,6 +3040,12 @@ dependencies = [ "loom", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stdweb" version = "0.4.20" @@ -2950,9 +3118,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" [[package]] name = "subtle" -version = "2.2.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502d53007c02d7605a05df1c1a73ee436952781653da5d0bf57ad608f66932c1" +checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" @@ -3289,6 +3457,18 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "uncased" version = "0.9.6" @@ -3602,6 +3782,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + [[package]] name = "x25519-dalek" version = "1.1.0" diff --git a/common/client-libs/validator-client/src/lib.rs b/common/client-libs/validator-client/src/lib.rs index d98a1925bf..11ec497274 100644 --- a/common/client-libs/validator-client/src/lib.rs +++ b/common/client-libs/validator-client/src/lib.rs @@ -5,7 +5,7 @@ use crate::models::{QueryRequest, QueryResponse}; use crate::ValidatorClientError::ValidatorError; use core::fmt::{self, Display, Formatter}; use mixnet_contract::{ - GatewayBond, LayerDistribution, MixNodeBond, PagedGatewayResponse, PagedResponse, + GatewayBond, IdentityKey, LayerDistribution, MixNodeBond, PagedGatewayResponse, PagedResponse, }; use rand::seq::SliceRandom; use rand::thread_rng; @@ -177,7 +177,7 @@ impl Client { async fn get_mix_nodes_paged( &mut self, - start_after: Option, + start_after: Option, ) -> Result { let query_content_json = serde_json::to_string(&QueryRequest::GetMixNodes { limit: self.config.mixnode_page_limit, @@ -210,7 +210,7 @@ impl Client { async fn get_gateways_paged( &mut self, - start_after: Option, + start_after: Option, ) -> Result { let query_content_json = serde_json::to_string(&QueryRequest::GetGateways { limit: self.config.gateway_page_limit, diff --git a/common/client-libs/validator-client/src/models.rs b/common/client-libs/validator-client/src/models.rs index 66e8dfe6e6..c98c9963ab 100644 --- a/common/client-libs/validator-client/src/models.rs +++ b/common/client-libs/validator-client/src/models.rs @@ -3,6 +3,7 @@ use crate::serde_helpers::{de_i64_from_str, de_paged_query_response_from_str}; use core::fmt::{self, Display, Formatter}; +use mixnet_contract::IdentityKey; use serde::{Deserialize, Serialize}; // TODO: this is a duplicate code but it really does not feel @@ -13,10 +14,10 @@ use serde::{Deserialize, Serialize}; pub(super) enum QueryRequest { GetMixNodes { limit: Option, - start_after: Option, + start_after: Option, }, GetGateways { - start_after: Option, + start_after: Option, limit: Option, }, LayerDistribution {}, diff --git a/common/mixnet-contract/Cargo.toml b/common/mixnet-contract/Cargo.toml index 75a67f9140..a645e97ef7 100644 --- a/common/mixnet-contract/Cargo.toml +++ b/common/mixnet-contract/Cargo.toml @@ -7,6 +7,6 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -cosmwasm-std = { version = "0.13.2" } +cosmwasm-std = { version = "0.14.1" } serde = { version = "1.0", features = ["derive"] } -schemars = "0.7" +schemars = "0.8" diff --git a/common/mixnet-contract/src/delegation.rs b/common/mixnet-contract/src/delegation.rs index e066af8975..e17f588e46 100644 --- a/common/mixnet-contract/src/delegation.rs +++ b/common/mixnet-contract/src/delegation.rs @@ -1,8 +1,7 @@ // due to code generated by JsonSchema #![allow(clippy::field_reassign_with_default)] -use crate::HumanAddr; -use crate::IdentityKey; +use crate::{Addr, IdentityKey}; use cosmwasm_std::Coin; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -10,12 +9,12 @@ use std::fmt::Display; #[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)] pub struct Delegation { - owner: HumanAddr, + owner: Addr, amount: Coin, } impl Delegation { - pub fn new(owner: HumanAddr, amount: Coin) -> Self { + pub fn new(owner: Addr, amount: Coin) -> Self { Delegation { owner, amount } } @@ -23,7 +22,7 @@ impl Delegation { &self.amount } - pub fn owner(&self) -> HumanAddr { + pub fn owner(&self) -> Addr { self.owner.clone() } } @@ -42,14 +41,14 @@ impl Display for Delegation { pub struct PagedMixDelegationsResponse { pub node_identity: IdentityKey, pub delegations: Vec, - pub start_next_after: Option, + pub start_next_after: Option, } impl PagedMixDelegationsResponse { pub fn new( node_identity: IdentityKey, delegations: Vec, - start_next_after: Option, + start_next_after: Option, ) -> Self { PagedMixDelegationsResponse { node_identity, @@ -63,14 +62,14 @@ impl PagedMixDelegationsResponse { pub struct PagedGatewayDelegationsResponse { pub node_identity: IdentityKey, pub delegations: Vec, - pub start_next_after: Option, + pub start_next_after: Option, } impl PagedGatewayDelegationsResponse { pub fn new( node_identity: IdentityKey, delegations: Vec, - start_next_after: Option, + start_next_after: Option, ) -> Self { PagedGatewayDelegationsResponse { node_identity, diff --git a/common/mixnet-contract/src/gateway.rs b/common/mixnet-contract/src/gateway.rs index 052bed926f..d4bae81d17 100644 --- a/common/mixnet-contract/src/gateway.rs +++ b/common/mixnet-contract/src/gateway.rs @@ -2,7 +2,7 @@ #![allow(clippy::field_reassign_with_default)] use crate::{IdentityKey, SphinxKey}; -use cosmwasm_std::{Coin, HumanAddr}; +use cosmwasm_std::{Addr, Coin}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt::Display; @@ -50,12 +50,12 @@ impl Gateway { #[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)] pub struct GatewayBond { pub amount: Vec, - pub owner: HumanAddr, + pub owner: Addr, pub gateway: Gateway, } impl GatewayBond { - pub fn new(amount: Vec, owner: HumanAddr, gateway: Gateway) -> Self { + pub fn new(amount: Vec, owner: Addr, gateway: Gateway) -> Self { GatewayBond { amount, owner, @@ -71,7 +71,7 @@ impl GatewayBond { &self.amount } - pub fn owner(&self) -> &HumanAddr { + pub fn owner(&self) -> &Addr { &self.owner } @@ -98,11 +98,15 @@ impl Display for GatewayBond { pub struct PagedGatewayResponse { pub nodes: Vec, pub per_page: usize, - pub start_next_after: Option, + pub start_next_after: Option, } impl PagedGatewayResponse { - pub fn new(nodes: Vec, per_page: usize, start_next_after: Option) -> Self { + pub fn new( + nodes: Vec, + per_page: usize, + start_next_after: Option, + ) -> Self { PagedGatewayResponse { nodes, per_page, @@ -113,6 +117,6 @@ impl PagedGatewayResponse { #[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)] pub struct GatewayOwnershipResponse { - pub address: HumanAddr, + pub address: Addr, pub has_gateway: bool, } diff --git a/common/mixnet-contract/src/lib.rs b/common/mixnet-contract/src/lib.rs index 47be2af819..d43d9d33fe 100644 --- a/common/mixnet-contract/src/lib.rs +++ b/common/mixnet-contract/src/lib.rs @@ -4,7 +4,7 @@ mod delegation; mod gateway; mod mixnode; -pub use cosmwasm_std::{Coin, HumanAddr}; +pub use cosmwasm_std::{Addr, Coin}; pub use delegation::{Delegation, PagedGatewayDelegationsResponse, PagedMixDelegationsResponse}; pub use gateway::{Gateway, GatewayBond, GatewayOwnershipResponse, PagedGatewayResponse}; pub use mixnode::{MixNode, MixNodeBond, MixOwnershipResponse, PagedResponse}; @@ -20,4 +20,5 @@ pub struct LayerDistribution { // type aliases for better reasoning about available data pub type IdentityKey = String; +pub type IdentityKeyRef<'a> = &'a str; pub type SphinxKey = String; diff --git a/common/mixnet-contract/src/mixnode.rs b/common/mixnet-contract/src/mixnode.rs index 68f57d0740..c4bfa7da41 100644 --- a/common/mixnet-contract/src/mixnode.rs +++ b/common/mixnet-contract/src/mixnode.rs @@ -2,7 +2,7 @@ #![allow(clippy::field_reassign_with_default)] use crate::{IdentityKey, SphinxKey}; -use cosmwasm_std::{Coin, HumanAddr}; +use cosmwasm_std::{Addr, Coin}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt::Display; @@ -69,12 +69,12 @@ pub struct MixNodeBond { // // I would also introduce the identical changes to GatewayBond pub amount: Vec, - pub owner: HumanAddr, + pub owner: Addr, pub mix_node: MixNode, } impl MixNodeBond { - pub fn new(amount: Vec, owner: HumanAddr, mix_node: MixNode) -> Self { + pub fn new(amount: Vec, owner: Addr, mix_node: MixNode) -> Self { MixNodeBond { amount, owner, @@ -90,7 +90,7 @@ impl MixNodeBond { &self.amount } - pub fn owner(&self) -> &HumanAddr { + pub fn owner(&self) -> &Addr { &self.owner } @@ -121,11 +121,15 @@ impl Display for MixNodeBond { pub struct PagedResponse { pub nodes: Vec, pub per_page: usize, - pub start_next_after: Option, + pub start_next_after: Option, } impl PagedResponse { - pub fn new(nodes: Vec, per_page: usize, start_next_after: Option) -> Self { + pub fn new( + nodes: Vec, + per_page: usize, + start_next_after: Option, + ) -> Self { PagedResponse { nodes, per_page, @@ -136,6 +140,6 @@ impl PagedResponse { #[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)] pub struct MixOwnershipResponse { - pub address: HumanAddr, + pub address: Addr, pub has_node: bool, } diff --git a/common/topology/src/gateway.rs b/common/topology/src/gateway.rs index f358f90d49..4c62db62f7 100644 --- a/common/topology/src/gateway.rs +++ b/common/topology/src/gateway.rs @@ -121,7 +121,7 @@ impl<'a> TryFrom<&'a GatewayBond> for Node { return Err(GatewayConversionError::InvalidStake); } Ok(Node { - owner: bond.owner.0.clone(), + owner: bond.owner.as_str().to_owned(), stake: bond .amount .first() diff --git a/common/topology/src/mix.rs b/common/topology/src/mix.rs index 058794a176..a97e342745 100644 --- a/common/topology/src/mix.rs +++ b/common/topology/src/mix.rs @@ -113,7 +113,7 @@ impl<'a> TryFrom<&'a MixNodeBond> for Node { return Err(MixnodeConversionError::InvalidStake); } Ok(Node { - owner: bond.owner.0.clone(), + owner: bond.owner.as_str().to_owned(), stake: bond .amount .first() diff --git a/contracts/mixnet/Cargo.lock b/contracts/mixnet/Cargo.lock index 04a7d9a5ae..b8057fa632 100644 --- a/contracts/mixnet/Cargo.lock +++ b/contracts/mixnet/Cargo.lock @@ -7,19 +7,70 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] -name = "cosmwasm-derive" -version = "0.13.2" +name = "bitvec" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de70197a0fe4e402aa260da00ec62d9bf091afe87866e9f3347691d591b60f89" +checksum = "98fcd36dda4e17b7d7abc64cb549bf0201f4ab71e00700c798ca7e62ed3761fa" +dependencies = [ + "funty", + "radium", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" + +[[package]] +name = "cosmwasm-crypto" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038089cdadfe61e4e85617d91cecec2c49f828db8e5986bb85e29d0b29c59b77" +dependencies = [ + "digest", + "ed25519-zebra", + "k256", + "rand_core", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bf3da935843795a7f52678262ef06398878b0cf4c89b69612d8525ea27b84" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98b56c1c839e5cfda1be0e0f152728b34bdcd5a2e921905947f6d088bab2c68" +checksum = "d6a9a6a4ca3b4d7b56f943312a65857cdfc84424f9c2773889f4cd17f36fba61" dependencies = [ "schemars", "serde_json", @@ -27,34 +78,224 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.13.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02173c4eb78ef76863f5190f60a45278d11e7c8b142327c149e18128b2b97f85" +checksum = "22de097cf4f7e7f575f51a22de7260932756ccfe499e005f98244a3043470e48" dependencies = [ "base64", + "cosmwasm-crypto", "cosmwasm-derive", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] name = "cosmwasm-storage" -version = "0.13.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2cdb5f6c3181c921c02b0018af66178e60bc7be088f81ec730b22ff51240404" +checksum = "f4abf200c2651e123595b18edf67df8702d19127b487d8b3e115dcc6c2ac0e0e" dependencies = [ "cosmwasm-std", "serde", ] +[[package]] +name = "cpufeatures" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-mac" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" +dependencies = [ + "byteorder", + "digest", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "der" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +dependencies = [ + "const-oid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" + +[[package]] +name = "ecdsa" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +dependencies = [ + "elliptic-curve", + "hmac", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "elliptic-curve" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2db227e61a43a34915680bdda462ec0e212095518020a88a1f91acd16092c39" +dependencies = [ + "bitvec", + "digest", + "ff", + "funty", + "generic-array", + "group", + "pkcs8", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +dependencies = [ + "crypto-mac", + "digest", +] + [[package]] name = "itoa" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "k256" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4476a0808212a9e81ce802eb1a0cfc60e73aea296553bacc0fac7e1268bc572a" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "libc" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36" + [[package]] name = "mixnet-contract" version = "0.1.0" @@ -77,6 +318,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pkcs8" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +dependencies = [ + "der", +] + [[package]] name = "proc-macro2" version = "1.0.24" @@ -95,6 +351,21 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + [[package]] name = "ryu" version = "1.0.5" @@ -103,10 +374,11 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.7.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be77ed66abed6954aabf6a3e31a84706bedbf93750d267e92ef4a6d90bbd6a61" +checksum = "bc6ab463ae35acccb5cba66c0084c985257b797d288b6050cc2f6ac1b266cb78" dependencies = [ + "dyn-clone", "schemars_derive", "serde", "serde_json", @@ -114,9 +386,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.7.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11af7a475c9ee266cfaa9e303a47c830ebe072bf3101ab907a7b7b9d816fa01d" +checksum = "902fdfbcf871ae8f653bddf4b2c05905ddaabc08f69d32a915787e3be0d31356" dependencies = [ "proc-macro2", "quote", @@ -135,9 +407,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.2.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120bad73306616e91acd7ceed522ba96032a51cffeef3cc813de7f367df71e37" +checksum = "50eef3672ec8fa45f3457fd423ba131117786784a895548021976117c1ded449" dependencies = [ "serde", ] @@ -175,6 +447,41 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "signature" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" + [[package]] name = "syn" version = "1.0.60" @@ -206,8 +513,50 @@ dependencies = [ "syn", ] +[[package]] +name = "typenum" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" + +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" diff --git a/contracts/mixnet/Cargo.toml b/contracts/mixnet/Cargo.toml index b482d2ff6b..7dcd59bcb2 100644 --- a/contracts/mixnet/Cargo.toml +++ b/contracts/mixnet/Cargo.toml @@ -34,11 +34,11 @@ backtraces = ["cosmwasm-std/backtraces"] [dependencies] mixnet-contract = { path = "../../common/mixnet-contract" } -cosmwasm-std = { version = "0.13.2", features = ["iterator"] } -cosmwasm-storage = { version = "0.13.2", features = ["iterator"] } -schemars = "0.7" +cosmwasm-std = { version = "0.14.1", features = ["iterator"] } +cosmwasm-storage = { version = "0.14.1", features = ["iterator"] } +schemars = "0.8" serde = { version = "1.0.103", default-features = false, features = ["derive"] } thiserror = { version = "1.0.23" } [dev-dependencies] -cosmwasm-schema = { version = "0.13.2" } +cosmwasm-schema = { version = "0.14.0" } diff --git a/contracts/mixnet/examples/schema.rs b/contracts/mixnet/examples/schema.rs index cbe5ce4e9c..ad28a2d7c4 100644 --- a/contracts/mixnet/examples/schema.rs +++ b/contracts/mixnet/examples/schema.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; use mixnet_contract::MixNodeBond; -use mixnet_contracts::msg::{HandleMsg, InitMsg, QueryMsg}; +use mixnet_contracts::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; use mixnet_contracts::state::State; use std::env::current_dir; use std::fs::create_dir_all; @@ -11,8 +11,8 @@ fn main() { create_dir_all(&out_dir).unwrap(); remove_schemas(&out_dir).unwrap(); - export_schema(&schema_for!(InitMsg), &out_dir); - export_schema(&schema_for!(HandleMsg), &out_dir); + export_schema(&schema_for!(InstantiateMsg), &out_dir); + export_schema(&schema_for!(ExecuteMsg), &out_dir); export_schema(&schema_for!(QueryMsg), &out_dir); export_schema(&schema_for!(State), &out_dir); export_schema(&schema_for!(MixNodeBond), &out_dir); diff --git a/contracts/mixnet/src/contract.rs b/contracts/mixnet/src/contract.rs index 1e7b5d1980..0abbc796af 100644 --- a/contracts/mixnet/src/contract.rs +++ b/contracts/mixnet/src/contract.rs @@ -1,15 +1,12 @@ use crate::helpers::calculate_epoch_reward_rate; -use crate::msg::{HandleMsg, InitMsg, MigrateMsg, QueryMsg}; +use crate::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; use crate::state::{State, StateParams}; -use crate::storage::{ - config, gateways, gateways_owners, layer_distribution, mixnodes, mixnodes_owners, -}; +use crate::storage::{config, layer_distribution}; use crate::{error::ContractError, queries, transactions}; use cosmwasm_std::{ - to_binary, Decimal, Deps, DepsMut, Env, HandleResponse, HumanAddr, InitResponse, MessageInfo, - MigrateResponse, QueryResponse, StdResult, Uint128, + entry_point, to_binary, Addr, Decimal, Deps, DepsMut, Env, MessageInfo, QueryResponse, + Response, Uint128, }; -use mixnet_contract::{GatewayBond, MixNodeBond}; pub const INITIAL_DEFAULT_EPOCH_LENGTH: u32 = 2; @@ -30,13 +27,13 @@ const NETWORK_MONITOR_ADDRESS: &str = "hal1v9qauwdq5terag6uvfsdytcs2d0sdmfdq6e83 /// Constant specifying denomination of the coin used for bonding pub const DENOM: &str = "uhal"; -fn default_initial_state(owner: HumanAddr) -> State { +fn default_initial_state(owner: Addr) -> State { let mixnode_bond_reward_rate = Decimal::percent(INITIAL_MIXNODE_BOND_REWARD_RATE); let gateway_bond_reward_rate = Decimal::percent(INITIAL_GATEWAY_BOND_REWARD_RATE); State { owner, - network_monitor_address: NETWORK_MONITOR_ADDRESS.into(), + network_monitor_address: Addr::unchecked(NETWORK_MONITOR_ADDRESS), // we trust our hardcoded value params: StateParams { epoch_length: INITIAL_DEFAULT_EPOCH_LENGTH, minimum_mixnode_bond: INITIAL_MIXNODE_BOND, @@ -61,55 +58,58 @@ fn default_initial_state(owner: HumanAddr) -> State { /// `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. -pub fn init( +#[entry_point] +pub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, - _msg: InitMsg, -) -> Result { + _msg: InstantiateMsg, +) -> Result { let state = default_initial_state(info.sender); config(deps.storage).save(&state)?; layer_distribution(deps.storage).save(&Default::default())?; - Ok(InitResponse::default()) + Ok(Response::default()) } /// Handle an incoming message -pub fn handle( +#[entry_point] +pub fn execute( deps: DepsMut, - env: Env, + _env: Env, info: MessageInfo, - msg: HandleMsg, -) -> Result { + msg: ExecuteMsg, +) -> Result { match msg { - HandleMsg::BondMixnode { mix_node } => transactions::try_add_mixnode(deps, info, mix_node), - HandleMsg::UnbondMixnode {} => transactions::try_remove_mixnode(deps, info, env), - HandleMsg::BondGateway { gateway } => transactions::try_add_gateway(deps, info, gateway), - HandleMsg::UnbondGateway {} => transactions::try_remove_gateway(deps, info, env), - HandleMsg::UpdateStateParams(params) => { + ExecuteMsg::BondMixnode { mix_node } => transactions::try_add_mixnode(deps, info, mix_node), + ExecuteMsg::UnbondMixnode {} => transactions::try_remove_mixnode(deps, info), + ExecuteMsg::BondGateway { gateway } => transactions::try_add_gateway(deps, info, gateway), + ExecuteMsg::UnbondGateway {} => transactions::try_remove_gateway(deps, info), + ExecuteMsg::UpdateStateParams(params) => { transactions::try_update_state_params(deps, info, params) } - HandleMsg::RewardMixnode { identity, uptime } => { + ExecuteMsg::RewardMixnode { identity, uptime } => { transactions::try_reward_mixnode(deps, info, identity, uptime) } - HandleMsg::RewardGateway { identity, uptime } => { + ExecuteMsg::RewardGateway { identity, uptime } => { transactions::try_reward_gateway(deps, info, identity, uptime) } - HandleMsg::DelegateToMixnode { mix_identity } => { + ExecuteMsg::DelegateToMixnode { mix_identity } => { transactions::try_delegate_to_mixnode(deps, info, mix_identity) } - HandleMsg::UndelegateFromMixnode { mix_identity } => { - transactions::try_remove_delegation_from_mixnode(deps, info, env, mix_identity) + ExecuteMsg::UndelegateFromMixnode { mix_identity } => { + transactions::try_remove_delegation_from_mixnode(deps, info, mix_identity) } - HandleMsg::DelegateToGateway { gateway_identity } => { + ExecuteMsg::DelegateToGateway { gateway_identity } => { transactions::try_delegate_to_gateway(deps, info, gateway_identity) } - HandleMsg::UndelegateFromGateway { gateway_identity } => { - transactions::try_remove_delegation_from_gateway(deps, info, env, gateway_identity) + ExecuteMsg::UndelegateFromGateway { gateway_identity } => { + transactions::try_remove_delegation_from_gateway(deps, info, gateway_identity) } } } +#[entry_point] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result { let query_res = match msg { QueryMsg::GetMixNodes { start_after, limit } => { @@ -167,128 +167,27 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result Result { - // Mixnode migration - - // What we do here for mixnodes is the following (the procedure is be identical for gateways): - // 1. Load mixnodes (page by page) using the PREFIX_MIXNODES_OLD - // 2. Save that the same data using PREFIX_MIXNODES, but the data key will be the value.mix_node.identity instead - // 3. Load mixnode owners (page by page) using PREFIX_MIXNODES_OWNERS_OLD - // 4. Save the data in reverse order using PREFIX_MIXNODES_OWNERS such that the key becomes the value and vice versa - - use cosmwasm_std::Order; - use cosmwasm_std::Storage; - use cosmwasm_storage::{bucket, Bucket}; - - // those shouldn't be accessible ANYWHERE outside the migration - const PREFIX_MIXNODES_OLD: &[u8] = b"mixnodes"; - const PREFIX_MIXNODES_OWNERS_OLD: &[u8] = b"mix-owners"; - const PREFIX_GATEWAYS_OLD: &[u8] = b"gateways"; - const PREFIX_GATEWAYS_OWNERS_OLD: &[u8] = b"gateway-owners"; - - fn mixnodes_owners_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_MIXNODES_OWNERS_OLD) - } - - fn gateways_owners_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_GATEWAYS_OWNERS_OLD) - } - - fn mixnodes_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_MIXNODES_OLD) - } - - fn gateways_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_GATEWAYS_OLD) - } - - // go through all stored mixnodes - let bond_page_limit = 100; - loop { - // we have to do it in a paged manner to prevent allocating too much memory - let nodes = mixnodes_old(deps.storage) - .range(None, None, Order::Ascending) - .take(bond_page_limit) - .map(|res| res.map(|item| item.1)) - .collect::>>()?; - - for node in nodes.iter() { - // save bond data under identity key - mixnodes(deps.storage).save(node.identity().as_bytes(), node)?; - - // and remove it from under the old owner key - mixnodes_old(deps.storage).remove(node.owner.as_bytes()); - - // add new mixnodes_owners data under owner key - mixnodes_owners(deps.storage).save(node.owner.as_bytes(), node.identity())?; - - // and remove it from under the old identity key - mixnodes_owners_old(deps.storage).remove(node.identity().as_bytes()) - } - - // this was the last page - if nodes.len() < bond_page_limit { - break; - } - } - - // repeat the procedure for gateways - loop { - // we have to do it in a paged manner to prevent allocating too much memory - let nodes = gateways_old(deps.storage) - .range(None, None, Order::Ascending) - .take(bond_page_limit) - .map(|res| res.map(|item| item.1)) - .collect::>>()?; - - for node in nodes.iter() { - // save bond data under identity key - gateways(deps.storage).save(node.identity().as_bytes(), node)?; - - // and remove it from under the old owner key - gateways_old(deps.storage).remove(node.owner.as_bytes()); - - // add new mixnodes_owners data under owner key - gateways_owners(deps.storage).save(node.owner.as_bytes(), node.identity())?; - - // and remove it from under the old identity key - gateways_owners_old(deps.storage).remove(node.identity().as_bytes()) - } - - // this was the last page - if nodes.len() < bond_page_limit { - break; - } - } - +#[entry_point] +pub fn migrate(_deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { Ok(Default::default()) } #[cfg(test)] pub mod tests { use super::*; - use crate::storage::{ - gateways_owners_read, gateways_read, mixnodes_owners_read, mixnodes_read, - }; - use crate::support::tests::helpers; use crate::support::tests::helpers::*; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; use cosmwasm_std::{coins, from_binary}; - use mixnet_contract::{Gateway, MixNode, PagedResponse}; + use mixnet_contract::PagedResponse; #[test] fn initialize_contract() { let mut deps = mock_dependencies(&[]); let env = mock_env(); - let msg = InitMsg {}; + let msg = InstantiateMsg {}; let info = mock_info("creator", &[]); - let res = init(deps.as_mut(), env.clone(), info, msg).unwrap(); + let res = instantiate(deps.as_mut(), env.clone(), info, msg).unwrap(); assert_eq!(0, res.messages.len()); // mix_node_bonds should be empty after initialization @@ -310,195 +209,4 @@ pub mod tests { query_contract_balance(env.contract.address, deps) ); } - - // TODO: this test will have to be removed once the migration happens and we are working on yet another - // version of the contract - #[test] - fn migration_to_identity_key_based_storage() { - use cosmwasm_std::Storage; - use cosmwasm_storage::{bucket, Bucket}; - - // just some helpers - const PREFIX_MIXNODES_OLD: &[u8] = b"mixnodes"; - const PREFIX_MIXNODES_OWNERS_OLD: &[u8] = b"mix-owners"; - const PREFIX_GATEWAYS_OLD: &[u8] = b"gateways"; - const PREFIX_GATEWAYS_OWNERS_OLD: &[u8] = b"gateway-owners"; - - fn mixnodes_owners_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_MIXNODES_OWNERS_OLD) - } - - fn gateways_owners_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_GATEWAYS_OWNERS_OLD) - } - - fn mixnodes_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_MIXNODES_OLD) - } - - fn gateways_old(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_GATEWAYS_OLD) - } - - let mut deps = helpers::init_contract(); - - // 'simulate' what we're going to start off with, so about 7000-8000 mixnodes and couple of gateways - // NOTE: since the tests are not run inside wasm VM, we don't have to worry about memory allocation limits - // (as long as it's reasonable enough) - let total_mixnodes = 7871; - let total_gateways = 424; - - for mix_i in 0..total_mixnodes { - // make each mixnode have initial_bond + i of tokens to make sure - // it's correctly preserved - let bond_value = INITIAL_MIXNODE_BOND.u128() + mix_i as u128; - - let bond = MixNodeBond { - amount: coins(bond_value, DENOM), - owner: format!("mix-owner{}", mix_i).into(), - mix_node: MixNode { - host: format!("host{}", mix_i), - layer: mix_i % 3 + 1, - location: format!("location{}", mix_i), - sphinx_key: format!("sphinx{}", mix_i), - identity_key: format!("identity{}", mix_i), - version: format!("version{}", mix_i), - }, - }; - - mixnodes_old(&mut deps.storage) - .save(bond.owner.as_bytes(), &bond) - .unwrap(); - mixnodes_owners_old(&mut deps.storage) - .save(bond.identity().as_bytes(), bond.owner()) - .unwrap(); - } - - for gate_i in 0..total_gateways { - // make each gateway have initial_bond + i of tokens to make sure - // it's correctly preserved - let bond_value = INITIAL_GATEWAY_BOND.u128() + gate_i as u128; - - let bond = GatewayBond { - amount: coins(bond_value, DENOM), - owner: format!("gateway-owner{}", gate_i).into(), - gateway: Gateway { - mix_host: format!("mixhost{}", gate_i), - clients_host: format!("clientshost{}", gate_i), - location: format!("location{}", gate_i), - sphinx_key: format!("sphinx{}", gate_i), - identity_key: format!("identity{}", gate_i), - version: format!("version{}", gate_i), - }, - }; - - gateways_old(&mut deps.storage) - .save(bond.owner.as_bytes(), &bond) - .unwrap(); - gateways_owners_old(&mut deps.storage) - .save(bond.identity().as_bytes(), bond.owner()) - .unwrap(); - } - - // perform migration - assert!(migrate( - deps.as_mut(), - mock_env(), - mock_info("sender", &[]), - MigrateMsg {} - ) - .is_ok()); - - // make sure all data under old keys is purged - for mix_i in 0..total_mixnodes { - let owner = format!("mix-owner{}", mix_i); - let identity = format!("identity{}", mix_i); - assert!(mixnodes_old(&mut deps.storage) - .may_load(owner.as_bytes()) - .unwrap() - .is_none()); - assert!(mixnodes_owners_old(&mut deps.storage) - .may_load(identity.as_bytes()) - .unwrap() - .is_none()); - } - - for gate_i in 0..total_gateways { - let owner = format!("gateway-owner{}", gate_i); - let identity = format!("identity{}", gate_i); - assert!(gateways_old(&mut deps.storage) - .may_load(owner.as_bytes()) - .unwrap() - .is_none()); - assert!(gateways_owners_old(&mut deps.storage) - .may_load(identity.as_bytes()) - .unwrap() - .is_none()); - } - - // and make sure it exists under new keys now - for mix_i in 0..total_mixnodes { - let owner = format!("mix-owner{}", mix_i); - let identity = format!("identity{}", mix_i); - - let expected_bond_value = INITIAL_MIXNODE_BOND.u128() + mix_i as u128; - let expected_bond = MixNodeBond { - amount: coins(expected_bond_value, DENOM), - owner: format!("mix-owner{}", mix_i).into(), - mix_node: MixNode { - host: format!("host{}", mix_i), - layer: mix_i % 3 + 1, - location: format!("location{}", mix_i), - sphinx_key: format!("sphinx{}", mix_i), - identity_key: format!("identity{}", mix_i), - version: format!("version{}", mix_i), - }, - }; - - assert_eq!( - expected_bond, - mixnodes_read(&deps.storage) - .load(identity.as_bytes()) - .unwrap() - ); - assert_eq!( - identity, - mixnodes_owners_read(&deps.storage) - .load(owner.as_bytes()) - .unwrap() - ); - } - - for gate_i in 0..total_gateways { - let owner = format!("gateway-owner{}", gate_i); - let identity = format!("identity{}", gate_i); - - let expected_bond_value = INITIAL_GATEWAY_BOND.u128() + gate_i as u128; - let expected_bond = GatewayBond { - amount: coins(expected_bond_value, DENOM), - owner: format!("gateway-owner{}", gate_i).into(), - gateway: Gateway { - mix_host: format!("mixhost{}", gate_i), - clients_host: format!("clientshost{}", gate_i), - location: format!("location{}", gate_i), - sphinx_key: format!("sphinx{}", gate_i), - identity_key: format!("identity{}", gate_i), - version: format!("version{}", gate_i), - }, - }; - - assert_eq!( - expected_bond, - gateways_read(&deps.storage) - .load(identity.as_bytes()) - .unwrap() - ); - assert_eq!( - identity, - gateways_owners_read(&deps.storage) - .load(owner.as_bytes()) - .unwrap() - ); - } - } } diff --git a/contracts/mixnet/src/error.rs b/contracts/mixnet/src/error.rs index 84e670052f..7b3a3a21f2 100644 --- a/contracts/mixnet/src/error.rs +++ b/contracts/mixnet/src/error.rs @@ -1,5 +1,5 @@ use crate::contract::DENOM; -use cosmwasm_std::{HumanAddr, StdError}; +use cosmwasm_std::{Addr, StdError}; use mixnet_contract::IdentityKey; use thiserror::Error; @@ -25,10 +25,10 @@ pub enum ContractError { GatewayBondNotFound { identity: IdentityKey }, #[error("{owner} does not seem to own any mixnodes")] - NoAssociatedMixNodeBond { owner: HumanAddr }, + NoAssociatedMixNodeBond { owner: Addr }, #[error("{owner} does not seem to own any gateways")] - NoAssociatedGatewayBond { owner: HumanAddr }, + NoAssociatedGatewayBond { owner: Addr }, #[error("Unauthorized")] Unauthorized, @@ -58,26 +58,26 @@ pub enum ContractError { AlreadyOwnsGateway, #[error("Mixnode with this identity already exists. Its owner is {owner}")] - DuplicateMixnode { owner: HumanAddr }, + DuplicateMixnode { owner: Addr }, #[error("Gateway with this identity already exists. Its owner is {owner}")] - DuplicateGateway { owner: HumanAddr }, + DuplicateGateway { owner: Addr }, #[error("No funds were provided for the delegation")] EmptyDelegation, #[error("Request did not come from the node owner ({owner})")] - InvalidSender { owner: HumanAddr }, + InvalidSender { owner: Addr }, #[error("Could not find any delegation information associated with mixnode {identity} for {address}")] NoMixnodeDelegationFound { identity: IdentityKey, - address: HumanAddr, + address: Addr, }, #[error("Could not find any delegation information associated with gateway {identity} for {address}")] NoGatewayDelegationFound { identity: IdentityKey, - address: HumanAddr, + address: Addr, }, } diff --git a/contracts/mixnet/src/helpers.rs b/contracts/mixnet/src/helpers.rs index 5fbc245e53..cfac69dacb 100644 --- a/contracts/mixnet/src/helpers.rs +++ b/contracts/mixnet/src/helpers.rs @@ -14,6 +14,7 @@ use crate::error::ContractError; use cosmwasm_std::{Decimal, Uint128}; +use std::ops::Sub; // for time being completely ignore concept of a leap year and assume each year is exactly 365 days // i.e. 8760 hours @@ -21,15 +22,6 @@ const HOURS_IN_YEAR: u128 = 8760; const DECIMAL_FRACTIONAL: Uint128 = Uint128(1_000_000_000_000_000_000u128); -// calculates value - 1 -fn decimal_sub_one(value: Decimal) -> Decimal { - assert!(value >= Decimal::one()); - - let value_uint128 = value * DECIMAL_FRACTIONAL; - let uint128_sub_one = (value_uint128 - DECIMAL_FRACTIONAL).unwrap(); - Decimal::from_ratio(uint128_sub_one, DECIMAL_FRACTIONAL) -} - fn decimal_to_uint128(value: Decimal) -> Uint128 { value * DECIMAL_FRACTIONAL } @@ -47,7 +39,7 @@ pub(crate) fn calculate_epoch_reward_rate( debug_assert!(annual_reward_rate >= Decimal::one()); // converts reward rate, like 1.25 into the expected gain, like 0.25 - let annual_reward = decimal_sub_one(annual_reward_rate); + let annual_reward = annual_reward_rate.sub(Decimal::one()); // do a simple cross-multiplication: // `annual_reward` - `HOURS_IN_YEAR` // x - `epoch_length` @@ -98,7 +90,7 @@ mod tests { // the reward rate should be unchanged let per_epoch_rate = calculate_epoch_reward_rate(HOURS_IN_YEAR as u32, annual_reward_rate); // 0.10 - let expected = decimal_sub_one(annual_reward_rate); + let expected = annual_reward_rate.sub(Decimal::one()); assert_eq!(expected, per_epoch_rate); // 24 hours diff --git a/contracts/mixnet/src/lib.rs b/contracts/mixnet/src/lib.rs index 92c4113eeb..b9ebdc473a 100644 --- a/contracts/mixnet/src/lib.rs +++ b/contracts/mixnet/src/lib.rs @@ -7,6 +7,3 @@ pub mod state; pub(crate) mod storage; pub mod support; pub mod transactions; - -#[cfg(target_arch = "wasm32")] -cosmwasm_std::create_entry_points_with_migration!(contract); diff --git a/contracts/mixnet/src/msg.rs b/contracts/mixnet/src/msg.rs index fee4e11932..a7a63b249a 100644 --- a/contracts/mixnet/src/msg.rs +++ b/contracts/mixnet/src/msg.rs @@ -1,15 +1,15 @@ use crate::state::StateParams; -use cosmwasm_std::HumanAddr; +use cosmwasm_std::Addr; use mixnet_contract::{Gateway, IdentityKey, MixNode}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct InitMsg {} +pub struct InstantiateMsg {} #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] -pub enum HandleMsg { +pub enum ExecuteMsg { BondMixnode { mix_node: MixNode, }, @@ -61,29 +61,29 @@ pub enum QueryMsg { limit: Option, }, OwnsMixnode { - address: HumanAddr, + address: Addr, }, OwnsGateway { - address: HumanAddr, + address: Addr, }, StateParams {}, GetMixDelegations { mix_identity: IdentityKey, - start_after: Option, + start_after: Option, limit: Option, }, GetMixDelegation { mix_identity: IdentityKey, - address: HumanAddr, + address: Addr, }, GetGatewayDelegations { gateway_identity: IdentityKey, - start_after: Option, + start_after: Option, limit: Option, }, GetGatewayDelegation { gateway_identity: IdentityKey, - address: HumanAddr, + address: Addr, }, LayerDistribution {}, } diff --git a/contracts/mixnet/src/queries.rs b/contracts/mixnet/src/queries.rs index 1d5fe0bec2..2ff1ad6682 100644 --- a/contracts/mixnet/src/queries.rs +++ b/contracts/mixnet/src/queries.rs @@ -8,13 +8,12 @@ use crate::storage::{ use cosmwasm_std::Deps; use cosmwasm_std::Order; use cosmwasm_std::StdResult; -use cosmwasm_std::{coin, HumanAddr}; +use cosmwasm_std::{coin, Addr}; use mixnet_contract::{ Delegation, GatewayBond, GatewayOwnershipResponse, IdentityKey, LayerDistribution, MixNodeBond, MixOwnershipResponse, PagedGatewayDelegationsResponse, PagedGatewayResponse, PagedMixDelegationsResponse, PagedResponse, }; -use std::ops::Deref; const BOND_PAGE_MAX_LIMIT: u32 = 100; const BOND_PAGE_DEFAULT_LIMIT: u32 = 50; @@ -65,22 +64,16 @@ pub(crate) fn query_gateways_paged( Ok(PagedGatewayResponse::new(nodes, limit, start_next_after)) } -pub(crate) fn query_owns_mixnode( - deps: Deps, - address: HumanAddr, -) -> StdResult { +pub(crate) fn query_owns_mixnode(deps: Deps, address: Addr) -> StdResult { let has_node = mixnodes_owners_read(deps.storage) - .may_load(address.as_ref())? + .may_load(address.as_bytes())? .is_some(); Ok(MixOwnershipResponse { address, has_node }) } -pub(crate) fn query_owns_gateway( - deps: Deps, - address: HumanAddr, -) -> StdResult { +pub(crate) fn query_owns_gateway(deps: Deps, address: Addr) -> StdResult { let has_gateway = gateways_owners_read(deps.storage) - .may_load(address.as_ref())? + .may_load(address.as_bytes())? .is_some(); Ok(GatewayOwnershipResponse { address, @@ -98,10 +91,11 @@ pub(crate) fn query_layer_distribution(deps: Deps) -> LayerDistribution { /// Adds a 0 byte to terminate the `start_after` value given. This allows CosmWasm /// to get the succeeding key as the start of the next page. -// S works for both `String` and `HumanAddr` and that's what we wanted -fn calculate_start_value>(start_after: Option) -> Option> { +// S works for both `String` and `Addr` and that's what we wanted +fn calculate_start_value>(start_after: Option) -> Option> { start_after.as_ref().map(|identity| { identity + .as_ref() .as_bytes() .iter() .cloned() @@ -113,7 +107,7 @@ fn calculate_start_value>(start_after: Option) -> Opti pub(crate) fn query_mixnode_delegations_paged( deps: Deps, mix_identity: IdentityKey, - start_after: Option, + start_after: Option, limit: Option, ) -> StdResult { let limit = limit @@ -127,7 +121,7 @@ pub(crate) fn query_mixnode_delegations_paged( .map(|res| { res.map(|entry| { Delegation::new( - HumanAddr(String::from_utf8(entry.0).unwrap()), + Addr::unchecked(String::from_utf8(entry.0).unwrap()), coin(entry.1.u128(), DENOM), ) }) @@ -147,7 +141,7 @@ pub(crate) fn query_mixnode_delegations_paged( pub(crate) fn query_mixnode_delegation( deps: Deps, mix_identity: IdentityKey, - address: HumanAddr, + address: Addr, ) -> Result { match mix_delegations_read(deps.storage, &mix_identity).may_load(address.as_bytes())? { Some(delegation_value) => Ok(Delegation::new( @@ -164,7 +158,7 @@ pub(crate) fn query_mixnode_delegation( pub(crate) fn query_gateway_delegations_paged( deps: Deps, gateway_identity: IdentityKey, - start_after: Option, + start_after: Option, limit: Option, ) -> StdResult { let limit = limit @@ -178,7 +172,7 @@ pub(crate) fn query_gateway_delegations_paged( .map(|res| { res.map(|entry| { Delegation::new( - HumanAddr(String::from_utf8(entry.0).unwrap()), + Addr::unchecked(String::from_utf8(entry.0).unwrap()), coin(entry.1.u128(), DENOM), ) }) @@ -198,7 +192,7 @@ pub(crate) fn query_gateway_delegations_paged( pub(crate) fn query_gateway_delegation( deps: Deps, gateway_identity: IdentityKey, - address: HumanAddr, + address: Addr, ) -> Result { match gateway_delegations_read(deps.storage, &gateway_identity).may_load(address.as_bytes())? { Some(delegation_value) => Ok(Delegation::new( @@ -220,8 +214,8 @@ mod tests { use crate::support::tests::helpers; use crate::support::tests::helpers::{good_gateway_bond, good_mixnode_bond}; use crate::transactions; - use cosmwasm_std::testing::{mock_env, mock_info}; - use cosmwasm_std::{Storage, Uint128}; + use cosmwasm_std::testing::mock_info; + use cosmwasm_std::{Addr, Storage, Uint128}; use mixnet_contract::{Gateway, MixNode}; #[test] @@ -284,10 +278,15 @@ mod tests { #[test] fn pagination_works() { + let addr1 = "hal100"; + let addr2 = "hal101"; + let addr3 = "hal102"; + let addr4 = "hal103"; + let mut deps = helpers::init_contract(); let node = helpers::mixnode_bond_fixture(); mixnodes(&mut deps.storage) - .save("1".as_bytes(), &node) + .save(addr1.as_bytes(), &node) .unwrap(); let per_page = 2; @@ -298,7 +297,7 @@ mod tests { // save another mixnodes(&mut deps.storage) - .save("2".as_bytes(), &node) + .save(addr2.as_bytes(), &node) .unwrap(); // page1 should have 2 results on it @@ -306,7 +305,7 @@ mod tests { assert_eq!(2, page1.nodes.len()); mixnodes(&mut deps.storage) - .save("3".as_bytes(), &node) + .save(addr3.as_bytes(), &node) .unwrap(); // page1 still has 2 results @@ -314,7 +313,7 @@ mod tests { assert_eq!(2, page1.nodes.len()); // retrieving the next page should start after the last key on this page - let start_after = String::from("2"); + let start_after = String::from(addr2); let page2 = query_mixnodes_paged( deps.as_ref(), Option::from(start_after), @@ -326,10 +325,10 @@ mod tests { // save another one mixnodes(&mut deps.storage) - .save("4".as_bytes(), &node) + .save(addr4.as_bytes(), &node) .unwrap(); - let start_after = String::from("2"); + let start_after = String::from(addr2); let page2 = query_mixnodes_paged( deps.as_ref(), Option::from(start_after), @@ -396,10 +395,15 @@ mod tests { #[test] fn gateway_pagination_works() { + let addr1 = "hal100"; + let addr2 = "hal101"; + let addr3 = "hal102"; + let addr4 = "hal103"; + let mut deps = helpers::init_contract(); let node = helpers::gateway_bond_fixture(); gateways(&mut deps.storage) - .save("1".as_bytes(), &node) + .save(addr1.as_bytes(), &node) .unwrap(); let per_page = 2; @@ -410,7 +414,7 @@ mod tests { // save another gateways(&mut deps.storage) - .save("2".as_bytes(), &node) + .save(addr2.as_bytes(), &node) .unwrap(); // page1 should have 2 results on it @@ -418,7 +422,7 @@ mod tests { assert_eq!(2, page1.nodes.len()); gateways(&mut deps.storage) - .save("3".as_bytes(), &node) + .save(addr3.as_bytes(), &node) .unwrap(); // page1 still has 2 results @@ -426,7 +430,7 @@ mod tests { assert_eq!(2, page1.nodes.len()); // retrieving the next page should start after the last key on this page - let start_after = String::from("2"); + let start_after = String::from(addr2); let page2 = query_gateways_paged( deps.as_ref(), Option::from(start_after), @@ -438,10 +442,10 @@ mod tests { // save another one gateways(&mut deps.storage) - .save("4".as_bytes(), &node) + .save(addr4.as_bytes(), &node) .unwrap(); - let start_after = String::from("2"); + let start_after = String::from(addr2); let page2 = query_gateways_paged( deps.as_ref(), Option::from(start_after), @@ -456,10 +460,9 @@ mod tests { #[test] fn query_for_mixnode_owner_works() { let mut deps = helpers::init_contract(); - let env = mock_env(); // "fred" does not own a mixnode if there are no mixnodes - let res = query_owns_mixnode(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_mixnode(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(!res.has_node); // mixnode was added to "bob", "fred" still does not own one @@ -470,7 +473,7 @@ mod tests { transactions::try_add_mixnode(deps.as_mut(), mock_info("bob", &good_mixnode_bond()), node) .unwrap(); - let res = query_owns_mixnode(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_mixnode(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(!res.has_node); // "fred" now owns a mixnode! @@ -481,23 +484,22 @@ mod tests { transactions::try_add_mixnode(deps.as_mut(), mock_info("fred", &good_mixnode_bond()), node) .unwrap(); - let res = query_owns_mixnode(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_mixnode(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(res.has_node); // but after unbonding it, he doesn't own one anymore - transactions::try_remove_mixnode(deps.as_mut(), mock_info("fred", &[]), env).unwrap(); + transactions::try_remove_mixnode(deps.as_mut(), mock_info("fred", &[])).unwrap(); - let res = query_owns_mixnode(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_mixnode(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(!res.has_node); } #[test] fn query_for_gateway_owner_works() { let mut deps = helpers::init_contract(); - let env = mock_env(); // "fred" does not own a mixnode if there are no mixnodes - let res = query_owns_gateway(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_gateway(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(!res.has_gateway); // mixnode was added to "bob", "fred" still does not own one @@ -508,7 +510,7 @@ mod tests { transactions::try_add_gateway(deps.as_mut(), mock_info("bob", &good_gateway_bond()), node) .unwrap(); - let res = query_owns_gateway(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_gateway(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(!res.has_gateway); // "fred" now owns a gateway! @@ -519,13 +521,13 @@ mod tests { transactions::try_add_gateway(deps.as_mut(), mock_info("fred", &good_gateway_bond()), node) .unwrap(); - let res = query_owns_gateway(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_gateway(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(res.has_gateway); // but after unbonding it, he doesn't own one anymore - transactions::try_remove_gateway(deps.as_mut(), mock_info("fred", &[]), env).unwrap(); + transactions::try_remove_gateway(deps.as_mut(), mock_info("fred", &[])).unwrap(); - let res = query_owns_gateway(deps.as_ref(), "fred".into()).unwrap(); + let res = query_owns_gateway(deps.as_ref(), Addr::unchecked("fred")).unwrap(); assert!(!res.has_gateway); } @@ -534,8 +536,8 @@ mod tests { let mut deps = helpers::init_contract(); let dummy_state = State { - owner: "someowner".into(), - network_monitor_address: "monitor".into(), + owner: Addr::unchecked("someowner"), + network_monitor_address: Addr::unchecked("monitor"), params: StateParams { epoch_length: 1, minimum_mixnode_bond: 123u128.into(), @@ -559,7 +561,7 @@ mod tests { use crate::storage::mix_delegations; use cosmwasm_std::Uint128; - fn store_n_delegations(n: u32, storage: &mut dyn Storage, node_identity: &str) { + fn store_n_delegations(n: u32, storage: &mut dyn Storage, node_identity: &IdentityKey) { for i in 0..n { let address = format!("address{}", i); mix_delegations(storage, node_identity) @@ -680,7 +682,7 @@ mod tests { assert_eq!(2, page1.delegations.len()); // retrieving the next page should start after the last key on this page - let start_after = HumanAddr::from("2"); + let start_after = Addr::unchecked("2"); let page2 = query_mixnode_delegations_paged( deps.as_ref(), node_identity.clone(), @@ -696,7 +698,7 @@ mod tests { .save("4".as_bytes(), &Uint128(42)) .unwrap(); - let start_after = HumanAddr::from("2"); + let start_after = Addr::unchecked("2"); let page2 = query_mixnode_delegations_paged( deps.as_ref(), node_identity, @@ -714,7 +716,7 @@ mod tests { fn mix_deletion_query_returns_current_delegation_value() { let mut deps = helpers::init_contract(); let node_identity: IdentityKey = "foo".into(); - let delegation_owner: HumanAddr = "bar".into(); + let delegation_owner = Addr::unchecked("bar"); mix_delegations(&mut deps.storage, &node_identity) .save(delegation_owner.as_bytes(), &Uint128(42)) @@ -732,8 +734,8 @@ mod tests { let node_identity1: IdentityKey = "foo1".into(); let node_identity2: IdentityKey = "foo2".into(); - let delegation_owner1: HumanAddr = "bar".into(); - let delegation_owner2: HumanAddr = "bar2".into(); + let delegation_owner1 = Addr::unchecked("bar"); + let delegation_owner2 = Addr::unchecked("bar2"); assert_eq!( Err(ContractError::NoMixnodeDelegationFound { @@ -784,7 +786,7 @@ mod tests { use crate::storage::gateway_delegations; use cosmwasm_std::Uint128; - fn store_n_delegations(n: u32, storage: &mut dyn Storage, node_identity: &str) { + fn store_n_delegations(n: u32, storage: &mut dyn Storage, node_identity: &IdentityKey) { for i in 0..n { let address = format!("address{}", i); gateway_delegations(storage, node_identity) @@ -905,7 +907,7 @@ mod tests { assert_eq!(2, page1.delegations.len()); // retrieving the next page should start after the last key on this page - let start_after = HumanAddr::from("2"); + let start_after = Addr::unchecked("2"); let page2 = query_gateway_delegations_paged( deps.as_ref(), node_identity.clone(), @@ -921,7 +923,7 @@ mod tests { .save("4".as_bytes(), &Uint128(42)) .unwrap(); - let start_after = HumanAddr::from("2"); + let start_after = Addr::unchecked("2"); let page2 = query_gateway_delegations_paged( deps.as_ref(), node_identity, @@ -939,7 +941,7 @@ mod tests { fn gateway_deletion_query_returns_current_delegation_value() { let mut deps = helpers::init_contract(); let node_identity: IdentityKey = "foo".into(); - let delegation_owner: HumanAddr = "bar".into(); + let delegation_owner = Addr::unchecked("bar"); gateway_delegations(&mut deps.storage, &node_identity) .save(delegation_owner.as_bytes(), &Uint128(42)) @@ -957,8 +959,8 @@ mod tests { let node_identity1: IdentityKey = "foo1".into(); let node_identity2: IdentityKey = "foo2".into(); - let delegation_owner1: HumanAddr = "bar".into(); - let delegation_owner2: HumanAddr = "bar2".into(); + let delegation_owner1 = Addr::unchecked("bar"); + let delegation_owner2 = Addr::unchecked("bar2"); assert_eq!( Err(ContractError::NoGatewayDelegationFound { diff --git a/contracts/mixnet/src/state.rs b/contracts/mixnet/src/state.rs index ece82842d0..90e0124258 100644 --- a/contracts/mixnet/src/state.rs +++ b/contracts/mixnet/src/state.rs @@ -1,11 +1,11 @@ -use cosmwasm_std::{Decimal, HumanAddr, Uint128}; +use cosmwasm_std::{Addr, Decimal, Uint128}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct State { - pub owner: HumanAddr, // only the owner account can update state - pub network_monitor_address: HumanAddr, + pub owner: Addr, // only the owner account can update state + pub network_monitor_address: Addr, pub params: StateParams, // helper values to avoid having to recalculate them on every single payment operation diff --git a/contracts/mixnet/src/storage.rs b/contracts/mixnet/src/storage.rs index 0eb200f646..a2ee80285d 100644 --- a/contracts/mixnet/src/storage.rs +++ b/contracts/mixnet/src/storage.rs @@ -5,7 +5,7 @@ use cosmwasm_storage::{ bucket, bucket_read, singleton, singleton_read, Bucket, ReadonlyBucket, ReadonlySingleton, Singleton, }; -use mixnet_contract::{GatewayBond, IdentityKey, LayerDistribution, MixNodeBond}; +use mixnet_contract::{GatewayBond, IdentityKey, IdentityKeyRef, LayerDistribution, MixNodeBond}; // storage prefixes // all of them must be unique and presumably not be a prefix of a different one @@ -180,7 +180,7 @@ pub(crate) fn increase_mixnode_bond( pub(crate) fn increase_mix_delegated_stakes( storage: &mut dyn Storage, - mix_identity: &str, + mix_identity: IdentityKey, scaled_reward_rate: Decimal, ) -> StdResult<()> { let chunk_size = queries::DELEGATION_PAGE_MAX_LIMIT as usize; @@ -188,7 +188,7 @@ pub(crate) fn increase_mix_delegated_stakes( let mut chunk_start: Option> = None; loop { // get `chunk_size` of delegations - let delegations_chunk = mix_delegations_read(storage, mix_identity) + let delegations_chunk = mix_delegations_read(storage, &mix_identity) .range(chunk_start.as_deref(), None, Order::Ascending) .take(chunk_size) .collect::>>()?; @@ -213,7 +213,7 @@ pub(crate) fn increase_mix_delegated_stakes( for (delegator_address, amount) in delegations_chunk.into_iter() { let reward = amount * scaled_reward_rate; let new_amount = amount + reward; - mix_delegations(storage, mix_identity).save(&delegator_address, &new_amount)?; + mix_delegations(storage, &mix_identity).save(&delegator_address, &new_amount)?; } } @@ -222,7 +222,7 @@ pub(crate) fn increase_mix_delegated_stakes( pub(crate) fn increase_gateway_delegated_stakes( storage: &mut dyn Storage, - gateway_identity: &str, + gateway_identity: IdentityKey, scaled_reward_rate: Decimal, ) -> StdResult<()> { let chunk_size = queries::DELEGATION_PAGE_MAX_LIMIT as usize; @@ -230,7 +230,7 @@ pub(crate) fn increase_gateway_delegated_stakes( let mut chunk_start: Option> = None; loop { // get `chunk_size` of delegations - let delegations_chunk = gateway_delegations_read(storage, gateway_identity) + let delegations_chunk = gateway_delegations_read(storage, &gateway_identity) .range(chunk_start.as_deref(), None, Order::Ascending) .take(chunk_size) .collect::>>()?; @@ -255,7 +255,8 @@ pub(crate) fn increase_gateway_delegated_stakes( for (delegator_address, amount) in delegations_chunk.into_iter() { let reward = amount * scaled_reward_rate; let new_amount = amount + reward; - gateway_delegations(storage, gateway_identity).save(&delegator_address, &new_amount)?; + gateway_delegations(storage, &gateway_identity) + .save(&delegator_address, &new_amount)?; } } @@ -316,21 +317,21 @@ pub(crate) fn increase_gateway_bond( // delegation related pub fn mix_delegations<'a>( storage: &'a mut dyn Storage, - mix_identity: &'a str, + mix_identity: IdentityKeyRef, ) -> Bucket<'a, Uint128> { Bucket::multilevel(storage, &[PREFIX_MIX_DELEGATION, mix_identity.as_bytes()]) } pub fn mix_delegations_read<'a>( storage: &'a dyn Storage, - mix_identity: &'a str, + mix_identity: IdentityKeyRef, ) -> ReadonlyBucket<'a, Uint128> { ReadonlyBucket::multilevel(storage, &[PREFIX_MIX_DELEGATION, mix_identity.as_bytes()]) } pub fn gateway_delegations<'a>( storage: &'a mut dyn Storage, - gateway_identity: &'a str, + gateway_identity: IdentityKeyRef, ) -> Bucket<'a, Uint128> { Bucket::multilevel( storage, @@ -340,7 +341,7 @@ pub fn gateway_delegations<'a>( pub fn gateway_delegations_read<'a>( storage: &'a dyn Storage, - gateway_identity: &'a str, + gateway_identity: IdentityKeyRef, ) -> ReadonlyBucket<'a, Uint128> { ReadonlyBucket::multilevel( storage, @@ -363,344 +364,379 @@ pub(crate) fn read_gateway_bond( } Ok(node.amount[0].amount) } -// -// #[cfg(test)] -// mod tests { -// use super::*; -// use crate::contract::DENOM; -// use crate::support::tests::helpers::{ -// gateway_bond_fixture, gateway_fixture, mix_node_fixture, mixnode_bond_fixture, -// }; -// use cosmwasm_std::testing::MockStorage; -// use cosmwasm_std::{coins, Uint128}; -// -// #[test] -// fn mixnode_single_read_retrieval() { -// let mut storage = MockStorage::new(); -// let bond1 = mixnode_bond_fixture(); -// let bond2 = mixnode_bond_fixture(); -// mixnodes(&mut storage).save(b"bond1", &bond1).unwrap(); -// mixnodes(&mut storage).save(b"bond2", &bond2).unwrap(); -// -// let res1 = mixnodes_read(&storage).load(b"bond1").unwrap(); -// let res2 = mixnodes_read(&storage).load(b"bond2").unwrap(); -// assert_eq!(bond1, res1); -// assert_eq!(bond2, res2); -// } -// -// #[test] -// fn gateway_single_read_retrieval() { -// let mut storage = MockStorage::new(); -// let bond1 = gateway_bond_fixture(); -// let bond2 = gateway_bond_fixture(); -// gateways(&mut storage).save(b"bond1", &bond1).unwrap(); -// gateways(&mut storage).save(b"bond2", &bond2).unwrap(); -// -// let res1 = gateways_read(&storage).load(b"bond1").unwrap(); -// let res2 = gateways_read(&storage).load(b"bond2").unwrap(); -// assert_eq!(bond1, res1); -// assert_eq!(bond2, res2); -// } -// -// #[test] -// fn increasing_mixnode_bond() { -// let mut storage = MockStorage::new(); -// let node_owner = b"owner"; -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// // increases the reward appropriately -// let mixnode_bond = MixNodeBond { -// amount: coins(1000, DENOM), -// owner: std::str::from_utf8(node_owner).unwrap().into(), -// mix_node: mix_node_fixture(), -// }; -// -// mixnodes(&mut storage) -// .save(node_owner, &mixnode_bond) -// .unwrap(); -// -// increase_mixnode_bond(&mut storage, mixnode_bond, reward).unwrap(); -// let new_bond = read_mixnode_bond(&storage, node_owner).unwrap(); -// assert_eq!(Uint128(1001), new_bond); -// } -// -// #[test] -// fn reading_mixnode_bond() { -// let mut storage = MockStorage::new(); -// let node_owner = b"owner"; -// -// // produces an error if target mixnode doesn't exist -// let res = read_mixnode_bond(&storage, node_owner); -// assert!(res.is_err()); -// -// // returns appropriate value otherwise -// let bond_value = 1000; -// -// let mixnode_bond = MixNodeBond { -// amount: coins(bond_value, DENOM), -// owner: std::str::from_utf8(node_owner).unwrap().into(), -// mix_node: mix_node_fixture(), -// }; -// -// mixnodes(&mut storage) -// .save(node_owner, &mixnode_bond) -// .unwrap(); -// -// assert_eq!( -// Uint128(bond_value), -// read_mixnode_bond(&storage, node_owner).unwrap() -// ); -// } -// -// #[test] -// fn increasing_gateway_bond() { -// let mut storage = MockStorage::new(); -// let node_owner = b"owner"; -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// // increases the reward appropriately -// let gateway_bond = GatewayBond { -// amount: coins(1000, DENOM), -// owner: std::str::from_utf8(node_owner).unwrap().into(), -// gateway: gateway_fixture(), -// }; -// -// gateways(&mut storage) -// .save(node_owner, &gateway_bond) -// .unwrap(); -// -// increase_gateway_bond(&mut storage, gateway_bond, reward).unwrap(); -// let new_bond = read_gateway_bond(&storage, node_owner).unwrap(); -// assert_eq!(Uint128(1001), new_bond); -// } -// -// #[test] -// fn reading_gateway_bond() { -// let mut storage = MockStorage::new(); -// let node_owner = b"owner"; -// -// // produces an error if target mixnode doesn't exist -// let res = read_gateway_bond(&storage, node_owner); -// assert!(res.is_err()); -// -// // returns appropriate value otherwise -// let bond_value = 1000; -// -// let gateway_bond = GatewayBond { -// amount: coins(1000, DENOM), -// owner: std::str::from_utf8(node_owner).unwrap().into(), -// gateway: gateway_fixture(), -// }; -// -// gateways(&mut storage) -// .save(node_owner, &gateway_bond) -// .unwrap(); -// -// assert_eq!( -// Uint128(bond_value), -// read_gateway_bond(&storage, node_owner).unwrap() -// ); -// } -// -// #[cfg(test)] -// mod increasing_mix_delegated_stakes { -// use super::*; -// use crate::queries::query_mixnode_delegations_paged; -// use cosmwasm_std::testing::mock_dependencies; -// -// #[test] -// fn when_there_are_no_delegations() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// increase_mix_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// -// // there are no 'new' delegations magically added -// assert!( -// query_mixnode_delegations_paged(deps.as_ref(), node_owner, None, None) -// .unwrap() -// .delegations -// .is_empty() -// ) -// } -// -// #[test] -// fn when_there_is_a_single_delegation() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// let delegator_address = HumanAddr::from("bob"); -// mix_delegations(&mut deps.storage, &node_owner) -// .save(delegator_address.as_bytes(), &Uint128(1000)) -// .unwrap(); -// -// increase_mix_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// assert_eq!( -// Uint128(1001), -// mix_delegations_read(&mut deps.storage, &node_owner) -// .load(delegator_address.as_bytes()) -// .unwrap() -// ) -// } -// -// #[test] -// fn when_there_are_multiple_delegations() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// for i in 0..100 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// mix_delegations(&mut deps.storage, &node_owner) -// .save(delegator_address.as_bytes(), &Uint128(1000)) -// .unwrap(); -// } -// -// increase_mix_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// -// for i in 0..100 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// assert_eq!( -// Uint128(1001), -// mix_delegations_read(&mut deps.storage, &node_owner) -// .load(delegator_address.as_bytes()) -// .unwrap() -// ) -// } -// } -// -// #[test] -// fn when_there_are_more_delegations_than_page_size() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// mix_delegations(&mut deps.storage, &node_owner) -// .save(delegator_address.as_bytes(), &Uint128(1000)) -// .unwrap(); -// } -// -// increase_mix_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// -// for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// assert_eq!( -// Uint128(1001), -// mix_delegations_read(&mut deps.storage, &node_owner) -// .load(delegator_address.as_bytes()) -// .unwrap() -// ) -// } -// } -// } -// -// #[cfg(test)] -// mod increasing_gateway_delegated_stakes { -// use super::*; -// use crate::queries::query_gateway_delegations_paged; -// use cosmwasm_std::testing::mock_dependencies; -// -// #[test] -// fn when_there_are_no_delegations() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// increase_gateway_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// -// // there are no 'new' delegations magically added -// assert!( -// query_gateway_delegations_paged(deps.as_ref(), node_owner, None, None) -// .unwrap() -// .delegations -// .is_empty() -// ) -// } -// -// #[test] -// fn when_there_is_a_single_delegation() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// let delegator_address = HumanAddr::from("bob"); -// gateway_delegations(&mut deps.storage, &node_owner) -// .save(delegator_address.as_bytes(), &Uint128(1000)) -// .unwrap(); -// -// increase_gateway_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// assert_eq!( -// Uint128(1001), -// gateway_delegations_read(&mut deps.storage, &node_owner) -// .load(delegator_address.as_bytes()) -// .unwrap() -// ) -// } -// -// #[test] -// fn when_there_are_multiple_delegations() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// for i in 0..100 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// gateway_delegations(&mut deps.storage, &node_owner) -// .save(delegator_address.as_bytes(), &Uint128(1000)) -// .unwrap(); -// } -// -// increase_gateway_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// -// for i in 0..100 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// assert_eq!( -// Uint128(1001), -// gateway_delegations_read(&mut deps.storage, &node_owner) -// .load(delegator_address.as_bytes()) -// .unwrap() -// ) -// } -// } -// -// #[test] -// fn when_there_are_more_delegations_than_page_size() { -// let mut deps = mock_dependencies(&[]); -// let node_owner = HumanAddr::from("owner"); -// // 0.001 -// let reward = Decimal::from_ratio(1u128, 1000u128); -// -// for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// gateway_delegations(&mut deps.storage, &node_owner) -// .save(delegator_address.as_bytes(), &Uint128(1000)) -// .unwrap(); -// } -// -// increase_gateway_delegated_stakes(&mut deps.storage, &node_owner, reward).unwrap(); -// -// for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { -// let delegator_address = HumanAddr::from(format!("address{}", i)); -// assert_eq!( -// Uint128(1001), -// gateway_delegations_read(&mut deps.storage, &node_owner) -// .load(delegator_address.as_bytes()) -// .unwrap() -// ) -// } -// } -// } -// } + +#[cfg(test)] +mod tests { + use super::*; + use crate::contract::DENOM; + use crate::support::tests::helpers::{ + gateway_bond_fixture, gateway_fixture, mix_node_fixture, mixnode_bond_fixture, + }; + use cosmwasm_std::testing::MockStorage; + use cosmwasm_std::{coins, Addr, Uint128}; + use mixnet_contract::{Gateway, MixNode}; + + #[test] + fn mixnode_single_read_retrieval() { + let mut storage = MockStorage::new(); + let bond1 = mixnode_bond_fixture(); + let bond2 = mixnode_bond_fixture(); + mixnodes(&mut storage).save(b"bond1", &bond1).unwrap(); + mixnodes(&mut storage).save(b"bond2", &bond2).unwrap(); + + let res1 = mixnodes_read(&storage).load(b"bond1").unwrap(); + let res2 = mixnodes_read(&storage).load(b"bond2").unwrap(); + assert_eq!(bond1, res1); + assert_eq!(bond2, res2); + } + + #[test] + fn gateway_single_read_retrieval() { + let mut storage = MockStorage::new(); + let bond1 = gateway_bond_fixture(); + let bond2 = gateway_bond_fixture(); + gateways(&mut storage).save(b"bond1", &bond1).unwrap(); + gateways(&mut storage).save(b"bond2", &bond2).unwrap(); + + let res1 = gateways_read(&storage).load(b"bond1").unwrap(); + let res2 = gateways_read(&storage).load(b"bond2").unwrap(); + assert_eq!(bond1, res1); + assert_eq!(bond2, res2); + } + + #[test] + fn increasing_mixnode_bond() { + let mut storage = MockStorage::new(); + let node_owner: Addr = Addr::unchecked("node-owner"); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + // increases the reward appropriately + let mixnode_bond = MixNodeBond { + amount: coins(1000, DENOM), + owner: node_owner.clone(), + mix_node: MixNode { + identity_key: node_identity.clone(), + ..mix_node_fixture() + }, + }; + + mixnodes(&mut storage) + .save(node_identity.as_bytes(), &mixnode_bond) + .unwrap(); + + increase_mixnode_bond(&mut storage, mixnode_bond, reward).unwrap(); + let new_bond = read_mixnode_bond(&storage, node_identity.as_bytes()).unwrap(); + assert_eq!(Uint128(1001), new_bond); + } + + #[test] + fn reading_mixnode_bond() { + let mut storage = MockStorage::new(); + let node_owner: Addr = Addr::unchecked("node-owner"); + let node_identity: IdentityKey = "nodeidentity".into(); + + // produces an error if target mixnode doesn't exist + let res = read_mixnode_bond(&storage, node_owner.as_bytes()); + assert!(res.is_err()); + + // returns appropriate value otherwise + let bond_value = 1000; + + let mixnode_bond = MixNodeBond { + amount: coins(bond_value, DENOM), + owner: node_owner.clone(), + mix_node: MixNode { + identity_key: node_identity.clone(), + ..mix_node_fixture() + }, + }; + + mixnodes(&mut storage) + .save(node_identity.as_bytes(), &mixnode_bond) + .unwrap(); + + assert_eq!( + Uint128(bond_value), + read_mixnode_bond(&storage, node_identity.as_bytes()).unwrap() + ); + } + + #[test] + fn increasing_gateway_bond() { + let mut storage = MockStorage::new(); + let node_owner: Addr = Addr::unchecked("node-owner"); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + // increases the reward appropriately + let gateway_bond = GatewayBond { + amount: coins(1000, DENOM), + owner: node_owner.clone(), + gateway: Gateway { + identity_key: node_identity.clone(), + ..gateway_fixture() + }, + }; + + gateways(&mut storage) + .save(node_identity.as_bytes(), &gateway_bond) + .unwrap(); + + increase_gateway_bond(&mut storage, gateway_bond, reward).unwrap(); + let new_bond = read_gateway_bond(&storage, node_identity.as_bytes()).unwrap(); + assert_eq!(Uint128(1001), new_bond); + } + + #[test] + fn reading_gateway_bond() { + let mut storage = MockStorage::new(); + let node_owner: Addr = Addr::unchecked("node-owner"); + let node_identity: IdentityKey = "nodeidentity".into(); + + // produces an error if target gateway doesn't exist + let res = read_gateway_bond(&storage, node_owner.as_bytes()); + assert!(res.is_err()); + + // returns appropriate value otherwise + let bond_value = 1000; + + let gateway_bond = GatewayBond { + amount: coins(bond_value, DENOM), + owner: node_owner.clone(), + gateway: Gateway { + identity_key: node_identity.clone(), + ..gateway_fixture() + }, + }; + + gateways(&mut storage) + .save(node_identity.as_bytes(), &gateway_bond) + .unwrap(); + + assert_eq!( + Uint128(bond_value), + read_gateway_bond(&storage, node_identity.as_bytes()).unwrap() + ); + } + + #[cfg(test)] + mod increasing_mix_delegated_stakes { + use super::*; + use crate::queries::query_mixnode_delegations_paged; + use cosmwasm_std::testing::mock_dependencies; + + #[test] + fn when_there_are_no_delegations() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + increase_mix_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + + // there are no 'new' delegations magically added + assert!( + query_mixnode_delegations_paged(deps.as_ref(), node_identity, None, None) + .unwrap() + .delegations + .is_empty() + ) + } + + #[test] + fn when_there_is_a_single_delegation() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + let delegator_address = Addr::unchecked("bob"); + mix_delegations(&mut deps.storage, &node_identity) + .save(delegator_address.as_bytes(), &Uint128(1000)) + .unwrap(); + + increase_mix_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + assert_eq!( + Uint128(1001), + mix_delegations_read(&mut deps.storage, &node_identity) + .load(delegator_address.as_bytes()) + .unwrap() + ) + } + + #[test] + fn when_there_are_multiple_delegations() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + for i in 0..100 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + mix_delegations(&mut deps.storage, &node_identity) + .save(delegator_address.as_bytes(), &Uint128(1000)) + .unwrap(); + } + + increase_mix_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + + for i in 0..100 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + assert_eq!( + Uint128(1001), + mix_delegations_read(&mut deps.storage, &node_identity) + .load(delegator_address.as_bytes()) + .unwrap() + ) + } + } + + #[test] + fn when_there_are_more_delegations_than_page_size() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + mix_delegations(&mut deps.storage, &node_identity) + .save(delegator_address.as_bytes(), &Uint128(1000)) + .unwrap(); + } + + increase_mix_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + + for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + assert_eq!( + Uint128(1001), + mix_delegations_read(&mut deps.storage, &node_identity) + .load(delegator_address.as_bytes()) + .unwrap() + ) + } + } + } + + #[cfg(test)] + mod increasing_gateway_delegated_stakes { + use super::*; + use crate::queries::query_gateway_delegations_paged; + use cosmwasm_std::testing::mock_dependencies; + + #[test] + fn when_there_are_no_delegations() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + increase_gateway_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + + // there are no 'new' delegations magically added + assert!( + query_gateway_delegations_paged(deps.as_ref(), node_identity, None, None) + .unwrap() + .delegations + .is_empty() + ) + } + + #[test] + fn when_there_is_a_single_delegation() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + let delegator_address = Addr::unchecked("bob"); + gateway_delegations(&mut deps.storage, &node_identity) + .save(delegator_address.as_bytes(), &Uint128(1000)) + .unwrap(); + + increase_gateway_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + assert_eq!( + Uint128(1001), + gateway_delegations_read(&mut deps.storage, &node_identity) + .load(delegator_address.as_bytes()) + .unwrap() + ) + } + + #[test] + fn when_there_are_multiple_delegations() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + for i in 0..100 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + gateway_delegations(&mut deps.storage, &node_identity) + .save(delegator_address.as_bytes(), &Uint128(1000)) + .unwrap(); + } + + increase_gateway_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + + for i in 0..100 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + assert_eq!( + Uint128(1001), + gateway_delegations_read(&mut deps.storage, &node_identity) + .load(delegator_address.as_bytes()) + .unwrap() + ) + } + } + + #[test] + fn when_there_are_more_delegations_than_page_size() { + let mut deps = mock_dependencies(&[]); + let node_identity: IdentityKey = "nodeidentity".into(); + + // 0.001 + let reward = Decimal::from_ratio(1u128, 1000u128); + + for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + gateway_delegations(&mut deps.storage, &node_identity) + .save(delegator_address.as_bytes(), &Uint128(1000)) + .unwrap(); + } + + increase_gateway_delegated_stakes(&mut deps.storage, node_identity.clone(), reward) + .unwrap(); + + for i in 0..queries::DELEGATION_PAGE_MAX_LIMIT * 10 { + let delegator_address = Addr::unchecked(format!("address{}", i)); + assert_eq!( + Uint128(1001), + gateway_delegations_read(&mut deps.storage, &node_identity) + .load(delegator_address.as_bytes()) + .unwrap() + ) + } + } + } +} diff --git a/contracts/mixnet/src/support/tests.rs b/contracts/mixnet/src/support/tests.rs index f39c9c9aa0..79bb07c816 100644 --- a/contracts/mixnet/src/support/tests.rs +++ b/contracts/mixnet/src/support/tests.rs @@ -3,8 +3,8 @@ pub mod helpers { use super::*; use crate::contract::query; use crate::contract::DENOM; - use crate::contract::{init, INITIAL_MIXNODE_BOND}; - use crate::msg::InitMsg; + use crate::contract::{instantiate, INITIAL_MIXNODE_BOND}; + use crate::msg::InstantiateMsg; use crate::msg::QueryMsg; use crate::transactions::{try_add_gateway, try_add_mixnode}; use cosmwasm_std::coins; @@ -15,8 +15,8 @@ pub mod helpers { use cosmwasm_std::testing::MockApi; use cosmwasm_std::testing::MockQuerier; use cosmwasm_std::testing::MockStorage; + use cosmwasm_std::Addr; use cosmwasm_std::Coin; - use cosmwasm_std::HumanAddr; use cosmwasm_std::OwnedDeps; use cosmwasm_std::{Empty, MemoryStorage}; use mixnet_contract::{ @@ -97,10 +97,10 @@ pub mod helpers { pub fn init_contract() -> OwnedDeps> { let mut deps = mock_dependencies(&[]); - let msg = InitMsg {}; + let msg = InstantiateMsg {}; let env = mock_env(); let info = mock_info("creator", &[]); - init(deps.as_mut(), env.clone(), info, msg).unwrap(); + instantiate(deps.as_mut(), env.clone(), info, msg).unwrap(); return deps; } @@ -124,7 +124,7 @@ pub mod helpers { "aaaa".to_string(), "0.10.0".to_string(), ); - MixNodeBond::new(coins(50, DENOM), HumanAddr::from("foo"), mix_node) + MixNodeBond::new(coins(50, DENOM), Addr::unchecked("foo"), mix_node) } pub fn gateway_fixture() -> Gateway { @@ -147,11 +147,11 @@ pub mod helpers { "identity".to_string(), "0.10.0".to_string(), ); - GatewayBond::new(coins(50, DENOM), HumanAddr::from("foo"), gateway) + GatewayBond::new(coins(50, DENOM), Addr::unchecked("foo"), gateway) } pub fn query_contract_balance( - address: HumanAddr, + address: Addr, deps: OwnedDeps, ) -> Vec { let querier = deps.as_ref().querier; diff --git a/contracts/mixnet/src/transactions.rs b/contracts/mixnet/src/transactions.rs index 9da7a048af..3f70ae364d 100644 --- a/contracts/mixnet/src/transactions.rs +++ b/contracts/mixnet/src/transactions.rs @@ -9,9 +9,7 @@ use crate::storage::{ mixnodes, mixnodes_owners, mixnodes_owners_read, mixnodes_read, read_gateway_epoch_reward_rate, read_mixnode_epoch_reward_rate, read_state_params, Layer, }; -use cosmwasm_std::{ - attr, coins, BankMsg, Coin, Decimal, DepsMut, Env, HandleResponse, MessageInfo, Uint128, -}; +use cosmwasm_std::{attr, coins, BankMsg, Coin, Decimal, DepsMut, MessageInfo, Response, Uint128}; use mixnet_contract::{Gateway, GatewayBond, IdentityKey, MixNode, MixNodeBond}; fn validate_mixnode_bond(bond: &[Coin], minimum_bond: Uint128) -> Result<(), ContractError> { @@ -44,7 +42,7 @@ pub(crate) fn try_add_mixnode( deps: DepsMut, info: MessageInfo, mix_node: MixNode, -) -> Result { +) -> Result { let sender_bytes = info.sender.as_bytes(); // if the client has an active bonded gateway, don't allow mixnode bonding @@ -76,9 +74,9 @@ pub(crate) fn try_add_mixnode( } let minimum_bond = read_state_params(deps.storage).minimum_mixnode_bond; - validate_mixnode_bond(&info.sent_funds, minimum_bond)?; + validate_mixnode_bond(&info.funds, minimum_bond)?; - let bond = MixNodeBond::new(info.sent_funds, info.sender.clone(), mix_node); + let bond = MixNodeBond::new(info.funds, info.sender.clone(), mix_node); let attributes = vec![attr("overwritten", was_present)]; @@ -87,8 +85,9 @@ pub(crate) fn try_add_mixnode( mixnodes_owners(deps.storage).save(sender_bytes, identity)?; increment_layer_count(deps.storage, bond.mix_node.layer.into())?; - Ok(HandleResponse { - messages: vec![], + Ok(Response { + submessages: Vec::new(), + messages: Vec::new(), attributes, data: None, }) @@ -97,8 +96,7 @@ pub(crate) fn try_add_mixnode( pub(crate) fn try_remove_mixnode( deps: DepsMut, info: MessageInfo, - env: Env, -) -> Result { +) -> Result { let sender_bytes = info.sender.as_bytes(); // try to find the identity of the sender's node @@ -112,8 +110,7 @@ pub(crate) fn try_remove_mixnode( // send bonded funds back to the bond owner let messages = vec![BankMsg::Send { - from_address: env.contract.address, - to_address: info.sender.clone(), + to_address: info.sender.as_str().to_owned(), amount: mixnode_bond.amount().to_vec(), } .into()]; @@ -128,7 +125,8 @@ pub(crate) fn try_remove_mixnode( // log our actions let attributes = vec![attr("action", "unbond"), attr("mixnode_bond", mixnode_bond)]; - Ok(HandleResponse { + Ok(Response { + submessages: Vec::new(), messages, attributes, data: None, @@ -165,7 +163,7 @@ pub(crate) fn try_add_gateway( deps: DepsMut, info: MessageInfo, gateway: Gateway, -) -> Result { +) -> Result { let sender_bytes = info.sender.as_bytes(); // if the client has an active bonded mixnode, don't allow gateway bonding @@ -197,9 +195,9 @@ pub(crate) fn try_add_gateway( } let minimum_bond = read_state_params(deps.storage).minimum_gateway_bond; - validate_gateway_bond(&info.sent_funds, minimum_bond)?; + validate_gateway_bond(&info.funds, minimum_bond)?; - let bond = GatewayBond::new(info.sent_funds, info.sender.clone(), gateway); + let bond = GatewayBond::new(info.funds, info.sender.clone(), gateway); let attributes = vec![attr("overwritten", was_present)]; @@ -208,8 +206,9 @@ pub(crate) fn try_add_gateway( gateways_owners(deps.storage).save(sender_bytes, identity)?; increment_layer_count(deps.storage, Layer::Gateway)?; - Ok(HandleResponse { - messages: vec![], + Ok(Response { + submessages: Vec::new(), + messages: Vec::new(), attributes, data: None, }) @@ -218,9 +217,8 @@ pub(crate) fn try_add_gateway( pub(crate) fn try_remove_gateway( deps: DepsMut, info: MessageInfo, - env: Env, -) -> Result { - let sender_bytes = info.sender.as_bytes(); +) -> Result { + let sender_bytes = info.sender.as_str().as_bytes(); // try to find the identity of the sender's node let gateway_identity = match gateways_owners_read(deps.storage).may_load(sender_bytes)? { @@ -233,8 +231,7 @@ pub(crate) fn try_remove_gateway( // send bonded funds back to the bond owner let messages = vec![BankMsg::Send { - from_address: env.contract.address, - to_address: info.sender.clone(), + to_address: info.sender.as_str().to_owned(), amount: gateway_bond.amount().to_vec(), } .into()]; @@ -253,7 +250,8 @@ pub(crate) fn try_remove_gateway( attr("gateway_bond", gateway_bond), ]; - Ok(HandleResponse { + Ok(Response { + submessages: Vec::new(), messages, attributes, data: None, @@ -264,7 +262,7 @@ pub(crate) fn try_update_state_params( deps: DepsMut, info: MessageInfo, params: StateParams, -) -> Result { +) -> Result { // note: In any other case, I wouldn't have attempted to unwrap this result, but in here // if we fail to load the stored state we would already be in the undefined behaviour land, // so we better just blow up immediately. @@ -305,7 +303,7 @@ pub(crate) fn try_update_state_params( config(deps.storage).save(&state)?; - Ok(HandleResponse::default()) + Ok(Response::default()) } pub(crate) fn try_reward_mixnode( @@ -313,7 +311,7 @@ pub(crate) fn try_reward_mixnode( info: MessageInfo, mix_identity: IdentityKey, uptime: u32, -) -> Result { +) -> Result { let state = config_read(deps.storage).load().unwrap(); // check if this is executed by the monitor, if not reject the transaction @@ -323,14 +321,14 @@ pub(crate) fn try_reward_mixnode( // optimisation for uptime being 0. No rewards will be given so just terminate here if uptime == 0 { - return Ok(HandleResponse::default()); + return Ok(Response::default()); } // check if the bond even exists let current_bond = match mixnodes(deps.storage).load(mix_identity.as_bytes()) { Ok(bond) => bond, Err(_) => { - return Ok(HandleResponse { + return Ok(Response { attributes: vec![attr("result", "bond not found")], ..Default::default() }); @@ -341,9 +339,9 @@ pub(crate) fn try_reward_mixnode( let scaled_reward = scale_reward_by_uptime(reward, uptime)?; increase_mixnode_bond(deps.storage, current_bond, scaled_reward)?; - increase_mix_delegated_stakes(deps.storage, &mix_identity, scaled_reward)?; + increase_mix_delegated_stakes(deps.storage, mix_identity, scaled_reward)?; - Ok(HandleResponse::default()) + Ok(Response::default()) } pub(crate) fn try_reward_gateway( @@ -351,7 +349,7 @@ pub(crate) fn try_reward_gateway( info: MessageInfo, gateway_identity: IdentityKey, uptime: u32, -) -> Result { +) -> Result { let state = config_read(deps.storage).load().unwrap(); // check if this is executed by the owner, if not reject the transaction @@ -363,7 +361,7 @@ pub(crate) fn try_reward_gateway( let current_bond = match gateways(deps.storage).load(gateway_identity.as_bytes()) { Ok(bond) => bond, Err(_) => { - return Ok(HandleResponse { + return Ok(Response { attributes: vec![attr("result", "bond not found")], ..Default::default() }); @@ -374,9 +372,9 @@ pub(crate) fn try_reward_gateway( let scaled_reward = scale_reward_by_uptime(reward, uptime)?; increase_gateway_bond(deps.storage, current_bond, scaled_reward)?; - increase_gateway_delegated_stakes(deps.storage, &gateway_identity, scaled_reward)?; + increase_gateway_delegated_stakes(deps.storage, gateway_identity, scaled_reward)?; - Ok(HandleResponse::default()) + Ok(Response::default()) } fn validate_delegation_stake(delegation: &[Coin]) -> Result<(), ContractError> { @@ -406,9 +404,9 @@ pub(crate) fn try_delegate_to_mixnode( deps: DepsMut, info: MessageInfo, mix_identity: IdentityKey, -) -> Result { +) -> Result { // check if the delegation contains any funds of the appropriate denomination - validate_delegation_stake(&info.sent_funds)?; + validate_delegation_stake(&info.funds)?; // check if the target node actually exists if mixnodes_read(deps.storage) @@ -423,22 +421,20 @@ pub(crate) fn try_delegate_to_mixnode( let mut bucket = mix_delegations(deps.storage, &mix_identity); let sender_bytes = info.sender.as_bytes(); match bucket.may_load(sender_bytes)? { - Some(existing_delegation) => bucket.save( - sender_bytes, - &(existing_delegation + info.sent_funds[0].amount), - )?, - None => bucket.save(sender_bytes, &info.sent_funds[0].amount)?, + Some(existing_delegation) => { + bucket.save(sender_bytes, &(existing_delegation + info.funds[0].amount))? + } + None => bucket.save(sender_bytes, &info.funds[0].amount)?, } - Ok(HandleResponse::default()) + Ok(Response::default()) } pub(crate) fn try_remove_delegation_from_mixnode( deps: DepsMut, info: MessageInfo, - env: Env, mix_identity: IdentityKey, -) -> Result { +) -> Result { let mut delegation_bucket = mix_delegations(deps.storage, &mix_identity); let sender_bytes = info.sender.as_bytes(); match delegation_bucket.may_load(sender_bytes)? { @@ -448,13 +444,13 @@ pub(crate) fn try_remove_delegation_from_mixnode( // send delegated funds back to the delegation owner let messages = vec![BankMsg::Send { - from_address: env.contract.address, - to_address: info.sender, + to_address: info.sender.to_string(), amount: coins(delegation.u128(), DENOM), } .into()]; - Ok(HandleResponse { + Ok(Response { + submessages: Vec::new(), messages, attributes: Vec::new(), data: None, @@ -471,9 +467,9 @@ pub(crate) fn try_delegate_to_gateway( deps: DepsMut, info: MessageInfo, gateway_identity: IdentityKey, -) -> Result { +) -> Result { // check if the delegation contains any funds of the appropriate denomination - validate_delegation_stake(&info.sent_funds)?; + validate_delegation_stake(&info.funds)?; // check if the target node actually exists if gateways_read(deps.storage) @@ -488,22 +484,20 @@ pub(crate) fn try_delegate_to_gateway( let mut bucket = gateway_delegations(deps.storage, &gateway_identity); let sender_bytes = info.sender.as_bytes(); match bucket.may_load(sender_bytes)? { - Some(existing_delegation) => bucket.save( - sender_bytes, - &(existing_delegation + info.sent_funds[0].amount), - )?, - None => bucket.save(sender_bytes, &info.sent_funds[0].amount)?, + Some(existing_delegation) => { + bucket.save(sender_bytes, &(existing_delegation + info.funds[0].amount))? + } + None => bucket.save(sender_bytes, &info.funds[0].amount)?, } - Ok(HandleResponse::default()) + Ok(Response::default()) } pub(crate) fn try_remove_delegation_from_gateway( deps: DepsMut, info: MessageInfo, - env: Env, gateway_identity: IdentityKey, -) -> Result { +) -> Result { let mut delegation_bucket = gateway_delegations(deps.storage, &gateway_identity); let sender_bytes = info.sender.as_bytes(); match delegation_bucket.may_load(sender_bytes)? { @@ -513,13 +507,13 @@ pub(crate) fn try_remove_delegation_from_gateway( // send delegated funds back to the delegation owner let messages = vec![BankMsg::Send { - from_address: env.contract.address, - to_address: info.sender, + to_address: info.sender.to_string(), amount: coins(delegation.u128(), DENOM), } .into()]; - Ok(HandleResponse { + Ok(Response { + submessages: Vec::new(), messages, attributes: Vec::new(), data: None, @@ -536,11 +530,11 @@ pub(crate) fn try_remove_delegation_from_gateway( pub mod tests { use super::*; use crate::contract::{ - handle, query, INITIAL_DEFAULT_EPOCH_LENGTH, INITIAL_GATEWAY_BOND, + execute, query, INITIAL_DEFAULT_EPOCH_LENGTH, INITIAL_GATEWAY_BOND, INITIAL_GATEWAY_BOND_REWARD_RATE, INITIAL_MIXNODE_BOND, INITIAL_MIXNODE_BOND_REWARD_RATE, }; use crate::helpers::calculate_epoch_reward_rate; - use crate::msg::{HandleMsg, QueryMsg}; + use crate::msg::{ExecuteMsg, QueryMsg}; use crate::state::StateParams; use crate::storage::{ gateway_delegations, gateway_delegations_read, layer_distribution_read, @@ -552,7 +546,7 @@ pub mod tests { mix_node_fixture, }; use cosmwasm_std::testing::{mock_env, mock_info}; - use cosmwasm_std::{coins, from_binary, HumanAddr, Uint128}; + use cosmwasm_std::{coins, from_binary, Addr, Uint128}; use mixnet_contract::{LayerDistribution, PagedGatewayResponse, PagedResponse}; #[test] @@ -563,7 +557,7 @@ pub mod tests { // you must send at least 100 coins... let mut bond = good_mixnode_bond(); - bond[0].amount = (INITIAL_MIXNODE_BOND - Uint128(1)).unwrap(); + bond[0].amount = INITIAL_MIXNODE_BOND.checked_sub(Uint128(1)).unwrap(); let result = validate_mixnode_bond(&bond, INITIAL_MIXNODE_BOND); assert_eq!( result, @@ -598,7 +592,7 @@ pub mod tests { // if we don't send enough funds let insufficient_bond = Into::::into(INITIAL_MIXNODE_BOND) - 1; let info = mock_info("anyone", &coins(insufficient_bond, DENOM)); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "anyonesmixnode".into(), ..helpers::mix_node_fixture() @@ -606,7 +600,7 @@ pub mod tests { }; // we are informed that we didn't send enough funds - let result = handle(deps.as_mut(), mock_env(), info, msg); + let result = execute(deps.as_mut(), mock_env(), info, msg); assert_eq!( result, Err(ContractError::InsufficientMixNodeBond { @@ -630,7 +624,7 @@ pub mod tests { // if we send enough funds let info = mock_info("anyone", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "anyonesmixnode".into(), ..helpers::mix_node_fixture() @@ -638,8 +632,8 @@ pub mod tests { }; // we get back a message telling us everything was OK - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert!(handle_response.is_ok()); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert!(execute_response.is_ok()); // we can query topology and the new node is there let query_response = query( @@ -663,18 +657,18 @@ pub mod tests { // if there was already a mixnode bonded by particular user let info = mock_info("foomper", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "foompermixnode".into(), ..helpers::mix_node_fixture() }, }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(handle_response.attributes[0], attr("overwritten", false)); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(execute_response.attributes[0], attr("overwritten", false)); let info = mock_info("foomper", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "foompermixnode".into(), ..helpers::mix_node_fixture() @@ -682,43 +676,43 @@ pub mod tests { }; // we get a log message about it (TODO: does it get back to the user?) - let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(handle_response.attributes[0], attr("overwritten", true)); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(execute_response.attributes[0], attr("overwritten", true)); // bonding fails if the user already owns a gateway let info = mock_info("gateway-owner", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "ownersgateway".into(), ..helpers::gateway_fixture() }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); let info = mock_info("gateway-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "ownersmixnode".into(), ..helpers::mix_node_fixture() }, }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert_eq!(handle_response, Err(ContractError::AlreadyOwnsGateway)); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert_eq!(execute_response, Err(ContractError::AlreadyOwnsGateway)); // but after he unbonds it, it's all fine again let info = mock_info("gateway-owner", &[]); - let msg = HandleMsg::UnbondGateway {}; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + let msg = ExecuteMsg::UnbondGateway {}; + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); let info = mock_info("gateway-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "ownersmixnode".into(), ..helpers::mix_node_fixture() }, }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert!(handle_response.is_ok()); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert!(execute_response.is_ok()); // adding another node from another account, but with the same IP, should fail (or we would have a weird state). Is that right? Think about this, not sure yet. // if we attempt to register a second node from the same address, should we get an error? It would probably be polite. @@ -729,7 +723,7 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("mix-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "myAwesomeMixnode".to_string(), ..helpers::mix_node_fixture() @@ -743,8 +737,8 @@ pub mod tests { .is_none()); // it's all fine, owner is saved - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert!(handle_response.is_ok()); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert!(execute_response.is_ok()); assert_eq!( "myAwesomeMixnode", @@ -759,30 +753,30 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("mix-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "myAwesomeMixnode".to_string(), ..helpers::mix_node_fixture() }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); // request fails giving the existing owner address in the message let info = mock_info("mix-owner-pretender", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "myAwesomeMixnode".to_string(), ..helpers::mix_node_fixture() }, }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); assert_eq!( Err(ContractError::DuplicateMixnode { - owner: "mix-owner".into() + owner: Addr::unchecked("mix-owner") }), - handle_response + execute_response ); } @@ -791,7 +785,7 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("mix-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "myAwesomeMixnode".to_string(), host: "1.1.1.1:1789".into(), @@ -799,10 +793,10 @@ pub mod tests { }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); let info = mock_info("mix-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "myAwesomeMixnode".to_string(), host: "2.2.2.2:1789".into(), @@ -810,7 +804,7 @@ pub mod tests { }, }; - assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok()); + assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok()); // make sure the host information was updated assert_eq!( @@ -833,7 +827,7 @@ pub mod tests { ); let info = mock_info("mix-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "mix1".to_string(), layer: 1, @@ -841,7 +835,7 @@ pub mod tests { }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); assert_eq!( LayerDistribution { layer1: 1, @@ -854,18 +848,17 @@ pub mod tests { #[test] fn mixnode_remove() { let mut deps = helpers::init_contract(); - let env = mock_env(); // try un-registering when no nodes exist yet let info = mock_info("anyone", &[]); - let msg = HandleMsg::UnbondMixnode {}; - let result = handle(deps.as_mut(), mock_env(), info, msg); + let msg = ExecuteMsg::UnbondMixnode {}; + let result = execute(deps.as_mut(), mock_env(), info, msg); // we're told that there is no node for our address assert_eq!( result, Err(ContractError::NoAssociatedMixNodeBond { - owner: "anyone".into() + owner: Addr::unchecked("anyone") }) ); @@ -874,19 +867,19 @@ pub mod tests { // attempt to un-register fred's node, which doesn't exist let info = mock_info("fred", &[]); - let msg = HandleMsg::UnbondMixnode {}; - let result = handle(deps.as_mut(), mock_env(), info, msg); + let msg = ExecuteMsg::UnbondMixnode {}; + let result = execute(deps.as_mut(), mock_env(), info, msg); assert_eq!( result, Err(ContractError::NoAssociatedMixNodeBond { - owner: "fred".into() + owner: Addr::unchecked("fred") }) ); // bob's node is still there let nodes = helpers::get_mix_nodes(&mut deps); assert_eq!(1, nodes.len()); - assert_eq!("bob", nodes[0].owner()); + assert_eq!("bob", nodes[0].owner().clone()); // add a node owned by fred let info = mock_info("fred", &good_mixnode_bond()); @@ -905,8 +898,8 @@ pub mod tests { // un-register fred's node let info = mock_info("fred", &[]); - let msg = HandleMsg::UnbondMixnode {}; - let remove_fred = handle(deps.as_mut(), mock_env(), info.clone(), msg).unwrap(); + let msg = ExecuteMsg::UnbondMixnode {}; + let remove_fred = execute(deps.as_mut(), mock_env(), info.clone(), msg).unwrap(); // we should see log messages come back showing an unbond message let expected_attributes = vec![ @@ -919,14 +912,14 @@ pub mod tests { // we should see a funds transfer from the contract back to fred let expected_messages = vec![BankMsg::Send { - from_address: env.contract.address, - to_address: info.sender, + to_address: String::from(info.sender), amount: good_mixnode_bond(), } .into()]; - // run the handler and check that we got back the correct results - let expected = HandleResponse { + // run the executer and check that we got back the correct results + let expected = Response { + submessages: Vec::new(), messages: expected_messages, attributes: expected_attributes, data: None, @@ -936,7 +929,7 @@ pub mod tests { // only 1 node now exists, owned by bob: let mix_node_bonds = helpers::get_mix_nodes(&mut deps); assert_eq!(1, mix_node_bonds.len()); - assert_eq!("bob", mix_node_bonds[0].owner()); + assert_eq!(&Addr::unchecked("bob"), mix_node_bonds[0].owner()); } #[test] @@ -944,14 +937,14 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("mix-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "myAwesomeMixnode".to_string(), ..helpers::mix_node_fixture() }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); assert_eq!( "myAwesomeMixnode", mixnodes_owners_read(deps.as_ref().storage) @@ -960,9 +953,9 @@ pub mod tests { ); let info = mock_info("mix-owner", &[]); - let msg = HandleMsg::UnbondMixnode {}; + let msg = ExecuteMsg::UnbondMixnode {}; - assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok()); + assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok()); assert!(mixnodes_owners_read(deps.as_ref().storage) .may_load("mix-owner".as_bytes()) @@ -971,14 +964,14 @@ pub mod tests { // and since it's removed, it can be reclaimed let info = mock_info("mix-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "myAwesomeMixnode".to_string(), ..helpers::mix_node_fixture() }, }; - assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok()); + assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok()); assert_eq!( "myAwesomeMixnode", mixnodes_owners_read(deps.as_ref().storage) @@ -995,7 +988,7 @@ pub mod tests { // you must send at least 100 coins... let mut bond = good_gateway_bond(); - bond[0].amount = (INITIAL_GATEWAY_BOND - Uint128(1)).unwrap(); + bond[0].amount = INITIAL_GATEWAY_BOND.checked_sub(Uint128(1)).unwrap(); let result = validate_gateway_bond(&bond, INITIAL_GATEWAY_BOND); assert_eq!( result, @@ -1030,12 +1023,12 @@ pub mod tests { // if we fail validation (by say not sending enough funds let insufficient_bond = Into::::into(INITIAL_GATEWAY_BOND) - 1; let info = mock_info("anyone", &coins(insufficient_bond, DENOM)); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: helpers::gateway_fixture(), }; // we are informed that we didn't send enough funds - let result = handle(deps.as_mut(), mock_env(), info, msg); + let result = execute(deps.as_mut(), mock_env(), info, msg); assert_eq!( result, Err(ContractError::InsufficientGatewayBond { @@ -1059,7 +1052,7 @@ pub mod tests { // if we send enough funds let info = mock_info("anyone", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "anyonesgateway".into(), ..helpers::gateway_fixture() @@ -1067,8 +1060,8 @@ pub mod tests { }; // we get back a message telling us everything was OK - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert!(handle_response.is_ok()); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert!(execute_response.is_ok()); // we can query topology and the new node is there let query_response = query( @@ -1092,18 +1085,18 @@ pub mod tests { // if there was already a gateway bonded by particular user let info = mock_info("foomper", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "foompersgateway".into(), ..helpers::gateway_fixture() }, }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(handle_response.attributes[0], attr("overwritten", false)); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(execute_response.attributes[0], attr("overwritten", false)); let info = mock_info("foomper", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "foompersgateway".into(), ..helpers::gateway_fixture() @@ -1111,37 +1104,37 @@ pub mod tests { }; // we get a log message about it (TODO: does it get back to the user?) - let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(handle_response.attributes[0], attr("overwritten", true)); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(execute_response.attributes[0], attr("overwritten", true)); // bonding fails if the user already owns a mixnode let info = mock_info("mixnode-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondMixnode { + let msg = ExecuteMsg::BondMixnode { mix_node: MixNode { identity_key: "ownersmix".into(), ..helpers::mix_node_fixture() }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); let info = mock_info("mixnode-owner", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: helpers::gateway_fixture(), }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert_eq!(handle_response, Err(ContractError::AlreadyOwnsMixnode)); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert_eq!(execute_response, Err(ContractError::AlreadyOwnsMixnode)); // but after he unbonds it, it's all fine again let info = mock_info("mixnode-owner", &[]); - let msg = HandleMsg::UnbondMixnode {}; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + let msg = ExecuteMsg::UnbondMixnode {}; + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); let info = mock_info("mixnode-owner", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: helpers::gateway_fixture(), }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert!(handle_response.is_ok()); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert!(execute_response.is_ok()); // adding another node from another account, but with the same IP, should fail (or we would have a weird state). // Is that right? Think about this, not sure yet. @@ -1152,7 +1145,7 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("gateway-owner", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "myAwesomeGateway".to_string(), ..helpers::gateway_fixture() @@ -1166,8 +1159,8 @@ pub mod tests { .is_none()); // it's all fine, owner is saved - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); - assert!(handle_response.is_ok()); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); + assert!(execute_response.is_ok()); assert_eq!( "myAwesomeGateway", @@ -1182,30 +1175,30 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("gateway-owner", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "myAwesomeGateway".to_string(), ..helpers::gateway_fixture() }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); // request fails giving the existing owner address in the message let info = mock_info("gateway-owner-pretender", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "myAwesomeGateway".to_string(), ..helpers::gateway_fixture() }, }; - let handle_response = handle(deps.as_mut(), mock_env(), info, msg); + let execute_response = execute(deps.as_mut(), mock_env(), info, msg); assert_eq!( Err(ContractError::DuplicateGateway { - owner: "gateway-owner".into() + owner: Addr::unchecked("gateway-owner") }), - handle_response + execute_response ); } @@ -1214,7 +1207,7 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("gateway-owner", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "myAwesomeGateway".to_string(), mix_host: "1.1.1.1:1789".into(), @@ -1222,10 +1215,10 @@ pub mod tests { }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); let info = mock_info("gateway-owner", &good_gateway_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "myAwesomeGateway".to_string(), mix_host: "2.2.2.2:1789".into(), @@ -1233,7 +1226,7 @@ pub mod tests { }, }; - assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok()); + assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok()); // make sure the host information was updated assert_eq!( @@ -1249,18 +1242,17 @@ pub mod tests { #[test] fn gateway_remove() { let mut deps = helpers::init_contract(); - let env = mock_env(); // try unbond when no nodes exist yet let info = mock_info("anyone", &[]); - let msg = HandleMsg::UnbondGateway {}; - let result = handle(deps.as_mut(), mock_env(), info, msg); + let msg = ExecuteMsg::UnbondGateway {}; + let result = execute(deps.as_mut(), mock_env(), info, msg); // we're told that there is no node for our address assert_eq!( result, Err(ContractError::NoAssociatedGatewayBond { - owner: "anyone".into() + owner: Addr::unchecked("anyone") }) ); @@ -1269,12 +1261,12 @@ pub mod tests { // attempt to unbond fred's node, which doesn't exist let info = mock_info("fred", &[]); - let msg = HandleMsg::UnbondGateway {}; - let result = handle(deps.as_mut(), mock_env(), info, msg); + let msg = ExecuteMsg::UnbondGateway {}; + let result = execute(deps.as_mut(), mock_env(), info, msg); assert_eq!( result, Err(ContractError::NoAssociatedGatewayBond { - owner: "fred".into() + owner: Addr::unchecked("fred") }) ); @@ -1283,7 +1275,7 @@ pub mod tests { assert_eq!(1, nodes.len()); let first_node = &nodes[0]; - assert_eq!("bob", first_node.owner()); + assert_eq!(&Addr::unchecked("bob"), first_node.owner()); // add a node owned by fred let info = mock_info("fred", &good_gateway_bond()); @@ -1302,8 +1294,8 @@ pub mod tests { // unbond fred's node let info = mock_info("fred", &[]); - let msg = HandleMsg::UnbondGateway {}; - let remove_fred = handle(deps.as_mut(), mock_env(), info.clone(), msg).unwrap(); + let msg = ExecuteMsg::UnbondGateway {}; + let remove_fred = execute(deps.as_mut(), mock_env(), info.clone(), msg).unwrap(); // we should see log messages come back showing an unbond message let expected_attributes = vec![ @@ -1317,14 +1309,14 @@ pub mod tests { // we should see a funds transfer from the contract back to fred let expected_messages = vec![BankMsg::Send { - from_address: env.contract.address, - to_address: info.sender, + to_address: String::from(info.sender), amount: good_gateway_bond(), } .into()]; - // run the handler and check that we got back the correct results - let expected = HandleResponse { + // run the executer and check that we got back the correct results + let expected = Response { + submessages: Vec::new(), messages: expected_messages, attributes: expected_attributes, data: None, @@ -1334,7 +1326,7 @@ pub mod tests { // only 1 node now exists, owned by bob: let gateway_bonds = helpers::get_gateways(&mut deps); assert_eq!(1, gateway_bonds.len()); - assert_eq!("bob", gateway_bonds[0].owner()); + assert_eq!(&Addr::unchecked("bob"), gateway_bonds[0].owner()); } #[test] @@ -1342,14 +1334,14 @@ pub mod tests { let mut deps = helpers::init_contract(); let info = mock_info("gateway-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "myAwesomeGateway".to_string(), ..helpers::gateway_fixture() }, }; - handle(deps.as_mut(), mock_env(), info, msg).unwrap(); + execute(deps.as_mut(), mock_env(), info, msg).unwrap(); assert_eq!( "myAwesomeGateway", gateways_owners_read(deps.as_ref().storage) @@ -1358,9 +1350,9 @@ pub mod tests { ); let info = mock_info("gateway-owner", &[]); - let msg = HandleMsg::UnbondGateway {}; + let msg = ExecuteMsg::UnbondGateway {}; - assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok()); + assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok()); assert!(gateways_owners_read(deps.as_ref().storage) .may_load("gateway-owner".as_bytes()) @@ -1369,14 +1361,14 @@ pub mod tests { // and since it's removed, it can be reclaimed let info = mock_info("gateway-owner", &good_mixnode_bond()); - let msg = HandleMsg::BondGateway { + let msg = ExecuteMsg::BondGateway { gateway: Gateway { identity_key: "myAwesomeGateway".to_string(), ..helpers::gateway_fixture() }, }; - assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok()); + assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok()); assert_eq!( "myAwesomeGateway", gateways_owners_read(deps.as_ref().storage) @@ -1406,7 +1398,7 @@ pub mod tests { // but works fine from the creator account let info = mock_info("creator", &[]); let res = try_update_state_params(deps.as_mut(), info, new_params.clone()); - assert_eq!(res, Ok(HandleResponse::default())); + assert_eq!(res, Ok(Response::default())); // and the state is actually updated let current_state = config_read(deps.as_ref().storage).load().unwrap(); @@ -1504,7 +1496,7 @@ pub mod tests { let current_state = config(deps.as_mut().storage).load().unwrap(); let network_monitor_address = current_state.network_monitor_address; - let node_owner: HumanAddr = "node-owner".into(); + let node_owner: Addr = Addr::unchecked("node-owner"); let node_identity: IdentityKey = "nodeidentity".into(); // errors out if executed by somebody else than network monitor @@ -1513,7 +1505,7 @@ pub mod tests { assert_eq!(res, Err(ContractError::Unauthorized)); // returns bond not found attribute if the target owner hasn't bonded any mixnodes - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); let res = try_reward_mixnode(deps.as_mut(), info, node_identity.clone(), 100).unwrap(); assert_eq!(vec![attr("result", "bond not found")], res.attributes); @@ -1537,7 +1529,7 @@ pub mod tests { // if node was 100% up, it will get full epoch reward let expected_bond = Uint128(initial_bond) * reward + Uint128(initial_bond); - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_mixnode(deps.as_mut(), info, node_identity.clone(), 100).unwrap(); assert_eq!( @@ -1549,7 +1541,7 @@ pub mod tests { let scaled_reward = scale_reward_by_uptime(reward, 20).unwrap(); let expected_bond = expected_bond * scaled_reward + expected_bond; - let info = mock_info(network_monitor_address, &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_mixnode(deps.as_mut(), info, node_identity.clone(), 20).unwrap(); assert_eq!( @@ -1564,7 +1556,7 @@ pub mod tests { let current_state = config(deps.as_mut().storage).load().unwrap(); let network_monitor_address = current_state.network_monitor_address; - let node_owner: HumanAddr = "node-owner".into(); + let node_owner: Addr = Addr::unchecked("node-owner"); let node_identity: IdentityKey = "nodeidentity".into(); // errors out if executed by somebody else than network monitor @@ -1573,7 +1565,7 @@ pub mod tests { assert_eq!(res, Err(ContractError::Unauthorized)); // returns bond not found attribute if the target owner hasn't bonded any gateways - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); let res = try_reward_gateway(deps.as_mut(), info, node_identity.clone(), 100).unwrap(); assert_eq!(vec![attr("result", "bond not found")], res.attributes); @@ -1597,7 +1589,7 @@ pub mod tests { // if node was 100% up, it will get full epoch reward let expected_bond = Uint128(initial_bond) * reward + Uint128(initial_bond); - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_gateway(deps.as_mut(), info, node_identity.clone(), 100).unwrap(); assert_eq!( @@ -1609,7 +1601,7 @@ pub mod tests { let scaled_reward = scale_reward_by_uptime(reward, 20).unwrap(); let expected_bond = expected_bond * scaled_reward + expected_bond; - let info = mock_info(network_monitor_address, &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_gateway(deps.as_mut(), info, node_identity.clone(), 20).unwrap(); assert_eq!( @@ -1710,12 +1702,11 @@ pub mod tests { #[test] fn fails_if_node_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let mixnode_owner = "bob"; let identity = add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); - try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[]), env).unwrap(); + try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[])).unwrap(); assert_eq!( Err(ContractError::MixNodeBondNotFound { @@ -1732,11 +1723,10 @@ pub mod tests { #[test] fn succeeds_if_node_rebonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let mixnode_owner = "bob"; add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); - try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[]), env).unwrap(); + try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[])).unwrap(); let identity = add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); assert!(try_delegate_to_mixnode( @@ -1787,7 +1777,6 @@ pub mod tests { #[test] fn is_disallowed_for_already_delegated_node_if_it_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let mixnode_owner = "bob"; let identity = add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); @@ -1799,7 +1788,7 @@ pub mod tests { ) .unwrap(); - try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[]), env).unwrap(); + try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[])).unwrap(); assert_eq!( Err(ContractError::MixNodeBondNotFound { @@ -1876,7 +1865,6 @@ pub mod tests { #[test] fn delegation_is_not_removed_if_node_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let mixnode_owner = "bob"; let identity = add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); @@ -1888,7 +1876,7 @@ pub mod tests { ) .unwrap(); - try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[]), env).unwrap(); + try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[])).unwrap(); assert_eq!( 100, @@ -1909,7 +1897,6 @@ pub mod tests { #[test] fn fails_if_delegation_never_existed() { let mut deps = helpers::init_contract(); - let env = mock_env(); let mixnode_owner = "bob"; let identity = add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); @@ -1917,12 +1904,11 @@ pub mod tests { assert_eq!( Err(ContractError::NoMixnodeDelegationFound { identity: identity.clone(), - address: "sender".into(), + address: Addr::unchecked("sender"), }), try_remove_delegation_from_mixnode( deps.as_mut(), mock_info("sender", &[]), - env, identity, ) ); @@ -1931,7 +1917,6 @@ pub mod tests { #[test] fn succeeds_if_delegation_existed() { let mut deps = helpers::init_contract(); - let env = mock_env(); let mixnode_owner = "bob"; let identity = add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); @@ -1944,9 +1929,9 @@ pub mod tests { .unwrap(); assert_eq!( - Ok(HandleResponse { + Ok(Response { + submessages: vec![], messages: vec![BankMsg::Send { - from_address: env.contract.address.clone(), to_address: "sender".into(), amount: coins(100, DENOM), } @@ -1957,7 +1942,6 @@ pub mod tests { try_remove_delegation_from_mixnode( deps.as_mut(), mock_info("sender", &[]), - env, identity.clone(), ) ); @@ -1971,7 +1955,6 @@ pub mod tests { #[test] fn succeeds_if_delegation_existed_even_if_node_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let mixnode_owner = "bob"; let identity = add_mixnode(mixnode_owner, good_mixnode_bond(), &mut deps); @@ -1983,12 +1966,12 @@ pub mod tests { ) .unwrap(); - try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[]), env.clone()).unwrap(); + try_remove_mixnode(deps.as_mut(), mock_info(mixnode_owner, &[])).unwrap(); assert_eq!( - Ok(HandleResponse { + Ok(Response { + submessages: vec![], messages: vec![BankMsg::Send { - from_address: env.contract.address.clone(), to_address: "sender".into(), amount: coins(100, DENOM), } @@ -1999,7 +1982,6 @@ pub mod tests { try_remove_delegation_from_mixnode( deps.as_mut(), mock_info("sender", &[]), - env, identity.clone(), ) ); @@ -2047,7 +2029,7 @@ pub mod tests { let expected_delegation3 = Uint128(initial_delegation3) * reward + Uint128(initial_delegation3); - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_mixnode(deps.as_mut(), info, identity.clone(), 100).unwrap(); assert_eq!( @@ -2083,7 +2065,7 @@ pub mod tests { let expected_delegation2 = expected_delegation2 * scaled_reward + expected_delegation2; let expected_delegation3 = expected_delegation3 * scaled_reward + expected_delegation3; - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_mixnode(deps.as_mut(), info, identity.clone(), 20).unwrap(); assert_eq!( @@ -2113,7 +2095,7 @@ pub mod tests { ); // if the node was 0% up, nobody will get any rewards - let info = mock_info(network_monitor_address, &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_mixnode(deps.as_mut(), info, identity.clone(), 0).unwrap(); assert_eq!( @@ -2189,11 +2171,10 @@ pub mod tests { #[test] fn fails_if_node_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let gateway_owner = "bob"; let identity = add_gateway(gateway_owner, good_gateway_bond(), &mut deps); - try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[]), env).unwrap(); + try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[])).unwrap(); assert_eq!( Err(ContractError::GatewayBondNotFound { @@ -2210,11 +2191,10 @@ pub mod tests { #[test] fn succeeds_if_node_rebonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let gateway_owner = "bob"; add_gateway(gateway_owner, good_gateway_bond(), &mut deps); - try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[]), env).unwrap(); + try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[])).unwrap(); let identity = add_gateway(gateway_owner, good_gateway_bond(), &mut deps); assert!(try_delegate_to_gateway( @@ -2265,7 +2245,6 @@ pub mod tests { #[test] fn is_disallowed_for_already_delegated_node_if_it_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let gateway_owner = "bob"; let identity = add_gateway(gateway_owner, good_gateway_bond(), &mut deps); @@ -2277,7 +2256,7 @@ pub mod tests { ) .unwrap(); - try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[]), env).unwrap(); + try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[])).unwrap(); assert_eq!( Err(ContractError::GatewayBondNotFound { @@ -2354,7 +2333,6 @@ pub mod tests { #[test] fn delegation_is_not_removed_if_node_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let gateway_owner = "bob"; let identity = add_gateway(gateway_owner, good_gateway_bond(), &mut deps); @@ -2366,7 +2344,7 @@ pub mod tests { ) .unwrap(); - try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[]), env).unwrap(); + try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[])).unwrap(); assert_eq!( 100, @@ -2387,19 +2365,17 @@ pub mod tests { #[test] fn fails_if_delegation_never_existed() { let mut deps = helpers::init_contract(); - let env = mock_env(); let gateway_owner = "bob"; let identity = add_gateway(gateway_owner, good_gateway_bond(), &mut deps); assert_eq!( Err(ContractError::NoGatewayDelegationFound { identity: identity.clone(), - address: "sender".into(), + address: Addr::unchecked("sender"), }), try_remove_delegation_from_gateway( deps.as_mut(), mock_info("sender", &[]), - env, identity, ) ); @@ -2408,7 +2384,6 @@ pub mod tests { #[test] fn succeeds_if_delegation_existed() { let mut deps = helpers::init_contract(); - let env = mock_env(); let gateway_owner = "bob"; let identity = add_gateway(gateway_owner, good_gateway_bond(), &mut deps); @@ -2421,9 +2396,9 @@ pub mod tests { .unwrap(); assert_eq!( - Ok(HandleResponse { + Ok(Response { + submessages: vec![], messages: vec![BankMsg::Send { - from_address: env.contract.address.clone(), to_address: "sender".into(), amount: coins(100, DENOM), } @@ -2434,7 +2409,6 @@ pub mod tests { try_remove_delegation_from_gateway( deps.as_mut(), mock_info("sender", &[]), - env, identity.clone(), ) ); @@ -2448,7 +2422,6 @@ pub mod tests { #[test] fn succeeds_if_delegation_existed_even_if_node_unbonded() { let mut deps = helpers::init_contract(); - let env = mock_env(); let gateway_owner = "bob"; let identity = add_gateway(gateway_owner, good_gateway_bond(), &mut deps); @@ -2460,12 +2433,12 @@ pub mod tests { ) .unwrap(); - try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[]), env.clone()).unwrap(); + try_remove_gateway(deps.as_mut(), mock_info(gateway_owner, &[])).unwrap(); assert_eq!( - Ok(HandleResponse { + Ok(Response { + submessages: vec![], messages: vec![BankMsg::Send { - from_address: env.contract.address.clone(), to_address: "sender".into(), amount: coins(100, DENOM), } @@ -2476,7 +2449,6 @@ pub mod tests { try_remove_delegation_from_gateway( deps.as_mut(), mock_info("sender", &[]), - env, identity.clone(), ) ); @@ -2524,7 +2496,7 @@ pub mod tests { let expected_delegation3 = Uint128(initial_delegation3) * reward + Uint128(initial_delegation3); - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_gateway(deps.as_mut(), info, identity.clone(), 100).unwrap(); assert_eq!( @@ -2560,7 +2532,7 @@ pub mod tests { let expected_delegation2 = expected_delegation2 * scaled_reward + expected_delegation2; let expected_delegation3 = expected_delegation3 * scaled_reward + expected_delegation3; - let info = mock_info(network_monitor_address.clone(), &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_gateway(deps.as_mut(), info, identity.clone(), 20).unwrap(); assert_eq!( @@ -2590,7 +2562,7 @@ pub mod tests { ); // if the node was 0% up, nobody will get any rewards - let info = mock_info(network_monitor_address, &[]); + let info = mock_info(network_monitor_address.as_ref(), &[]); try_reward_gateway(deps.as_mut(), info, identity.clone(), 0).unwrap(); assert_eq!(