Merge branch 'feature/cosmwasm-0.14.1-update' into feature/host-ip_split

This commit is contained in:
Jędrzej Stuczyński
2021-06-22 09:44:02 +01:00
23 changed files with 1336 additions and 1085 deletions
Generated
+202 -16
View File
@@ -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"
@@ -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<String>,
start_after: Option<IdentityKey>,
) -> Result<PagedResponse, ValidatorClientError> {
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<String>,
start_after: Option<IdentityKey>,
) -> Result<PagedGatewayResponse, ValidatorClientError> {
let query_content_json = serde_json::to_string(&QueryRequest::GetGateways {
limit: self.config.gateway_page_limit,
@@ -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<u32>,
start_after: Option<String>,
start_after: Option<IdentityKey>,
},
GetGateways {
start_after: Option<String>,
start_after: Option<IdentityKey>,
limit: Option<u32>,
},
LayerDistribution {},
+2 -2
View File
@@ -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"
+8 -9
View File
@@ -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<Delegation>,
pub start_next_after: Option<HumanAddr>,
pub start_next_after: Option<Addr>,
}
impl PagedMixDelegationsResponse {
pub fn new(
node_identity: IdentityKey,
delegations: Vec<Delegation>,
start_next_after: Option<HumanAddr>,
start_next_after: Option<Addr>,
) -> Self {
PagedMixDelegationsResponse {
node_identity,
@@ -63,14 +62,14 @@ impl PagedMixDelegationsResponse {
pub struct PagedGatewayDelegationsResponse {
pub node_identity: IdentityKey,
pub delegations: Vec<Delegation>,
pub start_next_after: Option<HumanAddr>,
pub start_next_after: Option<Addr>,
}
impl PagedGatewayDelegationsResponse {
pub fn new(
node_identity: IdentityKey,
delegations: Vec<Delegation>,
start_next_after: Option<HumanAddr>,
start_next_after: Option<Addr>,
) -> Self {
PagedGatewayDelegationsResponse {
node_identity,
+11 -7
View File
@@ -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<Coin>,
pub owner: HumanAddr,
pub owner: Addr,
pub gateway: Gateway,
}
impl GatewayBond {
pub fn new(amount: Vec<Coin>, owner: HumanAddr, gateway: Gateway) -> Self {
pub fn new(amount: Vec<Coin>, 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<GatewayBond>,
pub per_page: usize,
pub start_next_after: Option<String>,
pub start_next_after: Option<IdentityKey>,
}
impl PagedGatewayResponse {
pub fn new(nodes: Vec<GatewayBond>, per_page: usize, start_next_after: Option<String>) -> Self {
pub fn new(
nodes: Vec<GatewayBond>,
per_page: usize,
start_next_after: Option<IdentityKey>,
) -> 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,
}
+2 -1
View File
@@ -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;
+11 -7
View File
@@ -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<Coin>,
pub owner: HumanAddr,
pub owner: Addr,
pub mix_node: MixNode,
}
impl MixNodeBond {
pub fn new(amount: Vec<Coin>, owner: HumanAddr, mix_node: MixNode) -> Self {
pub fn new(amount: Vec<Coin>, 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<MixNodeBond>,
pub per_page: usize,
pub start_next_after: Option<String>,
pub start_next_after: Option<IdentityKey>,
}
impl PagedResponse {
pub fn new(nodes: Vec<MixNodeBond>, per_page: usize, start_next_after: Option<String>) -> Self {
pub fn new(
nodes: Vec<MixNodeBond>,
per_page: usize,
start_next_after: Option<IdentityKey>,
) -> 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,
}
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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()
+364 -15
View File
@@ -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"
+4 -4
View File
@@ -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" }
+3 -3
View File
@@ -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);
+35 -327
View File
@@ -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<InitResponse, ContractError> {
_msg: InstantiateMsg,
) -> Result<Response, ContractError> {
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<HandleResponse, ContractError> {
msg: ExecuteMsg,
) -> Result<Response, ContractError> {
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<QueryResponse, ContractError> {
let query_res = match msg {
QueryMsg::GetMixNodes { start_after, limit } => {
@@ -167,128 +167,27 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result<QueryResponse, Cont
Ok(query_res?)
}
pub fn migrate(
deps: DepsMut,
_env: Env,
_info: MessageInfo,
_msg: MigrateMsg,
) -> Result<MigrateResponse, ContractError> {
// 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<HumanAddr> {
bucket(storage, PREFIX_MIXNODES_OWNERS_OLD)
}
fn gateways_owners_old(storage: &mut dyn Storage) -> Bucket<HumanAddr> {
bucket(storage, PREFIX_GATEWAYS_OWNERS_OLD)
}
fn mixnodes_old(storage: &mut dyn Storage) -> Bucket<MixNodeBond> {
bucket(storage, PREFIX_MIXNODES_OLD)
}
fn gateways_old(storage: &mut dyn Storage) -> Bucket<GatewayBond> {
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::<StdResult<Vec<MixNodeBond>>>()?;
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::<StdResult<Vec<GatewayBond>>>()?;
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<Response, ContractError> {
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<HumanAddr> {
bucket(storage, PREFIX_MIXNODES_OWNERS_OLD)
}
fn gateways_owners_old(storage: &mut dyn Storage) -> Bucket<HumanAddr> {
bucket(storage, PREFIX_GATEWAYS_OWNERS_OLD)
}
fn mixnodes_old(storage: &mut dyn Storage) -> Bucket<MixNodeBond> {
bucket(storage, PREFIX_MIXNODES_OLD)
}
fn gateways_old(storage: &mut dyn Storage) -> Bucket<GatewayBond> {
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()
);
}
}
}
+8 -8
View File
@@ -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,
},
}
+3 -11
View File
@@ -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
-3
View File
@@ -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);
+9 -9
View File
@@ -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<u32>,
},
OwnsMixnode {
address: HumanAddr,
address: Addr,
},
OwnsGateway {
address: HumanAddr,
address: Addr,
},
StateParams {},
GetMixDelegations {
mix_identity: IdentityKey,
start_after: Option<HumanAddr>,
start_after: Option<Addr>,
limit: Option<u32>,
},
GetMixDelegation {
mix_identity: IdentityKey,
address: HumanAddr,
address: Addr,
},
GetGatewayDelegations {
gateway_identity: IdentityKey,
start_after: Option<HumanAddr>,
start_after: Option<Addr>,
limit: Option<u32>,
},
GetGatewayDelegation {
gateway_identity: IdentityKey,
address: HumanAddr,
address: Addr,
},
LayerDistribution {},
}
+62 -60
View File
@@ -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<MixOwnershipResponse> {
pub(crate) fn query_owns_mixnode(deps: Deps, address: Addr) -> StdResult<MixOwnershipResponse> {
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<GatewayOwnershipResponse> {
pub(crate) fn query_owns_gateway(deps: Deps, address: Addr) -> StdResult<GatewayOwnershipResponse> {
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<S: Deref<Target = str>>(start_after: Option<S>) -> Option<Vec<u8>> {
// S works for both `String` and `Addr` and that's what we wanted
fn calculate_start_value<S: AsRef<str>>(start_after: Option<S>) -> Option<Vec<u8>> {
start_after.as_ref().map(|identity| {
identity
.as_ref()
.as_bytes()
.iter()
.cloned()
@@ -113,7 +107,7 @@ fn calculate_start_value<S: Deref<Target = str>>(start_after: Option<S>) -> Opti
pub(crate) fn query_mixnode_delegations_paged(
deps: Deps,
mix_identity: IdentityKey,
start_after: Option<HumanAddr>,
start_after: Option<Addr>,
limit: Option<u32>,
) -> StdResult<PagedMixDelegationsResponse> {
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<Delegation, ContractError> {
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<HumanAddr>,
start_after: Option<Addr>,
limit: Option<u32>,
) -> StdResult<PagedGatewayDelegationsResponse> {
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<Delegation, ContractError> {
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 {
+3 -3
View File
@@ -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
+388 -352
View File
@@ -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<Vec<_>> = 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::<StdResult<Vec<_>>>()?;
@@ -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<Vec<_>> = 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::<StdResult<Vec<_>>>()?;
@@ -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()
)
}
}
}
}
+8 -8
View File
@@ -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<MemoryStorage, MockApi, MockQuerier<Empty>> {
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<MockStorage, MockApi, MockQuerier>,
) -> Vec<Coin> {
let querier = deps.as_ref().querier;
File diff suppressed because it is too large Load Diff