Merge branch 'feature/cosmwasm-0.14.1-update' into feature/host-ip_split
This commit is contained in:
Generated
+202
-16
@@ -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 {},
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
Generated
+364
-15
@@ -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"
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {},
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user