Updated smart contract to work with future cosmwasm 0.14.0 update

This commit is contained in:
Jędrzej Stuczyński
2021-05-27 11:27:09 +01:00
parent aee0ec7dec
commit 99780d3eb0
18 changed files with 834 additions and 319 deletions
Generated
+177 -16
View File
@@ -223,6 +223,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"
@@ -458,6 +469,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"
@@ -504,21 +521,35 @@ 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.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de70197a0fe4e402aa260da00ec62d9bf091afe87866e9f3347691d591b60f89"
checksum = "3ddbf475b0e8a9bd813607d59144ad3f71d90dd66c5e975a46ac2b72ce754121"
dependencies = [
"digest 0.9.0",
"ed25519-zebra",
"k256",
"rand_core 0.5.1",
"thiserror",
]
[[package]]
name = "cosmwasm-derive"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4e62de21147741486c6d4adc28850b102dcad1888d9fc2d0a200ca423284563"
dependencies = [
"syn",
]
[[package]]
name = "cosmwasm-std"
version = "0.13.2"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02173c4eb78ef76863f5190f60a45278d11e7c8b142327c149e18128b2b97f85"
checksum = "db14129579ddb1dbd8a28376673d61090f35c9069978eb875d489c275bb76315"
dependencies = [
"base64 0.13.0",
"cosmwasm-crypto",
"cosmwasm-derive",
"schemars",
"serde",
@@ -604,7 +635,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]]
@@ -614,7 +645,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]]
@@ -645,7 +676,7 @@ dependencies = [
"byteorder",
"digest 0.9.0",
"rand_core 0.5.1",
"subtle 2.2.3",
"subtle 2.4.0",
"zeroize",
]
@@ -659,6 +690,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"
@@ -763,6 +803,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"
@@ -786,12 +843,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"
@@ -820,6 +909,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"
@@ -875,6 +975,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"
@@ -1078,6 +1184,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"
@@ -1126,6 +1243,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"
@@ -1344,6 +1467,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"
@@ -2140,6 +2275,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"
@@ -2242,6 +2386,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"
@@ -2574,10 +2724,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",
@@ -2585,9 +2736,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",
@@ -2674,9 +2825,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",
]
@@ -2797,6 +2948,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"
@@ -2995,9 +3150,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"
@@ -3647,6 +3802,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"
+2 -2
View File
@@ -7,6 +7,6 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
cosmwasm-std = { version = "0.13.2" }
cosmwasm-std = { version = "0.14.0" }
serde = { version = "1.0", features = ["derive"] }
schemars = "0.7"
schemars = "0.8"
+7 -11
View File
@@ -1,7 +1,7 @@
// due to code generated by JsonSchema
#![allow(clippy::field_reassign_with_default)]
use cosmwasm_std::{Coin, HumanAddr};
use cosmwasm_std::{Addr, Coin};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::fmt::Display;
@@ -49,12 +49,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,
@@ -66,7 +66,7 @@ impl GatewayBond {
&self.amount
}
pub fn owner(&self) -> &HumanAddr {
pub fn owner(&self) -> &Addr {
&self.owner
}
@@ -93,15 +93,11 @@ impl Display for GatewayBond {
pub struct PagedGatewayResponse {
pub nodes: Vec<GatewayBond>,
pub per_page: usize,
pub start_next_after: Option<HumanAddr>,
pub start_next_after: Option<Addr>,
}
impl PagedGatewayResponse {
pub fn new(
nodes: Vec<GatewayBond>,
per_page: usize,
start_next_after: Option<HumanAddr>,
) -> Self {
pub fn new(nodes: Vec<GatewayBond>, per_page: usize, start_next_after: Option<Addr>) -> Self {
PagedGatewayResponse {
nodes,
per_page,
@@ -112,6 +108,6 @@ impl PagedGatewayResponse {
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)]
pub struct GatewayOwnershipResponse {
pub address: HumanAddr,
pub address: Addr,
pub has_gateway: bool,
}
+1 -1
View File
@@ -1,6 +1,6 @@
mod gateway;
mod mixnode;
pub use cosmwasm_std::{Coin, HumanAddr};
pub use cosmwasm_std::{Coin, Addr};
pub use gateway::{Gateway, GatewayBond, GatewayOwnershipResponse, PagedGatewayResponse};
pub use mixnode::{MixNode, MixNodeBond, MixOwnershipResponse, PagedResponse};
+7 -11
View File
@@ -1,7 +1,7 @@
// due to code generated by JsonSchema
#![allow(clippy::field_reassign_with_default)]
use cosmwasm_std::{Coin, HumanAddr};
use cosmwasm_std::{Addr, Coin};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::fmt::Display;
@@ -49,12 +49,12 @@ impl MixNode {
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)]
pub struct MixNodeBond {
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,
@@ -66,7 +66,7 @@ impl MixNodeBond {
&self.amount
}
pub fn owner(&self) -> &HumanAddr {
pub fn owner(&self) -> &Addr {
&self.owner
}
@@ -97,15 +97,11 @@ impl Display for MixNodeBond {
pub struct PagedResponse {
pub nodes: Vec<MixNodeBond>,
pub per_page: usize,
pub start_next_after: Option<HumanAddr>,
pub start_next_after: Option<Addr>,
}
impl PagedResponse {
pub fn new(
nodes: Vec<MixNodeBond>,
per_page: usize,
start_next_after: Option<HumanAddr>,
) -> Self {
pub fn new(nodes: Vec<MixNodeBond>, per_page: usize, start_next_after: Option<Addr>) -> Self {
PagedResponse {
nodes,
per_page,
@@ -116,6 +112,6 @@ impl PagedResponse {
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)]
pub struct MixOwnershipResponse {
pub address: HumanAddr,
pub address: Addr,
pub has_node: bool,
}
+339 -15
View File
@@ -7,19 +7,70 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "cosmwasm-derive"
version = "0.13.2"
name = "bitvec"
version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de70197a0fe4e402aa260da00ec62d9bf091afe87866e9f3347691d591b60f89"
checksum = "98fcd36dda4e17b7d7abc64cb549bf0201f4ab71e00700c798ca7e62ed3761fa"
dependencies = [
"funty",
"radium",
"wyz",
]
[[package]]
name = "block-buffer"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
"generic-array",
]
[[package]]
name = "byteorder"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "const-oid"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f"
[[package]]
name = "cosmwasm-crypto"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ddbf475b0e8a9bd813607d59144ad3f71d90dd66c5e975a46ac2b72ce754121"
dependencies = [
"digest",
"ed25519-zebra",
"k256",
"rand_core",
"thiserror",
]
[[package]]
name = "cosmwasm-derive"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4e62de21147741486c6d4adc28850b102dcad1888d9fc2d0a200ca423284563"
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,11 +78,12 @@ dependencies = [
[[package]]
name = "cosmwasm-std"
version = "0.13.2"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02173c4eb78ef76863f5190f60a45278d11e7c8b142327c149e18128b2b97f85"
checksum = "db14129579ddb1dbd8a28376673d61090f35c9069978eb875d489c275bb76315"
dependencies = [
"base64",
"cosmwasm-crypto",
"cosmwasm-derive",
"schemars",
"serde",
@@ -41,20 +93,202 @@ dependencies = [
[[package]]
name = "cosmwasm-storage"
version = "0.13.2"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2cdb5f6c3181c921c02b0018af66178e60bc7be088f81ec730b22ff51240404"
checksum = "13b03dc324ef7b5bce224e096d67bc67e12aadc8fbacb7c8c796eac40cf7c4b8"
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 = "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 +311,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 +344,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 +367,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 +379,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 +400,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 +440,35 @@ 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 = "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 +500,38 @@ dependencies = [
"syn",
]
[[package]]
name = "typenum"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06"
[[package]]
name = "unicode-xid"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
[[package]]
name = "version_check"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "wasi"
version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]]
name = "wyz"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214"
[[package]]
name = "zeroize"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd"
+4 -4
View File
@@ -34,11 +34,11 @@ backtraces = ["cosmwasm-std/backtraces"]
[dependencies]
mixnet-contract = { path = "../../common/mixnet-contract" }
cosmwasm-std = { version = "0.13.2", features = ["iterator"] }
cosmwasm-storage = { version = "0.13.2", features = ["iterator"] }
schemars = "0.7"
cosmwasm-std = { version = "0.14.0", features = ["iterator"] }
cosmwasm-storage = { version = "0.14.0", features = ["iterator"] }
schemars = "0.8"
serde = { version = "1.0.103", default-features = false, features = ["derive"] }
thiserror = { version = "1.0.23" }
[dev-dependencies]
cosmwasm-schema = { version = "0.13.2" }
cosmwasm-schema = { version = "0.14.0" }
+3 -3
View File
@@ -1,6 +1,6 @@
use cosmwasm_schema::{export_schema, remove_schemas, schema_for};
use mixnet_contract::MixNodeBond;
use mixnet_contracts::msg::{HandleMsg, InitMsg, QueryMsg};
use mixnet_contracts::msg::{ExecuteMsg, InstantiateMsg, QueryMsg};
use mixnet_contracts::state::State;
use std::env::current_dir;
use std::fs::create_dir_all;
@@ -11,8 +11,8 @@ fn main() {
create_dir_all(&out_dir).unwrap();
remove_schemas(&out_dir).unwrap();
export_schema(&schema_for!(InitMsg), &out_dir);
export_schema(&schema_for!(HandleMsg), &out_dir);
export_schema(&schema_for!(InstantiateMsg), &out_dir);
export_schema(&schema_for!(ExecuteMsg), &out_dir);
export_schema(&schema_for!(QueryMsg), &out_dir);
export_schema(&schema_for!(State), &out_dir);
export_schema(&schema_for!(MixNodeBond), &out_dir);
+27 -28
View File
@@ -1,11 +1,11 @@
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;
use crate::{error::ContractError, queries, transactions};
use cosmwasm_std::{
to_binary, Decimal, Deps, DepsMut, Env, HandleResponse, HumanAddr, InitResponse, MessageInfo,
MigrateResponse, QueryResponse, Uint128,
entry_point, to_binary, Addr, Decimal, Deps, DepsMut, Env, MessageInfo, QueryResponse,
Response, Uint128,
};
pub const INITIAL_DEFAULT_EPOCH_LENGTH: u32 = 2;
@@ -27,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,
@@ -58,42 +58,45 @@ 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)?;
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 { owner, uptime } => {
ExecuteMsg::RewardMixnode { owner, uptime } => {
transactions::try_reward_mixnode(deps, info, owner, uptime)
}
HandleMsg::RewardGateway { owner, uptime } => {
ExecuteMsg::RewardGateway { owner, uptime } => {
transactions::try_reward_gateway(deps, info, owner, uptime)
}
}
}
#[entry_point]
pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result<QueryResponse, ContractError> {
let query_res = match msg {
QueryMsg::GetMixNodes { start_after, limit } => {
@@ -114,12 +117,8 @@ 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> {
#[entry_point]
pub fn migrate(_deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result<Response, ContractError> {
Ok(Default::default())
}
@@ -135,10 +134,10 @@ pub mod tests {
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
+4 -4
View File
@@ -1,5 +1,5 @@
use crate::contract::DENOM;
use cosmwasm_std::{HumanAddr, StdError};
use cosmwasm_std::{Addr, StdError};
use thiserror::Error;
/// Custom errors for contract failure conditions.
@@ -25,7 +25,7 @@ pub enum ContractError {
InsufficientGatewayBond { received: u128, minimum: u128 },
#[error("Account ({account:?}) does not own any gateway bonds")]
GatewayBondNotFound { account: HumanAddr },
GatewayBondNotFound { account: Addr },
#[error("Unauthorized")]
Unauthorized,
@@ -55,8 +55,8 @@ 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 },
}
+1 -1
View File
@@ -26,7 +26,7 @@ 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();
let uint128_sub_one = value_uint128.checked_sub(DECIMAL_FRACTIONAL).unwrap();
Decimal::from_ratio(uint128_sub_one, DECIMAL_FRACTIONAL)
}
-3
View File
@@ -7,6 +7,3 @@ pub mod state;
pub(crate) mod storage;
pub mod support;
pub mod transactions;
#[cfg(target_arch = "wasm32")]
cosmwasm_std::create_entry_points_with_migration!(contract);
+8 -9
View File
@@ -1,15 +1,14 @@
use crate::state::StateParams;
use cosmwasm_std::HumanAddr;
use mixnet_contract::{Gateway, 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,
},
@@ -21,13 +20,13 @@ pub enum HandleMsg {
UpdateStateParams(StateParams),
RewardMixnode {
owner: HumanAddr,
owner: String,
// percentage value in range 0-100
uptime: u32,
},
RewardGateway {
owner: HumanAddr,
owner: String,
// percentage value in range 0-100
uptime: u32,
},
@@ -38,17 +37,17 @@ pub enum HandleMsg {
pub enum QueryMsg {
GetMixNodes {
limit: Option<u32>,
start_after: Option<HumanAddr>,
start_after: Option<String>,
},
GetGateways {
start_after: Option<HumanAddr>,
start_after: Option<String>,
limit: Option<u32>,
},
OwnsMixnode {
address: HumanAddr,
address: String,
},
OwnsGateway {
address: HumanAddr,
address: String,
},
StateParams {},
}
+61 -33
View File
@@ -1,7 +1,6 @@
use crate::state::StateParams;
use crate::storage::{gateways_read, mixnodes_read, read_state_params};
use cosmwasm_std::Deps;
use cosmwasm_std::HumanAddr;
use cosmwasm_std::Order;
use cosmwasm_std::StdResult;
use mixnet_contract::{
@@ -14,11 +13,24 @@ const DEFAULT_LIMIT: u32 = 50;
pub fn query_mixnodes_paged(
deps: Deps,
start_after: Option<HumanAddr>,
start_after: Option<String>,
limit: Option<u32>,
) -> StdResult<PagedResponse> {
let input_cline = start_after.clone();
let start_after_addr = start_after
.map(|start_after| deps.api.addr_validate(&start_after)) // try to validate address
.map_or(Ok(None), |start_after| start_after.map(Some)); // move result in front of the option
let start_after_addr = match start_after_addr {
Ok(a) => a,
Err(err) => {
println!("{:?} is not a valid address", input_cline);
return Err(err);
}
};
let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize;
let start = calculate_start_value(start_after);
let start = calculate_start_value(start_after_addr);
let nodes = mixnodes_read(deps.storage)
.range(start.as_deref(), None, Order::Ascending)
@@ -33,11 +45,15 @@ pub fn query_mixnodes_paged(
pub(crate) fn query_gateways_paged(
deps: Deps,
start_after: Option<HumanAddr>,
start_after: Option<String>,
limit: Option<u32>,
) -> StdResult<PagedGatewayResponse> {
let start_after_addr = start_after
.map(|start_after| deps.api.addr_validate(&start_after)) // try to validate address
.map_or(Ok(None), |start_after| start_after.map(Some))?; // move result in front of the option
let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize;
let start = calculate_start_value(start_after);
let start = calculate_start_value(start_after_addr);
let nodes = gateways_read(deps.storage)
.range(start.as_deref(), None, Order::Ascending)
@@ -50,25 +66,29 @@ 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: String) -> StdResult<MixOwnershipResponse> {
let validated_address = deps.api.addr_validate(&address)?;
let has_node = mixnodes_read(deps.storage)
.may_load(address.as_ref())?
.may_load(validated_address.as_str().as_bytes())?
.is_some();
Ok(MixOwnershipResponse { address, has_node })
Ok(MixOwnershipResponse {
address: validated_address,
has_node,
})
}
pub(crate) fn query_owns_gateway(
deps: Deps,
address: HumanAddr,
address: String,
) -> StdResult<GatewayOwnershipResponse> {
let validated_address = deps.api.addr_validate(&address)?;
let has_gateway = gateways_read(deps.storage)
.may_load(address.as_ref())?
.may_load(validated_address.as_str().as_bytes())?
.is_some();
Ok(GatewayOwnershipResponse {
address,
address: validated_address,
has_gateway,
})
}
@@ -79,11 +99,9 @@ pub(crate) fn query_state_params(deps: Deps) -> StateParams {
/// 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.
fn calculate_start_value(
start_after: std::option::Option<cosmwasm_std::HumanAddr>,
) -> Option<Vec<u8>> {
fn calculate_start_value(start_after: std::option::Option<cosmwasm_std::Addr>) -> Option<Vec<u8>> {
start_after.as_ref().map(|addr| {
let mut bytes = addr.as_bytes().to_owned();
let mut bytes = addr.as_str().as_bytes().to_owned();
bytes.push(0);
bytes
})
@@ -95,7 +113,7 @@ mod tests {
use crate::state::State;
use crate::storage::{config, gateways, mixnodes};
use crate::support::tests::helpers;
use cosmwasm_std::Storage;
use cosmwasm_std::{Addr, Storage};
#[test]
fn mixnodes_empty_on_init() {
@@ -157,10 +175,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;
@@ -171,7 +194,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
@@ -179,7 +202,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
@@ -187,7 +210,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 = HumanAddr::from("2");
let start_after = String::from(addr2);
let page2 = query_mixnodes_paged(
deps.as_ref(),
Option::from(start_after),
@@ -199,10 +222,10 @@ mod tests {
// save another one
mixnodes(&mut deps.storage)
.save("4".as_bytes(), &node)
.save(addr4.as_bytes(), &node)
.unwrap();
let start_after = HumanAddr::from("2");
let start_after = String::from(addr2);
let page2 = query_mixnodes_paged(
deps.as_ref(),
Option::from(start_after),
@@ -269,10 +292,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;
@@ -283,7 +311,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
@@ -291,7 +319,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
@@ -299,7 +327,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 = HumanAddr::from("2");
let start_after = String::from(addr2);
let page2 = query_gateways_paged(
deps.as_ref(),
Option::from(start_after),
@@ -311,10 +339,10 @@ mod tests {
// save another one
gateways(&mut deps.storage)
.save("4".as_bytes(), &node)
.save(addr4.as_bytes(), &node)
.unwrap();
let start_after = HumanAddr::from("2");
let start_after = String::from(addr2);
let page2 = query_gateways_paged(
deps.as_ref(),
Option::from(start_after),
@@ -395,8 +423,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(),
+3 -3
View File
@@ -1,11 +1,11 @@
use cosmwasm_std::{Decimal, HumanAddr, Uint128};
use cosmwasm_std::{Addr, Decimal, Uint128};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct State {
pub owner: HumanAddr, // only the owner account can update state
pub network_monitor_address: HumanAddr,
pub owner: Addr, // only the owner account can update state
pub network_monitor_address: Addr,
pub params: StateParams,
// helper values to avoid having to recalculate them on every single payment operation
+9 -9
View File
@@ -1,5 +1,5 @@
use crate::state::{State, StateParams};
use cosmwasm_std::{Decimal, HumanAddr, StdError, StdResult, Storage};
use cosmwasm_std::{Addr, Decimal, StdError, StdResult, Storage};
use cosmwasm_storage::{
bucket, bucket_read, singleton, singleton_read, Bucket, ReadonlyBucket, ReadonlySingleton,
Singleton,
@@ -53,11 +53,11 @@ pub fn mixnodes_read(storage: &dyn Storage) -> ReadonlyBucket<MixNodeBond> {
const PREFIX_MIXNODES_OWNERS: &[u8] = b"mix-owners";
pub fn mixnodes_owners(storage: &mut dyn Storage) -> Bucket<HumanAddr> {
pub fn mixnodes_owners(storage: &mut dyn Storage) -> Bucket<Addr> {
bucket(storage, PREFIX_MIXNODES_OWNERS)
}
pub fn mixnodes_owners_read(storage: &dyn Storage) -> ReadonlyBucket<HumanAddr> {
pub fn mixnodes_owners_read(storage: &dyn Storage) -> ReadonlyBucket<Addr> {
bucket_read(storage, PREFIX_MIXNODES_OWNERS)
}
@@ -110,11 +110,11 @@ pub fn gateways_read(storage: &dyn Storage) -> ReadonlyBucket<GatewayBond> {
const PREFIX_GATEWAYS_OWNERS: &[u8] = b"gateway-owners";
pub fn gateways_owners(storage: &mut dyn Storage) -> Bucket<HumanAddr> {
pub fn gateways_owners(storage: &mut dyn Storage) -> Bucket<Addr> {
bucket(storage, PREFIX_GATEWAYS_OWNERS)
}
pub fn gateways_owners_read(storage: &dyn Storage) -> ReadonlyBucket<HumanAddr> {
pub fn gateways_owners_read(storage: &dyn Storage) -> ReadonlyBucket<Addr> {
bucket_read(storage, PREFIX_GATEWAYS_OWNERS)
}
@@ -204,7 +204,7 @@ mod tests {
// increases the reward appropriately if node exists
let mixnode_bond = MixNodeBond {
amount: coins(1000, DENOM),
owner: std::str::from_utf8(node_owner).unwrap().into(),
owner: Addr::unchecked(std::str::from_utf8(node_owner).unwrap()),
mix_node: mix_node_fixture(),
};
@@ -231,7 +231,7 @@ mod tests {
let mixnode_bond = MixNodeBond {
amount: coins(bond_value, DENOM),
owner: std::str::from_utf8(node_owner).unwrap().into(),
owner: Addr::unchecked(std::str::from_utf8(node_owner).unwrap()),
mix_node: mix_node_fixture(),
};
@@ -259,7 +259,7 @@ mod tests {
// increases the reward appropriately if node exists
let gateway_bond = GatewayBond {
amount: coins(1000, DENOM),
owner: std::str::from_utf8(node_owner).unwrap().into(),
owner: Addr::unchecked(std::str::from_utf8(node_owner).unwrap()),
gateway: gateway_fixture(),
};
@@ -286,7 +286,7 @@ mod tests {
let gateway_bond = GatewayBond {
amount: coins(1000, DENOM),
owner: std::str::from_utf8(node_owner).unwrap().into(),
owner: Addr::unchecked(std::str::from_utf8(node_owner).unwrap()),
gateway: gateway_fixture(),
};
+8 -8
View File
@@ -1,10 +1,10 @@
#[cfg(test)]
pub mod helpers {
use super::*;
use crate::contract::init;
use crate::contract::instantiate;
use crate::contract::query;
use crate::contract::DENOM;
use crate::msg::InitMsg;
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::{
@@ -93,10 +93,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;
}
@@ -120,7 +120,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 {
@@ -143,11 +143,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;
+173 -158
View File
@@ -8,9 +8,7 @@ use crate::storage::{
mixnodes_read, read_gateway_epoch_reward_rate, read_mixnode_epoch_reward_rate,
read_state_params,
};
use cosmwasm_std::{
attr, BankMsg, Coin, Decimal, DepsMut, Env, HandleResponse, HumanAddr, MessageInfo, Uint128,
};
use cosmwasm_std::{attr, BankMsg, Coin, Decimal, DepsMut, MessageInfo, Response, Uint128};
use mixnet_contract::{Gateway, GatewayBond, MixNode, MixNodeBond};
fn validate_mixnode_bond(bond: &[Coin], minimum_bond: Uint128) -> Result<(), ContractError> {
@@ -43,17 +41,17 @@ pub(crate) fn try_add_mixnode(
deps: DepsMut,
info: MessageInfo,
mix_node: MixNode,
) -> Result<HandleResponse, ContractError> {
) -> Result<Response, ContractError> {
// if the client has an active bonded gateway, don't allow mixnode bonding
if gateways_read(deps.storage)
.may_load(info.sender.as_ref())?
.may_load(info.sender.as_str().as_bytes())?
.is_some()
{
return Err(ContractError::AlreadyOwnsGateway);
}
let minimum_bond = read_state_params(deps.storage).minimum_mixnode_bond;
validate_mixnode_bond(&info.sent_funds, minimum_bond)?;
validate_mixnode_bond(&info.funds, minimum_bond)?;
// check if this node wasn't already claimed by somebody else
let mut was_present = false;
@@ -68,9 +66,9 @@ pub(crate) fn try_add_mixnode(
was_present = true
}
let bond = MixNodeBond::new(info.sent_funds, info.sender.clone(), mix_node);
let bond = MixNodeBond::new(info.funds, info.sender.clone(), mix_node);
let sender_bytes = info.sender.as_bytes();
let sender_bytes = info.sender.as_str().as_bytes();
let attributes = vec![attr("overwritten", was_present)];
// TODO: now this can be potentially problematic. What if the first call doesn't fail but the second one does?
@@ -78,8 +76,9 @@ pub(crate) fn try_add_mixnode(
mixnodes(deps.storage).save(sender_bytes, &bond)?;
mixnodes_owners(deps.storage).save(bond.mix_node.identity_key.as_bytes(), &info.sender)?;
Ok(HandleResponse {
messages: vec![],
Ok(Response {
submessages: Vec::new(),
messages: Vec::new(),
attributes,
data: None,
})
@@ -88,30 +87,31 @@ pub(crate) fn try_add_mixnode(
pub(crate) fn try_remove_mixnode(
deps: DepsMut,
info: MessageInfo,
env: Env,
) -> Result<HandleResponse, ContractError> {
) -> Result<Response, ContractError> {
let sender_bytes = info.sender.as_str().as_bytes();
// find the bond, return ContractError::MixNodeBondNotFound if it doesn't exist
let mixnode_bond = mixnodes_read(deps.storage)
.may_load(info.sender.as_bytes())?
.may_load(sender_bytes)?
.ok_or(ContractError::MixNodeBondNotFound {})?;
// send bonded funds back to the bond owner
let messages = vec![BankMsg::Send {
from_address: env.contract.address,
to_address: info.sender.clone(),
to_address: info.sender.as_str().to_owned(),
amount: mixnode_bond.amount().to_vec(),
}
.into()];
// remove the bond from the list of bonded mixnodes
mixnodes(deps.storage).remove(info.sender.as_bytes());
mixnodes(deps.storage).remove(sender_bytes);
// remove the node ownership
mixnodes_owners(deps.storage).remove(mixnode_bond.mix_node.identity_key.as_bytes());
// log our actions
let attributes = vec![attr("action", "unbond"), attr("mixnode_bond", mixnode_bond)];
Ok(HandleResponse {
Ok(Response {
submessages: Vec::new(),
messages,
attributes,
data: None,
@@ -148,17 +148,17 @@ pub(crate) fn try_add_gateway(
deps: DepsMut,
info: MessageInfo,
gateway: Gateway,
) -> Result<HandleResponse, ContractError> {
) -> Result<Response, ContractError> {
// if the client has an active bonded mixnode, don't allow gateway bonding
if mixnodes_read(deps.storage)
.may_load(info.sender.as_ref())?
.may_load(info.sender.as_str().as_bytes())?
.is_some()
{
return Err(ContractError::AlreadyOwnsMixnode);
}
let minimum_bond = read_state_params(deps.storage).minimum_gateway_bond;
validate_gateway_bond(&info.sent_funds, minimum_bond)?;
validate_gateway_bond(&info.funds, minimum_bond)?;
// check if this node wasn't already claimed by somebody else
let mut was_present = false;
@@ -173,9 +173,9 @@ pub(crate) fn try_add_gateway(
was_present = true;
}
let bond = GatewayBond::new(info.sent_funds, info.sender.clone(), gateway);
let bond = GatewayBond::new(info.funds, info.sender.clone(), gateway);
let sender_bytes = info.sender.as_bytes();
let sender_bytes = info.sender.as_str().as_bytes();
let attributes = vec![attr("overwritten", was_present)];
// TODO: now this can be potentially problematic. What if the first call doesn't fail but the second one does?
@@ -183,8 +183,9 @@ pub(crate) fn try_add_gateway(
gateways(deps.storage).save(sender_bytes, &bond)?;
gateways_owners(deps.storage).save(bond.gateway.identity_key.as_bytes(), &info.sender)?;
Ok(HandleResponse {
messages: vec![],
Ok(Response {
submessages: Vec::new(),
messages: Vec::new(),
attributes,
data: None,
})
@@ -193,9 +194,8 @@ pub(crate) fn try_add_gateway(
pub(crate) fn try_remove_gateway(
deps: DepsMut,
info: MessageInfo,
env: Env,
) -> Result<HandleResponse, ContractError> {
let sender_bytes = info.sender.as_bytes();
) -> Result<Response, ContractError> {
let sender_bytes = info.sender.as_str().as_bytes();
// find the bond, return ContractError::GatewayBondNotFound if it doesn't exist
let gateway_bond = match gateways_read(deps.storage).may_load(sender_bytes)? {
@@ -209,8 +209,7 @@ pub(crate) fn try_remove_gateway(
// send bonded funds back to the bond owner
let messages = vec![BankMsg::Send {
from_address: env.contract.address,
to_address: info.sender.clone(),
to_address: info.sender.as_str().to_owned(),
amount: gateway_bond.amount().to_vec(),
}
.into()];
@@ -227,7 +226,8 @@ pub(crate) fn try_remove_gateway(
attr("gateway_bond", gateway_bond),
];
Ok(HandleResponse {
Ok(Response {
submessages: Vec::new(),
messages,
attributes,
data: None,
@@ -238,7 +238,7 @@ pub(crate) fn try_update_state_params(
deps: DepsMut,
info: MessageInfo,
params: StateParams,
) -> Result<HandleResponse, ContractError> {
) -> Result<Response, ContractError> {
// note: In any other case, I wouldn't have attempted to unwrap this result, but in here
// if we fail to load the stored state we would already be in the undefined behaviour land,
// so we better just blow up immediately.
@@ -279,36 +279,43 @@ pub(crate) fn try_update_state_params(
config(deps.storage).save(&state)?;
Ok(HandleResponse::default())
Ok(Response::default())
}
pub(crate) fn try_reward_mixnode(
deps: DepsMut,
info: MessageInfo,
node_owner: HumanAddr,
node_owner: String,
uptime: u32,
) -> Result<HandleResponse, ContractError> {
) -> Result<Response, ContractError> {
let state = config_read(deps.storage).load().unwrap();
// check if this is executed by the monitor, if not reject the transaction
if info.sender != state.network_monitor_address {
return Err(ContractError::Unauthorized);
}
// in theory network monitor should never send untrusted data, but validating it regardless
// wouldn't hurt...
let validated_address = deps.api.addr_validate(&node_owner)?;
let reward = read_mixnode_epoch_reward_rate(deps.storage);
let scaled_reward = scale_reward_by_uptime(reward, uptime)?;
increase_mixnode_bond(deps.storage, node_owner.as_bytes(), scaled_reward)?;
increase_mixnode_bond(
deps.storage,
validated_address.as_str().as_bytes(),
scaled_reward,
)?;
Ok(HandleResponse::default())
Ok(Response::default())
}
pub(crate) fn try_reward_gateway(
deps: DepsMut,
info: MessageInfo,
gateway_owner: HumanAddr,
gateway_owner: String,
uptime: u32,
) -> Result<HandleResponse, ContractError> {
) -> Result<Response, ContractError> {
let state = config_read(deps.storage).load().unwrap();
// check if this is executed by the owner, if not reject the transaction
@@ -316,29 +323,37 @@ pub(crate) fn try_reward_gateway(
return Err(ContractError::Unauthorized);
}
// in theory network monitor should never send untrusted data, but validating it regardless
// wouldn't hurt...
let validated_address = deps.api.addr_validate(&gateway_owner)?;
let reward = read_gateway_epoch_reward_rate(deps.storage);
let scaled_reward = scale_reward_by_uptime(reward, uptime)?;
increase_gateway_bond(deps.storage, gateway_owner.as_bytes(), scaled_reward)?;
increase_gateway_bond(
deps.storage,
validated_address.as_str().as_bytes(),
scaled_reward,
)?;
Ok(HandleResponse::default())
Ok(Response::default())
}
#[cfg(test)]
pub mod tests {
use super::*;
use crate::contract::{
handle, init, query, INITIAL_DEFAULT_EPOCH_LENGTH, INITIAL_GATEWAY_BOND,
execute, instantiate, query, INITIAL_DEFAULT_EPOCH_LENGTH, INITIAL_GATEWAY_BOND,
INITIAL_GATEWAY_BOND_REWARD_RATE, INITIAL_MIXNODE_BOND, INITIAL_MIXNODE_BOND_REWARD_RATE,
};
use crate::helpers::calculate_epoch_reward_rate;
use crate::msg::{HandleMsg, InitMsg, QueryMsg};
use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg};
use crate::state::StateParams;
use crate::storage::{read_gateway_bond, read_gateway_epoch_reward_rate, read_mixnode_bond};
use crate::support::tests::helpers;
use crate::support::tests::helpers::{gateway_fixture, mix_node_fixture};
use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info};
use cosmwasm_std::{coins, from_binary, Uint128};
use cosmwasm_std::{coins, from_binary, Addr, Uint128};
use mixnet_contract::{PagedGatewayResponse, PagedResponse};
fn good_mixnode_bond() -> Vec<Coin> {
@@ -356,7 +371,7 @@ pub mod tests {
// you must send at least 100 coins...
let mut bond = good_mixnode_bond();
bond[0].amount = (INITIAL_MIXNODE_BOND - Uint128(1)).unwrap();
bond[0].amount = INITIAL_MIXNODE_BOND.checked_sub(Uint128(1)).unwrap();
let result = validate_mixnode_bond(&bond, INITIAL_MIXNODE_BOND);
assert_eq!(
result,
@@ -391,12 +406,12 @@ pub mod tests {
// if we don't send enough funds
let insufficient_bond = Into::<u128>::into(INITIAL_MIXNODE_BOND) - 1;
let info = mock_info("anyone", &coins(insufficient_bond, DENOM));
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: helpers::mix_node_fixture(),
};
// we are informed that we didn't send enough funds
let result = handle(deps.as_mut(), mock_env(), info, msg);
let result = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(
result,
Err(ContractError::InsufficientMixNodeBond {
@@ -420,7 +435,7 @@ pub mod tests {
// if we send enough funds
let info = mock_info("anyone", &coins(1000_000000, DENOM));
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "anyonesmixnode".into(),
..helpers::mix_node_fixture()
@@ -428,7 +443,7 @@ pub mod tests {
};
// we get back a message telling us everything was OK
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert!(handle_response.is_ok());
// we can query topology and the new node is there
@@ -453,18 +468,18 @@ pub mod tests {
// if there was already a mixnode bonded by particular user
let info = mock_info("foomper", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "foompermixnode".into(),
..helpers::mix_node_fixture()
},
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap();
let handle_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap();
assert_eq!(handle_response.attributes[0], attr("overwritten", false));
let info = mock_info("foomper", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "foompermixnode".into(),
..helpers::mix_node_fixture()
@@ -472,33 +487,33 @@ pub mod tests {
};
// we get a log message about it (TODO: does it get back to the user?)
let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap();
let handle_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap();
assert_eq!(handle_response.attributes[0], attr("overwritten", true));
// bonding fails if the user already owns a gateway
let info = mock_info("gateway-owner", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: helpers::gateway_fixture(),
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
let info = mock_info("gateway-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: helpers::mix_node_fixture(),
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(handle_response, Err(ContractError::AlreadyOwnsGateway));
// but after he unbonds it, it's all fine again
let info = mock_info("gateway-owner", &[]);
let msg = HandleMsg::UnbondGateway {};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
let msg = ExecuteMsg::UnbondGateway {};
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
let info = mock_info("gateway-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: helpers::mix_node_fixture(),
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert!(handle_response.is_ok());
// adding another node from another account, but with the same IP, should fail (or we would have a weird state). Is that right? Think about this, not sure yet.
@@ -510,7 +525,7 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("mix-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "myAwesomeMixnode".to_string(),
..helpers::mix_node_fixture()
@@ -524,11 +539,11 @@ pub mod tests {
.is_none());
// it's all fine, owner is saved
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert!(handle_response.is_ok());
assert_eq!(
HumanAddr::from("mix-owner"),
Addr::unchecked("mix-owner"),
mixnodes_owners_read(deps.as_ref().storage)
.load("myAwesomeMixnode".as_bytes())
.unwrap()
@@ -540,35 +555,35 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("mix-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "myAwesomeMixnode".to_string(),
..helpers::mix_node_fixture()
},
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
// request fails giving the existing owner address in the message
let info = mock_info("mix-owner-pretender", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "myAwesomeMixnode".to_string(),
..helpers::mix_node_fixture()
},
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(
Err(ContractError::DuplicateMixnode {
owner: "mix-owner".into()
owner: Addr::unchecked("mix-owner")
}),
handle_response
);
// owner is not changed
assert_eq!(
HumanAddr::from("mix-owner"),
Addr::unchecked("mix-owner"),
mixnodes_owners_read(deps.as_ref().storage)
.load("myAwesomeMixnode".as_bytes())
.unwrap()
@@ -580,7 +595,7 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("mix-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "myAwesomeMixnode".to_string(),
host: "1.1.1.1:1789".into(),
@@ -588,10 +603,10 @@ pub mod tests {
},
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
let info = mock_info("mix-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "myAwesomeMixnode".to_string(),
host: "2.2.2.2:1789".into(),
@@ -599,7 +614,7 @@ pub mod tests {
},
};
assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok());
// make sure the host information was updated
assert_eq!(
@@ -613,7 +628,7 @@ pub mod tests {
// and nothing was changed regarding ownership
assert_eq!(
HumanAddr::from("mix-owner"),
Addr::unchecked("mix-owner"),
mixnodes_owners_read(deps.as_ref().storage)
.load("myAwesomeMixnode".as_bytes())
.unwrap()
@@ -624,14 +639,14 @@ pub mod tests {
fn mixnode_remove() {
let env = mock_env();
let mut deps = mock_dependencies(&[]);
let msg = InitMsg {};
let msg = InstantiateMsg {};
let info = mock_info("creator", &[]);
init(deps.as_mut(), env.clone(), info, msg).unwrap();
instantiate(deps.as_mut(), env.clone(), info, msg).unwrap();
// try un-registering when no nodes exist yet
let info = mock_info("anyone", &coins(999_9999, DENOM));
let msg = HandleMsg::UnbondMixnode {};
let result = handle(deps.as_mut(), mock_env(), info, msg);
let msg = ExecuteMsg::UnbondMixnode {};
let result = execute(deps.as_mut(), mock_env(), info, msg);
// we're told that there is no node for our address
assert_eq!(result, Err(ContractError::MixNodeBondNotFound {}));
@@ -641,8 +656,8 @@ pub mod tests {
// attempt to un-register fred's node, which doesn't exist
let info = mock_info("fred", &coins(999_9999, DENOM));
let msg = HandleMsg::UnbondMixnode {};
let result = handle(deps.as_mut(), mock_env(), info, msg);
let msg = ExecuteMsg::UnbondMixnode {};
let result = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(result, Err(ContractError::MixNodeBondNotFound {}));
// bob's node is still there
@@ -658,7 +673,7 @@ pub mod tests {
let page: PagedResponse = from_binary(&res).unwrap();
let first_node = &page.nodes[0];
assert_eq!(1, page.nodes.len());
assert_eq!("bob", first_node.owner());
assert_eq!(&Addr::unchecked("bob"), first_node.owner());
// add a node owned by fred
let fred_bond = good_mixnode_bond();
@@ -669,8 +684,8 @@ pub mod tests {
// un-register fred's node
let info = mock_info("fred", &coins(999_9999, DENOM));
let msg = HandleMsg::UnbondMixnode {};
let remove_fred = handle(deps.as_mut(), mock_env(), info.clone(), msg).unwrap();
let msg = ExecuteMsg::UnbondMixnode {};
let remove_fred = execute(deps.as_mut(), mock_env(), info.clone(), msg).unwrap();
// we should see log messages come back showing an unbond message
let expected_attributes = vec![
@@ -683,14 +698,14 @@ pub mod tests {
// we should see a funds transfer from the contract back to fred
let expected_messages = vec![BankMsg::Send {
from_address: env.contract.address,
to_address: info.sender,
to_address: info.sender.as_str().to_owned(),
amount: fred_bond,
}
.into()];
// run the handler and check that we got back the correct results
let expected = HandleResponse {
let expected = Response {
submessages: Vec::new(),
messages: expected_messages,
attributes: expected_attributes,
data: None,
@@ -700,7 +715,7 @@ pub mod tests {
// only 1 node now exists, owned by bob:
let mix_node_bonds = helpers::get_mix_nodes(&mut deps);
assert_eq!(1, mix_node_bonds.len());
assert_eq!("bob", mix_node_bonds[0].owner());
assert_eq!(&Addr::unchecked("bob"), mix_node_bonds[0].owner());
}
#[test]
@@ -708,25 +723,25 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("mix-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "myAwesomeMixnode".to_string(),
..helpers::mix_node_fixture()
},
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
assert_eq!(
HumanAddr::from("mix-owner"),
Addr::unchecked("mix-owner"),
mixnodes_owners_read(deps.as_ref().storage)
.load("myAwesomeMixnode".as_bytes())
.unwrap()
);
let info = mock_info("mix-owner", &[]);
let msg = HandleMsg::UnbondMixnode {};
let msg = ExecuteMsg::UnbondMixnode {};
assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(mixnodes_owners_read(deps.as_ref().storage)
.may_load("myAwesomeMixnode".as_bytes())
@@ -735,16 +750,16 @@ pub mod tests {
// and since it's removed, it can be reclaimed
let info = mock_info("mix-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: MixNode {
identity_key: "myAwesomeMixnode".to_string(),
..helpers::mix_node_fixture()
},
};
assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok());
assert_eq!(
HumanAddr::from("mix-owner"),
Addr::unchecked("mix-owner"),
mixnodes_owners_read(deps.as_ref().storage)
.load("myAwesomeMixnode".as_bytes())
.unwrap()
@@ -766,7 +781,7 @@ pub mod tests {
// you must send at least 100 coins...
let mut bond = good_gateway_bond();
bond[0].amount = (INITIAL_GATEWAY_BOND - Uint128(1)).unwrap();
bond[0].amount = INITIAL_GATEWAY_BOND.checked_sub(Uint128(1)).unwrap();
let result = validate_gateway_bond(&bond, INITIAL_GATEWAY_BOND);
assert_eq!(
result,
@@ -801,12 +816,12 @@ pub mod tests {
// if we fail validation (by say not sending enough funds
let insufficient_bond = Into::<u128>::into(INITIAL_GATEWAY_BOND) - 1;
let info = mock_info("anyone", &coins(insufficient_bond, DENOM));
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: helpers::gateway_fixture(),
};
// we are informed that we didn't send enough funds
let result = handle(deps.as_mut(), mock_env(), info, msg);
let result = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(
result,
Err(ContractError::InsufficientGatewayBond {
@@ -830,7 +845,7 @@ pub mod tests {
// if we send enough funds
let info = mock_info("anyone", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "anyonesgateway".into(),
..helpers::gateway_fixture()
@@ -838,7 +853,7 @@ pub mod tests {
};
// we get back a message telling us everything was OK
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert!(handle_response.is_ok());
// we can query topology and the new node is there
@@ -863,18 +878,18 @@ pub mod tests {
// if there was already a gateway bonded by particular user
let info = mock_info("foomper", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "foompersgateway".into(),
..helpers::gateway_fixture()
},
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap();
let handle_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap();
assert_eq!(handle_response.attributes[0], attr("overwritten", false));
let info = mock_info("foomper", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "foompersgateway".into(),
..helpers::gateway_fixture()
@@ -882,33 +897,33 @@ pub mod tests {
};
// we get a log message about it (TODO: does it get back to the user?)
let handle_response = handle(deps.as_mut(), mock_env(), info, msg).unwrap();
let handle_response = execute(deps.as_mut(), mock_env(), info, msg).unwrap();
assert_eq!(handle_response.attributes[0], attr("overwritten", true));
// bonding fails if the user already owns a mixnode
let info = mock_info("mixnode-owner", &good_mixnode_bond());
let msg = HandleMsg::BondMixnode {
let msg = ExecuteMsg::BondMixnode {
mix_node: helpers::mix_node_fixture(),
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
let info = mock_info("mixnode-owner", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: helpers::gateway_fixture(),
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(handle_response, Err(ContractError::AlreadyOwnsMixnode));
// but after he unbonds it, it's all fine again
let info = mock_info("mixnode-owner", &[]);
let msg = HandleMsg::UnbondMixnode {};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
let msg = ExecuteMsg::UnbondMixnode {};
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
let info = mock_info("mixnode-owner", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: helpers::gateway_fixture(),
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert!(handle_response.is_ok());
// adding another node from another account, but with the same IP, should fail (or we would have a weird state).
@@ -920,7 +935,7 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("gateway-owner", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "myAwesomeGateway".to_string(),
..helpers::gateway_fixture()
@@ -934,11 +949,11 @@ pub mod tests {
.is_none());
// it's all fine, owner is saved
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert!(handle_response.is_ok());
assert_eq!(
HumanAddr::from("gateway-owner"),
Addr::unchecked("gateway-owner"),
gateways_owners_read(deps.as_ref().storage)
.load("myAwesomeGateway".as_bytes())
.unwrap()
@@ -950,35 +965,35 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("gateway-owner", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "myAwesomeGateway".to_string(),
..helpers::gateway_fixture()
},
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
// request fails giving the existing owner address in the message
let info = mock_info("gateway-owner-pretender", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "myAwesomeGateway".to_string(),
..helpers::gateway_fixture()
},
};
let handle_response = handle(deps.as_mut(), mock_env(), info, msg);
let handle_response = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(
Err(ContractError::DuplicateGateway {
owner: "gateway-owner".into()
owner: Addr::unchecked("gateway-owner")
}),
handle_response
);
// owner is not changed
assert_eq!(
HumanAddr::from("gateway-owner"),
Addr::unchecked("gateway-owner"),
gateways_owners_read(deps.as_ref().storage)
.load("myAwesomeGateway".as_bytes())
.unwrap()
@@ -990,7 +1005,7 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("gateway-owner", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "myAwesomeGateway".to_string(),
mix_host: "1.1.1.1:1789".into(),
@@ -998,10 +1013,10 @@ pub mod tests {
},
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
let info = mock_info("gateway-owner", &good_gateway_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "myAwesomeGateway".to_string(),
mix_host: "2.2.2.2:1789".into(),
@@ -1009,7 +1024,7 @@ pub mod tests {
},
};
assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok());
// make sure the host information was updated
assert_eq!(
@@ -1023,7 +1038,7 @@ pub mod tests {
// and nothing was changed regarding ownership
assert_eq!(
HumanAddr::from("gateway-owner"),
Addr::unchecked("gateway-owner"),
gateways_owners_read(deps.as_ref().storage)
.load("myAwesomeGateway".as_bytes())
.unwrap()
@@ -1034,20 +1049,20 @@ pub mod tests {
fn gateway_remove() {
let env = mock_env();
let mut deps = mock_dependencies(&[]);
let msg = InitMsg {};
let msg = InstantiateMsg {};
let info = mock_info("creator", &[]);
init(deps.as_mut(), env.clone(), info, msg).unwrap();
instantiate(deps.as_mut(), env.clone(), info, msg).unwrap();
// try unbond when no nodes exist yet
let info = mock_info("anyone", &[]);
let msg = HandleMsg::UnbondGateway {};
let result = handle(deps.as_mut(), mock_env(), info, msg);
let msg = ExecuteMsg::UnbondGateway {};
let result = execute(deps.as_mut(), mock_env(), info, msg);
// we're told that there is no node for our address
assert_eq!(
result,
Err(ContractError::GatewayBondNotFound {
account: "anyone".into()
account: Addr::unchecked("anyone")
})
);
@@ -1056,12 +1071,12 @@ pub mod tests {
// attempt to unbond fred's node, which doesn't exist
let info = mock_info("fred", &[]);
let msg = HandleMsg::UnbondGateway {};
let result = handle(deps.as_mut(), mock_env(), info, msg);
let msg = ExecuteMsg::UnbondGateway {};
let result = execute(deps.as_mut(), mock_env(), info, msg);
assert_eq!(
result,
Err(ContractError::GatewayBondNotFound {
account: "fred".into()
account: Addr::unchecked("fred")
})
);
@@ -1070,7 +1085,7 @@ pub mod tests {
assert_eq!(1, nodes.len());
let first_node = &nodes[0];
assert_eq!("bob", first_node.owner());
assert_eq!(&Addr::unchecked("bob"), first_node.owner());
// add a node owned by fred
let fred_bond = good_gateway_bond();
@@ -1081,8 +1096,8 @@ pub mod tests {
// unbond fred's node
let info = mock_info("fred", &[]);
let msg = HandleMsg::UnbondGateway {};
let remove_fred = handle(deps.as_mut(), mock_env(), info.clone(), msg).unwrap();
let msg = ExecuteMsg::UnbondGateway {};
let remove_fred = execute(deps.as_mut(), mock_env(), info.clone(), msg).unwrap();
// we should see log messages come back showing an unbond message
let expected_attributes = vec![
@@ -1096,14 +1111,14 @@ pub mod tests {
// we should see a funds transfer from the contract back to fred
let expected_messages = vec![BankMsg::Send {
from_address: env.contract.address,
to_address: info.sender,
to_address: info.sender.as_str().to_owned(),
amount: fred_bond,
}
.into()];
// run the handler and check that we got back the correct results
let expected = HandleResponse {
let expected = Response {
submessages: Vec::new(),
messages: expected_messages,
attributes: expected_attributes,
data: None,
@@ -1113,7 +1128,7 @@ pub mod tests {
// only 1 node now exists, owned by bob:
let gateway_bonds = helpers::get_gateways(&mut deps);
assert_eq!(1, gateway_bonds.len());
assert_eq!("bob", gateway_bonds[0].owner());
assert_eq!(&Addr::unchecked("bob"), gateway_bonds[0].owner());
}
#[test]
@@ -1121,25 +1136,25 @@ pub mod tests {
let mut deps = helpers::init_contract();
let info = mock_info("gateway-owner", &good_mixnode_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "myAwesomeGateway".to_string(),
..helpers::gateway_fixture()
},
};
handle(deps.as_mut(), mock_env(), info, msg).unwrap();
execute(deps.as_mut(), mock_env(), info, msg).unwrap();
assert_eq!(
HumanAddr::from("gateway-owner"),
Addr::unchecked("gateway-owner"),
gateways_owners_read(deps.as_ref().storage)
.load("myAwesomeGateway".as_bytes())
.unwrap()
);
let info = mock_info("gateway-owner", &[]);
let msg = HandleMsg::UnbondGateway {};
let msg = ExecuteMsg::UnbondGateway {};
assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(gateways_owners_read(deps.as_ref().storage)
.may_load("myAwesomeGateway".as_bytes())
@@ -1148,16 +1163,16 @@ pub mod tests {
// and since it's removed, it can be reclaimed
let info = mock_info("gateway-owner", &good_mixnode_bond());
let msg = HandleMsg::BondGateway {
let msg = ExecuteMsg::BondGateway {
gateway: Gateway {
identity_key: "myAwesomeGateway".to_string(),
..helpers::gateway_fixture()
},
};
assert!(handle(deps.as_mut(), mock_env(), info, msg).is_ok());
assert!(execute(deps.as_mut(), mock_env(), info, msg).is_ok());
assert_eq!(
HumanAddr::from("gateway-owner"),
Addr::unchecked("gateway-owner"),
gateways_owners_read(deps.as_ref().storage)
.load("myAwesomeGateway".as_bytes())
.unwrap()
@@ -1185,7 +1200,7 @@ pub mod tests {
// but works fine from the creator account
let info = mock_info("creator", &[]);
let res = try_update_state_params(deps.as_mut(), info, new_params.clone());
assert_eq!(res, Ok(HandleResponse::default()));
assert_eq!(res, Ok(Response::default()));
// and the state is actually updated
let current_state = config_read(deps.as_ref().storage).load().unwrap();
@@ -1289,14 +1304,14 @@ pub mod tests {
assert_eq!(res, Err(ContractError::Unauthorized));
// errors out if the target owner hasn't bound any mixnodes
let info = mock_info(network_monitor_address.clone(), &[]);
let info = mock_info(network_monitor_address.as_str(), &[]);
let res = try_reward_mixnode(deps.as_mut(), info, "node-owner".into(), 100);
assert!(res.is_err());
let initial_bond = 100_000000;
let mixnode_bond = MixNodeBond {
amount: coins(initial_bond, DENOM),
owner: "node-owner".into(),
owner: Addr::unchecked("node-owner"),
mix_node: mix_node_fixture(),
};
@@ -1310,7 +1325,7 @@ pub mod tests {
// if node was 100% up, it will get full epoch reward
let expected_bond = Uint128(initial_bond) * reward + Uint128(initial_bond);
let info = mock_info(network_monitor_address.clone(), &[]);
let info = mock_info(network_monitor_address.as_str(), &[]);
try_reward_mixnode(deps.as_mut(), info, "node-owner".into(), 100).unwrap();
assert_eq!(
@@ -1322,7 +1337,7 @@ pub mod tests {
let scaled_reward = scale_reward_by_uptime(reward, 20).unwrap();
let expected_bond = expected_bond * scaled_reward + expected_bond;
let info = mock_info(network_monitor_address, &[]);
let info = mock_info(network_monitor_address.as_str(), &[]);
try_reward_mixnode(deps.as_mut(), info, "node-owner".into(), 20).unwrap();
assert_eq!(
@@ -1343,14 +1358,14 @@ pub mod tests {
assert_eq!(res, Err(ContractError::Unauthorized));
// errors out if the target owner hasn't bound any mixnodes
let info = mock_info(network_monitor_address.clone(), &[]);
let info = mock_info(network_monitor_address.as_str(), &[]);
let res = try_reward_gateway(deps.as_mut(), info, "node-owner".into(), 100);
assert!(res.is_err());
let initial_bond = 100_000000;
let gateway_bond = GatewayBond {
amount: coins(initial_bond, DENOM),
owner: "node-owner".into(),
owner: Addr::unchecked("node-owner"),
gateway: gateway_fixture(),
};
@@ -1364,7 +1379,7 @@ pub mod tests {
// if node was 100% up, it will get full epoch reward
let expected_bond = Uint128(initial_bond) * reward + Uint128(initial_bond);
let info = mock_info(network_monitor_address.clone(), &[]);
let info = mock_info(network_monitor_address.as_str(), &[]);
try_reward_gateway(deps.as_mut(), info, "node-owner".into(), 100).unwrap();
assert_eq!(
@@ -1376,7 +1391,7 @@ pub mod tests {
let scaled_reward = scale_reward_by_uptime(reward, 20).unwrap();
let expected_bond = expected_bond * scaled_reward + expected_bond;
let info = mock_info(network_monitor_address, &[]);
let info = mock_info(network_monitor_address.as_str(), &[]);
try_reward_gateway(deps.as_mut(), info, "node-owner".into(), 20).unwrap();
assert_eq!(