From 64237769354020067623529d716ffa2c0ffa8cbf Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Thu, 23 Nov 2023 12:05:56 -0600 Subject: [PATCH 01/22] feat(scripts-proto-clean): handlers for nibiru proto cleaning + more tests --- scripts/proto_clean.rs | 59 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/scripts/proto_clean.rs b/scripts/proto_clean.rs index e48e0fa..ddbeeac 100644 --- a/scripts/proto_clean.rs +++ b/scripts/proto_clean.rs @@ -12,6 +12,8 @@ /// on the classification. /// 4. Write the modified content back to each file. +pub static PROTO_PATH: &str = "../nibiru-std/src/proto/buf"; + pub fn main() { println!("Running proto_clean.rs..."); @@ -21,7 +23,10 @@ pub fn main() { .filter_map(|e| e.ok()) // filter out directories .filter(|e| !e.file_type().is_dir()) - .filter(|e| e.file_name().to_string_lossy().starts_with("cosmos")) + .filter(|e| { + e.file_name().to_string_lossy().starts_with("cosmos") + || e.file_name().to_string_lossy().starts_with("nibiru") + }) { // Get the path of the file we're going to clean. let path_to_clean = entry.path().to_string_lossy(); @@ -100,14 +105,18 @@ pub fn super_import_to_clean( let elem = elems[submodule_idx]; let prefix: &str; - if proto_submodules::is_cosmos_submod(elem) { + if proto_submodules::is_submod_cosmos(elem) { prefix = "crate::proto::cosmos" - } else if proto_submodules::is_tendermint_submod(elem) { + } else if proto_submodules::is_mod_tendermint(elem) + || proto_submodules::is_mod_cosmos(elem) + { prefix = "crate::proto" - } else if proto_submodules::is_cosmos_base_submod(elem) { + } else if proto_submodules::is_submod_cosmos_base(elem) { prefix = "crate::proto::cosmos::base" - } else if proto_submodules::is_cosmos_tx_submod(elem) { + } else if proto_submodules::is_submod_cosmos_tx(elem) { prefix = "crate::proto::cosmos::tx" + } else if proto_submodules::is_submod_cosmos_crypto(elem) { + prefix = "crate::proto::cosmos::crypto" } else { return Err(Box::new(CustomError(format!( "Unrecognized import submodule: {}", @@ -121,22 +130,26 @@ pub fn super_import_to_clean( mod proto_submodules { - pub fn is_cosmos_submod(s: &str) -> bool { + pub fn is_submod_cosmos(s: &str) -> bool { COSMOS.contains(&s) } - pub fn is_tendermint_submod(s: &str) -> bool { + pub fn is_mod_tendermint(s: &str) -> bool { TENDERMINT.contains(&s) } - pub fn is_cosmos_base_submod(s: &str) -> bool { + pub fn is_submod_cosmos_base(s: &str) -> bool { matches!(s, "query") } - pub fn is_cosmos_tx_submod(s: &str) -> bool { + pub fn is_submod_cosmos_tx(s: &str) -> bool { matches!(s, "signing") } + pub fn is_mod_cosmos(s: &str) -> bool { + matches!(s, "cosmos") + } + pub static COSMOS: [&str; 25] = [ "base", "bank", @@ -165,11 +178,23 @@ mod proto_submodules { "vesting", ]; + /// COSMOS_CRYPTO: Names of the proto packages: cosmos.crypto.* + pub static COSMOS_CRYPTO: [&str; 6] = [ + "ed25519", + "hd", + "keyring", + "multisig", + "secp256k1", + "secp256r1", + ]; + + pub fn is_submod_cosmos_crypto(s: &str) -> bool { + COSMOS_CRYPTO.contains(&s) + } + pub static TENDERMINT: [&str; 1] = ["tendermint"]; } -pub static PROTO_PATH: &str = "../nibiru-std/src/proto/buf"; - #[cfg(test)] mod tests { use std::fs; @@ -199,6 +224,18 @@ mod tests { want_err: true, want_out: None, }, + TestCase { + input: "super::super::super::hd::v1::Bip69Params", + want_err: false, + want_out: Some( + "crate::proto::cosmos::crypto::hd::v1::Bip69Params", + ), + }, + TestCase { + input: "super::super::cosmos::base::v1beta1::Coin", + want_err: false, + want_out: Some("crate::proto::cosmos::base::v1beta1::Coin"), + }, ]; for (i, test_case) in test_cases.iter().enumerate() { From 46392f90c8bcf0bbc65e65477bebd43b8e48cd49 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Thu, 23 Nov 2023 12:06:44 -0600 Subject: [PATCH 02/22] chore(deps): update Cargo.lock --- Cargo.lock | 954 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 906 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e99569..6bb526a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,6 +109,17 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -130,12 +141,24 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.4" @@ -165,6 +188,24 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bip32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" +dependencies = [ + "bs58", + "hmac", + "k256 0.11.6", + "once_cell", + "pbkdf2", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -201,6 +242,15 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +dependencies = [ + "sha2 0.9.9", +] + [[package]] name = "bstr" version = "1.6.2" @@ -327,6 +377,38 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "cosmos-sdk-proto" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b42021d8488665b1a0d9748f1f81df7235362d194f44481e2e61bf376b77b4" +dependencies = [ + "prost 0.11.9", + "prost-types 0.11.9", + "tendermint-proto", +] + +[[package]] +name = "cosmrs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" +dependencies = [ + "bip32", + "cosmos-sdk-proto", + "ecdsa 0.14.8", + "eyre", + "getrandom", + "k256 0.11.6", + "rand_core 0.6.4", + "serde", + "serde_json", + "subtle-encoding", + "tendermint", + "tendermint-rpc", + "thiserror", +] + [[package]] name = "cosmwasm-crypto" version = "1.5.0" @@ -334,9 +416,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8bb3c77c3b7ce472056968c745eb501c440fbc07be5004eba02782c35bfbbe3" dependencies = [ "digest 0.10.7", - "ecdsa", + "ecdsa 0.16.8", "ed25519-zebra", - "k256", + "k256 0.13.1", "rand_core 0.6.4", "thiserror", ] @@ -380,7 +462,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04d6864742e3a7662d024b51a94ea81c9af21db6faea2f9a6d2232bb97c6e53e" dependencies = [ - "base64", + "base64 0.21.4", "bech32", "bnum", "cosmwasm-crypto", @@ -405,6 +487,18 @@ dependencies = [ "libc", ] +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.5.3" @@ -427,6 +521,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "ct-logs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" +dependencies = [ + "sct", +] + [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -475,8 +578,8 @@ dependencies = [ "cw-storage-plus", "cw-utils", "derivative", - "itertools", - "prost", + "itertools 0.11.0", + "prost 0.12.1", "schemars", "serde", "sha2 0.10.8", @@ -494,8 +597,8 @@ dependencies = [ "cw-storage-plus", "cw-utils", "derivative", - "itertools", - "prost", + "itertools 0.11.0", + "prost 0.12.1", "schemars", "serde", "sha2 0.10.8", @@ -683,6 +786,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "der" version = "0.7.8" @@ -743,18 +856,51 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + [[package]] name = "ecdsa" version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ - "der", + "der 0.7.8", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.6", + "rfc6979 0.4.0", + "signature 2.1.0", + "spki 0.7.2", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "sha2 0.9.9", + "zeroize", ] [[package]] @@ -778,21 +924,41 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + [[package]] name = "elliptic-curve" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.3", "digest 0.10.7", - "ff", + "ff 0.13.0", "generic-array", - "group", - "pkcs8", + "group 0.13.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -827,12 +993,32 @@ dependencies = [ "libc", ] +[[package]] +name = "eyre" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fastrand" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "ff" version = "0.13.0" @@ -843,6 +1029,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "flex-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" +dependencies = [ + "eyre", + "paste", +] + [[package]] name = "fnv" version = "1.0.7" @@ -879,47 +1075,88 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", + "futures-sink", ] [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-executor" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-macro" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ + "futures-channel", "futures-core", "futures-io", + "futures-macro", + "futures-sink", "futures-task", "memchr", "pin-project-lite", @@ -945,8 +1182,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -955,13 +1194,24 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] @@ -994,6 +1244,30 @@ dependencies = [ "ahash", ] +[[package]] +name = "headers" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +dependencies = [ + "base64 0.21.4", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + [[package]] name = "heck" version = "0.4.1" @@ -1088,6 +1362,43 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-proxy" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +dependencies = [ + "bytes", + "futures", + "headers", + "http", + "hyper", + "hyper-rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", + "webpki", +] + +[[package]] +name = "hyper-rustls" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +dependencies = [ + "ct-logs", + "futures-util", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "webpki", + "webpki-roots", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -1129,6 +1440,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -1145,6 +1462,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.11.0" @@ -1169,6 +1495,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", + "sha3", +] + [[package]] name = "k256" version = "0.13.1" @@ -1176,11 +1515,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.8", + "elliptic-curve 0.13.6", "once_cell", "sha2 0.10.8", - "signature", + "signature 2.1.0", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", ] [[package]] @@ -1321,13 +1669,34 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "nibiru-macro", - "prost", - "prost-types", + "prost 0.12.1", + "prost-types 0.12.1", "serde", "serde_json", + "test-tube", "thiserror", ] +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -1338,6 +1707,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "nusd-valuator" version = "0.1.0" @@ -1421,11 +1799,73 @@ dependencies = [ ] [[package]] -name = "percent-encoding" +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "peg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" + +[[package]] +name = "percent-encoding" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1438,14 +1878,24 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", - "spki", + "der 0.7.8", + "spki 0.7.2", ] [[package]] @@ -1462,7 +1912,7 @@ checksum = "6dfc28575c2e3f19cb3c73b93af36460ae898d426eba6fc15b9bd2a5220758a0" dependencies = [ "anstyle", "difflib", - "itertools", + "itertools 0.11.0", "predicates-core", ] @@ -1506,6 +1956,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + [[package]] name = "prost" version = "0.12.1" @@ -1513,7 +1973,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.12.1", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -1523,19 +1996,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.38", ] +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + [[package]] name = "prost-types" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" dependencies = [ - "prost", + "prost 0.12.1", ] [[package]] @@ -1606,7 +2088,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64", + "base64 0.21.4", "bytes", "encoding_rs", "futures-core", @@ -1638,6 +2120,17 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -1648,6 +2141,41 @@ dependencies = [ "subtle", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "ripemd160" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1667,6 +2195,31 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64 0.13.1", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +dependencies = [ + "openssl-probe", + "rustls", + "schannel", + "security-framework", +] + [[package]] name = "ryu" version = "1.0.15" @@ -1729,16 +2282,40 @@ dependencies = [ "walkdir", ] +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", - "der", + "base16ct 0.2.0", + "der 0.7.8", "generic-array", - "pkcs8", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -1799,6 +2376,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_bytes" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.190" @@ -1832,6 +2418,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1844,6 +2441,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + [[package]] name = "sha2" version = "0.9.9" @@ -1868,6 +2476,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + [[package]] name = "shifter" version = "0.2.0" @@ -1882,6 +2500,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "signature" version = "2.1.0" @@ -1921,6 +2549,22 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + [[package]] name = "spki" version = "0.7.2" @@ -1928,7 +2572,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", - "der", + "der 0.7.8", ] [[package]] @@ -1949,6 +2593,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + [[package]] name = "syn" version = "1.0.109" @@ -2005,12 +2658,123 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "tendermint" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467f82178deeebcd357e1273a0c0b77b9a8a0313ef7c07074baebe99d87851f4" +dependencies = [ + "async-trait", + "bytes", + "ed25519", + "ed25519-dalek", + "flex-error", + "futures", + "k256 0.11.6", + "num-traits", + "once_cell", + "prost 0.11.9", + "prost-types 0.11.9", + "ripemd160", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.9.9", + "signature 1.6.4", + "subtle", + "subtle-encoding", + "tendermint-proto", + "time", + "zeroize", +] + +[[package]] +name = "tendermint-config" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d42ee0abc27ef5fc34080cce8d43c189950d331631546e7dfb983b6274fa327" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint", + "toml", + "url", +] + +[[package]] +name = "tendermint-proto" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ce80bf536476db81ecc9ebab834dc329c9c1509a694f211a73858814bfe023" +dependencies = [ + "bytes", + "flex-error", + "num-derive", + "num-traits", + "prost 0.11.9", + "prost-types 0.11.9", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-rpc" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f14aafe3528a0f75e9f3f410b525617b2de16c4b7830a21f717eee62882ec60" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom", + "http", + "hyper", + "hyper-proxy", + "hyper-rustls", + "peg", + "pin-project", + "serde", + "serde_bytes", + "serde_json", + "subtle-encoding", + "tendermint", + "tendermint-config", + "tendermint-proto", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid", + "walkdir", +] + [[package]] name = "termtree" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +[[package]] +name = "test-tube" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e79c7af10967dd3383ee5aae3810637cc3f2fd040f87f862c02151db060628" +dependencies = [ + "base64 0.13.1", + "cosmrs", + "cosmwasm-std", + "prost 0.11.9", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "thiserror" version = "1.0.50" @@ -2031,6 +2795,23 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "time" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +dependencies = [ + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + [[package]] name = "tinyvec" version = "1.6.0" @@ -2075,9 +2856,21 @@ dependencies = [ "num_cpus", "pin-project-lite", "socket2 0.5.4", + "tokio-macros", "windows-sys", ] +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "tokio-native-tls" version = "0.3.1" @@ -2088,6 +2881,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + [[package]] name = "tokio-util" version = "0.7.9" @@ -2102,6 +2906,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -2161,6 +2974,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "2.4.1" @@ -2178,6 +2997,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + [[package]] name = "vcpkg" version = "0.2.15" @@ -2300,6 +3125,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2412,3 +3256,17 @@ name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] From 7bea6271b673f07c220714a0463b1910234e617d Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Fri, 24 Nov 2023 12:13:18 -0600 Subject: [PATCH 03/22] feat(nibiru-std): new protobuf types --- Cargo.lock | 2 +- nibiru-std/Cargo.toml | 9 +- nibiru-std/src/lib.rs | 13 +- .../src/proto/buf/cosmos.bank.v1beta1.rs | 205 +++--- .../src/proto/buf/cosmos.crypto.keyring.v1.rs | 2 +- nibiru-std/src/proto/buf/nibiru.epochs.v1.rs | 4 +- .../src/proto/buf/nibiru.inflation.v1.rs | 86 ++- nibiru-std/src/proto/buf/nibiru.oracle.v1.rs | 189 +++--- nibiru-std/src/proto/buf/nibiru.perp.v2.rs | 619 +++++++++++------- nibiru-std/src/proto/buf/nibiru.spot.v1.rs | 331 ++++------ .../src/proto/buf/nibiru.stablecoin.v1.rs | 287 -------- .../src/proto/buf/nibiru.tokenfactory.v1.rs | 116 ++-- nibiru-std/src/proto/type_url_nibiru.rs | 4 +- 13 files changed, 831 insertions(+), 1036 deletions(-) delete mode 100644 nibiru-std/src/proto/buf/nibiru.stablecoin.v1.rs diff --git a/Cargo.lock b/Cargo.lock index 6bb526a..6c94764 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1663,7 +1663,7 @@ dependencies = [ [[package]] name = "nibiru-std" -version = "0.0.2" +version = "0.0.3" dependencies = [ "anyhow", "cosmwasm-schema", diff --git a/nibiru-std/Cargo.toml b/nibiru-std/Cargo.toml index db7049a..cd04a11 100644 --- a/nibiru-std/Cargo.toml +++ b/nibiru-std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nibiru-std" -version = "0.0.2" +version = "0.0.3" edition = "2021" description = "Nibiru Chain standard library for CosmWasm smart contracts" authors = ["Unique Divine "] @@ -11,12 +11,9 @@ repository = "https://github.com/NibiruChain/cw-nibiru" license-file = "LICENSE" # license = "MIT" # only one of license, license-file is needed. -[lib] -crate-type = ["cdylib", "rlib"] - [features] backtraces = ["cosmwasm-std/backtraces"] -library = [] +default = [] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -30,6 +27,8 @@ thiserror = { workspace = true } nibiru-macro = { workspace = true } serde_json = { workspace = true } +test-tube = { version = "0.2" } + # cargo run --bin script-name # [[bin]] # name = "rust script name" diff --git a/nibiru-std/src/lib.rs b/nibiru-std/src/lib.rs index 46c3d45..46b46f5 100644 --- a/nibiru-std/src/lib.rs +++ b/nibiru-std/src/lib.rs @@ -1,18 +1,13 @@ -/// bindings/mod.rs: Custom Nibiru module bindings for smart contracts. -/// -/// Bindings refer to a layer of code that allows two different programming -/// languages or systems to communicate with each other. -/// In the context of CosmWasm smart contracts and the Cosmos SDK, bindings -/// allow the Go-based Cosmos SDK to interact with and execute smart contracts, -/// which are written in Rust and compiled to WebAssembly (Wasm). pub mod bindings; -/// proto/mod.rs: Protobuf types defined in NibiruChain/nibiru/proto. pub mod proto; pub mod wasm; pub mod errors; +pub mod cosmrs; +pub mod testing; + pub const VERSION_COSMOS_SDK: &str = "v0.47.5"; -pub const VERSION_NIBIRU: &str = "240c7fba3ef38ac066c9a543a9028d6484d6374f"; +pub const VERSION_NIBIRU: &str = "9e9701e5b0f9d6a550d06454e6ad2a4cba1859aa"; diff --git a/nibiru-std/src/proto/buf/cosmos.bank.v1beta1.rs b/nibiru-std/src/proto/buf/cosmos.bank.v1beta1.rs index 8aa4c1e..381e94a 100644 --- a/nibiru-std/src/proto/buf/cosmos.bank.v1beta1.rs +++ b/nibiru-std/src/proto/buf/cosmos.bank.v1beta1.rs @@ -6,13 +6,13 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SendAuthorization { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub spend_limit: ::prost::alloc::vec::Vec, /// allow_list specifies an optional list of addresses to whom the grantee can send tokens on behalf of the /// granter. If omitted, any recipient is allowed. /// /// Since: cosmos-sdk 0.47 - #[prost(string, repeated, tag = "2")] + #[prost(string, repeated, tag="2")] pub allow_list: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// Params defines the parameters for the bank module. @@ -25,9 +25,9 @@ pub struct Params { /// /// As of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files. #[deprecated] - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub send_enabled: ::prost::alloc::vec::Vec, - #[prost(bool, tag = "2")] + #[prost(bool, tag="2")] pub default_send_enabled: bool, } /// SendEnabled maps coin denom to a send_enabled status (whether a denom is @@ -35,27 +35,27 @@ pub struct Params { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SendEnabled { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, - #[prost(bool, tag = "2")] + #[prost(bool, tag="2")] pub enabled: bool, } /// Input models transaction input. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Input { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub coins: ::prost::alloc::vec::Vec, } /// Output models transaction outputs. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Output { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub coins: ::prost::alloc::vec::Vec, } /// Supply represents a struct that passively keeps track of the total supply @@ -64,7 +64,7 @@ pub struct Output { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Supply { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub total: ::prost::alloc::vec::Vec, } /// DenomUnit represents a struct that describes a given @@ -73,17 +73,17 @@ pub struct Supply { #[derive(Clone, PartialEq, ::prost::Message)] pub struct DenomUnit { /// denom represents the string name of the given denom unit (e.g uatom). - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, /// exponent represents power of 10 exponent that one must /// raise the base_denom to in order to equal the given DenomUnit's denom /// 1 denom = 10^exponent base_denom /// (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with /// exponent = 6, thus: 1 atom = 10^6 uatom). - #[prost(uint32, tag = "2")] + #[prost(uint32, tag="2")] pub exponent: u32, /// aliases is a list of string aliases for the given denom - #[prost(string, repeated, tag = "3")] + #[prost(string, repeated, tag="3")] pub aliases: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// Metadata represents a struct that describes @@ -91,39 +91,39 @@ pub struct DenomUnit { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Metadata { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub description: ::prost::alloc::string::String, /// denom_units represents the list of DenomUnit's for a given coin - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub denom_units: ::prost::alloc::vec::Vec, /// base represents the base denom (should be the DenomUnit with exponent = 0). - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub base: ::prost::alloc::string::String, /// display indicates the suggested denom that should be /// displayed in clients. - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub display: ::prost::alloc::string::String, /// name defines the name of the token (eg: Cosmos Atom) /// /// Since: cosmos-sdk 0.43 - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub name: ::prost::alloc::string::String, /// symbol is the token symbol usually shown on exchanges (eg: ATOM). This can /// be the same as the display. /// /// Since: cosmos-sdk 0.43 - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub symbol: ::prost::alloc::string::String, /// URI to a document (on or off-chain) that contains additional information. Optional. /// /// Since: cosmos-sdk 0.46 - #[prost(string, tag = "7")] + #[prost(string, tag="7")] pub uri: ::prost::alloc::string::String, /// URIHash is a sha256 hash of a document pointed by URI. It's used to verify that /// the document didn't change. Optional. /// /// Since: cosmos-sdk 0.46 - #[prost(string, tag = "8")] + #[prost(string, tag="8")] pub uri_hash: ::prost::alloc::string::String, } /// GenesisState defines the bank module's genesis state. @@ -131,22 +131,22 @@ pub struct Metadata { #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisState { /// params defines all the parameters of the module. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, /// balances is an array containing the balances of all the accounts. - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub balances: ::prost::alloc::vec::Vec, /// supply represents the total supply. If it is left empty, then supply will be calculated based on the provided /// balances. Otherwise, it will be used to validate that the sum of the balances equals this amount. - #[prost(message, repeated, tag = "3")] + #[prost(message, repeated, tag="3")] pub supply: ::prost::alloc::vec::Vec, /// denom_metadata defines the metadata of the different coins. - #[prost(message, repeated, tag = "4")] + #[prost(message, repeated, tag="4")] pub denom_metadata: ::prost::alloc::vec::Vec, /// send_enabled defines the denoms where send is enabled or disabled. /// /// Since: cosmos-sdk 0.47 - #[prost(message, repeated, tag = "5")] + #[prost(message, repeated, tag="5")] pub send_enabled: ::prost::alloc::vec::Vec, } /// Balance defines an account address and balance pair used in the bank module's @@ -155,10 +155,10 @@ pub struct GenesisState { #[derive(Clone, PartialEq, ::prost::Message)] pub struct Balance { /// address is the address of the balance holder. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// coins defines the different coins this balance holds. - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub coins: ::prost::alloc::vec::Vec, } /// QueryBalanceRequest is the request type for the Query/Balance RPC method. @@ -166,10 +166,10 @@ pub struct Balance { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryBalanceRequest { /// address is the address to query balances for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// denom is the coin denom to query balances for. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub denom: ::prost::alloc::string::String, } /// QueryBalanceResponse is the response type for the Query/Balance RPC method. @@ -177,7 +177,7 @@ pub struct QueryBalanceRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryBalanceResponse { /// balance is the balance of the coin. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub balance: ::core::option::Option, } /// QueryBalanceRequest is the request type for the Query/AllBalances RPC method. @@ -185,12 +185,11 @@ pub struct QueryBalanceResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryAllBalancesRequest { /// address is the address to query balances for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// pagination defines an optional pagination for the request. - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// QueryAllBalancesResponse is the response type for the Query/AllBalances RPC /// method. @@ -198,12 +197,11 @@ pub struct QueryAllBalancesRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryAllBalancesResponse { /// balances is the balances of all the coins. - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub balances: ::prost::alloc::vec::Vec, /// pagination defines the pagination in the response. - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// QuerySpendableBalancesRequest defines the gRPC request structure for querying /// an account's spendable balances. @@ -213,12 +211,11 @@ pub struct QueryAllBalancesResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySpendableBalancesRequest { /// address is the address to query spendable balances for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// pagination defines an optional pagination for the request. - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// QuerySpendableBalancesResponse defines the gRPC response structure for querying /// an account's spendable balances. @@ -228,12 +225,11 @@ pub struct QuerySpendableBalancesRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySpendableBalancesResponse { /// balances is the spendable balances of all the coins. - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub balances: ::prost::alloc::vec::Vec, /// pagination defines the pagination in the response. - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// QuerySpendableBalanceByDenomRequest defines the gRPC request structure for /// querying an account's spendable balance for a specific denom. @@ -243,10 +239,10 @@ pub struct QuerySpendableBalancesResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySpendableBalanceByDenomRequest { /// address is the address to query balances for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// denom is the coin denom to query balances for. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub denom: ::prost::alloc::string::String, } /// QuerySpendableBalanceByDenomResponse defines the gRPC response structure for @@ -257,7 +253,7 @@ pub struct QuerySpendableBalanceByDenomRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySpendableBalanceByDenomResponse { /// balance is the balance of the coin. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub balance: ::core::option::Option, } /// QueryTotalSupplyRequest is the request type for the Query/TotalSupply RPC @@ -268,9 +264,8 @@ pub struct QueryTotalSupplyRequest { /// pagination defines an optional pagination for the request. /// /// Since: cosmos-sdk 0.43 - #[prost(message, optional, tag = "1")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="1")] + pub pagination: ::core::option::Option, } /// QueryTotalSupplyResponse is the response type for the Query/TotalSupply RPC /// method @@ -278,21 +273,20 @@ pub struct QueryTotalSupplyRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryTotalSupplyResponse { /// supply is the supply of the coins - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub supply: ::prost::alloc::vec::Vec, /// pagination defines the pagination in the response. /// /// Since: cosmos-sdk 0.43 - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// QuerySupplyOfRequest is the request type for the Query/SupplyOf RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySupplyOfRequest { /// denom is the coin denom to query balances for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, } /// QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC method. @@ -300,18 +294,19 @@ pub struct QuerySupplyOfRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySupplyOfResponse { /// amount is the supply of the coin. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub amount: ::core::option::Option, } /// QueryParamsRequest defines the request type for querying x/bank parameters. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryParamsRequest {} +pub struct QueryParamsRequest { +} /// QueryParamsResponse defines the response type for querying x/bank parameters. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryParamsResponse { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, } /// QueryDenomsMetadataRequest is the request type for the Query/DenomsMetadata RPC method. @@ -319,9 +314,8 @@ pub struct QueryParamsResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomsMetadataRequest { /// pagination defines an optional pagination for the request. - #[prost(message, optional, tag = "1")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="1")] + pub pagination: ::core::option::Option, } /// QueryDenomsMetadataResponse is the response type for the Query/DenomsMetadata RPC /// method. @@ -329,19 +323,18 @@ pub struct QueryDenomsMetadataRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomsMetadataResponse { /// metadata provides the client information for all the registered tokens. - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub metadatas: ::prost::alloc::vec::Vec, /// pagination defines the pagination in the response. - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// QueryDenomMetadataRequest is the request type for the Query/DenomMetadata RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomMetadataRequest { /// denom is the coin denom to query the metadata for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, } /// QueryDenomMetadataResponse is the response type for the Query/DenomMetadata RPC @@ -350,7 +343,7 @@ pub struct QueryDenomMetadataRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomMetadataResponse { /// metadata describes and provides all the client information for the requested token. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub metadata: ::core::option::Option, } /// QueryDenomOwnersRequest defines the request type for the DenomOwners RPC query, @@ -360,12 +353,11 @@ pub struct QueryDenomMetadataResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomOwnersRequest { /// denom defines the coin denomination to query all account holders for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, /// pagination defines an optional pagination for the request. - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// DenomOwner defines structure representing an account that owns or holds a /// particular denominated token. It contains the account address and account @@ -376,10 +368,10 @@ pub struct QueryDenomOwnersRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct DenomOwner { /// address defines the address that owns a particular denomination. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// balance is the balance of the denominated coin for an account. - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub balance: ::core::option::Option, } /// QueryDenomOwnersResponse defines the RPC response of a DenomOwners RPC query. @@ -388,12 +380,11 @@ pub struct DenomOwner { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomOwnersResponse { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub denom_owners: ::prost::alloc::vec::Vec, /// pagination defines the pagination in the response. - #[prost(message, optional, tag = "2")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } /// QuerySendEnabledRequest defines the RPC request for looking up SendEnabled entries. /// @@ -402,13 +393,12 @@ pub struct QueryDenomOwnersResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySendEnabledRequest { /// denoms is the specific denoms you want look up. Leave empty to get all entries. - #[prost(string, repeated, tag = "1")] + #[prost(string, repeated, tag="1")] pub denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, /// pagination defines an optional pagination for the request. This field is /// only read if the denoms field is empty. - #[prost(message, optional, tag = "99")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="99")] + pub pagination: ::core::option::Option, } /// QuerySendEnabledResponse defines the RPC response of a SendEnable query. /// @@ -416,45 +406,45 @@ pub struct QuerySendEnabledRequest { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySendEnabledResponse { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub send_enabled: ::prost::alloc::vec::Vec, /// pagination defines the pagination in the response. This field is only /// populated if the denoms field in the request is empty. - #[prost(message, optional, tag = "99")] - pub pagination: - ::core::option::Option, + #[prost(message, optional, tag="99")] + pub pagination: ::core::option::Option, } - /// MsgSend represents a message to send coins from one account to another. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgSend { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub from_address: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub to_address: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "3")] + #[prost(message, repeated, tag="3")] pub amount: ::prost::alloc::vec::Vec, } /// MsgSendResponse defines the Msg/Send response type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgSendResponse {} +pub struct MsgSendResponse { +} /// MsgMultiSend represents an arbitrary multi-in, multi-out send message. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgMultiSend { /// Inputs, despite being `repeated`, only allows one sender input. This is /// checked in MsgMultiSend's ValidateBasic. - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub inputs: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub outputs: ::prost::alloc::vec::Vec, } /// MsgMultiSendResponse defines the Msg/MultiSend response type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgMultiSendResponse {} +pub struct MsgMultiSendResponse { +} /// MsgUpdateParams is the Msg/UpdateParams request type. /// /// Since: cosmos-sdk 0.47 @@ -462,12 +452,12 @@ pub struct MsgMultiSendResponse {} #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgUpdateParams { /// authority is the address that controls the module (defaults to x/gov unless overwritten). - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub authority: ::prost::alloc::string::String, /// params defines the x/bank parameters to update. /// /// NOTE: All parameters must be supplied. - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub params: ::core::option::Option, } /// MsgUpdateParamsResponse defines the response structure for executing a @@ -476,7 +466,8 @@ pub struct MsgUpdateParams { /// Since: cosmos-sdk 0.47 #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgUpdateParamsResponse {} +pub struct MsgUpdateParamsResponse { +} /// MsgSetSendEnabled is the Msg/SetSendEnabled request type. /// /// Only entries to add/update/delete need to be included. @@ -487,23 +478,23 @@ pub struct MsgUpdateParamsResponse {} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgSetSendEnabled { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub authority: ::prost::alloc::string::String, /// send_enabled is the list of entries to add or update. - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub send_enabled: ::prost::alloc::vec::Vec, /// use_default_for is a list of denoms that should use the params.default_send_enabled value. /// Denoms listed here will have their SendEnabled entries deleted. /// If a denom is included that doesn't have a SendEnabled entry, /// it will be ignored. - #[prost(string, repeated, tag = "3")] - pub use_default_for: - ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(string, repeated, tag="3")] + pub use_default_for: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// MsgSetSendEnabledResponse defines the Msg/SetSendEnabled response type. /// /// Since: cosmos-sdk 0.47 #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgSetSendEnabledResponse {} -// @@protoc_insertion_point(module) \ No newline at end of file +pub struct MsgSetSendEnabledResponse { +} +// @@protoc_insertion_point(module) diff --git a/nibiru-std/src/proto/buf/cosmos.crypto.keyring.v1.rs b/nibiru-std/src/proto/buf/cosmos.crypto.keyring.v1.rs index d9a3dd1..c6bdb66 100644 --- a/nibiru-std/src/proto/buf/cosmos.crypto.keyring.v1.rs +++ b/nibiru-std/src/proto/buf/cosmos.crypto.keyring.v1.rs @@ -28,7 +28,7 @@ pub mod record { #[derive(Clone, PartialEq, ::prost::Message)] pub struct Ledger { #[prost(message, optional, tag="1")] - pub path: ::core::option::Option, + pub path: ::core::option::Option, } /// Multi item #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/nibiru-std/src/proto/buf/nibiru.epochs.v1.rs b/nibiru-std/src/proto/buf/nibiru.epochs.v1.rs index 397600c..c1745a2 100644 --- a/nibiru-std/src/proto/buf/nibiru.epochs.v1.rs +++ b/nibiru-std/src/proto/buf/nibiru.epochs.v1.rs @@ -51,11 +51,11 @@ pub struct GenesisState { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryEpochsInfoRequest { +pub struct QueryEpochInfosRequest { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryEpochsInfoResponse { +pub struct QueryEpochInfosResponse { #[prost(message, repeated, tag="1")] pub epochs: ::prost::alloc::vec::Vec, } diff --git a/nibiru-std/src/proto/buf/nibiru.inflation.v1.rs b/nibiru-std/src/proto/buf/nibiru.inflation.v1.rs index f9fcacf..9235495 100644 --- a/nibiru-std/src/proto/buf/nibiru.inflation.v1.rs +++ b/nibiru-std/src/proto/buf/nibiru.inflation.v1.rs @@ -7,47 +7,30 @@ pub struct InflationDistribution { /// staking_rewards defines the proportion of the minted_denom that is /// to be allocated as staking rewards - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub staking_rewards: ::prost::alloc::string::String, /// community_pool defines the proportion of the minted_denom that is to /// be allocated to the community pool - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub community_pool: ::prost::alloc::string::String, /// strategic_reserves defines the proportion of the minted_denom that /// is to be allocated to the strategic reserves module address - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub strategic_reserves: ::prost::alloc::string::String, } -/// ExponentialCalculation holds factors to calculate exponential inflation on -/// each period. Calculation reference: -/// periodProvision = exponentialDecay -/// f(x) = a * (1 - r) ^ x + c -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ExponentialCalculation { - /// a defines the initial value - #[prost(string, tag = "1")] - pub a: ::prost::alloc::string::String, - /// r defines the reduction factor - #[prost(string, tag = "2")] - pub r: ::prost::alloc::string::String, - /// c defines the parameter for long term inflation - #[prost(string, tag = "3")] - pub c: ::prost::alloc::string::String, -} /// GenesisState defines the inflation module's genesis state. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisState { /// params defines all the parameters of the module. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, /// period is the amount of past periods, based on the epochs per period param - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub period: u64, /// skipped_epochs is the number of epochs that have passed while inflation is /// disabled - #[prost(uint64, tag = "3")] + #[prost(uint64, tag="3")] pub skipped_epochs: u64, } /// Params holds parameters for the inflation module. @@ -56,52 +39,61 @@ pub struct GenesisState { pub struct Params { /// inflation_enabled is the parameter that enables inflation and halts /// increasing the skipped_epochs - #[prost(bool, tag = "1")] + #[prost(bool, tag="1")] pub inflation_enabled: bool, - /// exponential_calculation takes in the variables to calculate exponential + /// polynomial_factors takes in the variables to calculate polynomial /// inflation - #[prost(message, optional, tag = "2")] - pub exponential_calculation: ::core::option::Option, + #[prost(string, repeated, tag="2")] + pub polynomial_factors: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, /// inflation_distribution of the minted denom - #[prost(message, optional, tag = "3")] + #[prost(message, optional, tag="3")] pub inflation_distribution: ::core::option::Option, /// epochs_per_period is the number of epochs that must pass before a new /// period is created - #[prost(uint64, tag = "4")] + #[prost(uint64, tag="4")] pub epochs_per_period: u64, + /// periods_per_year is the number of periods that occur in a year + #[prost(uint64, tag="5")] + pub periods_per_year: u64, + /// max_period is the maximum number of periods that have inflation being + /// paid off. After this period, inflation will be disabled. + #[prost(uint64, tag="6")] + pub max_period: u64, } /// QueryPeriodRequest is the request type for the Query/Period RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryPeriodRequest {} +pub struct QueryPeriodRequest { +} /// QueryPeriodResponse is the response type for the Query/Period RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPeriodResponse { /// period is the current minting per epoch provision value. - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub period: u64, } /// QueryEpochMintProvisionRequest is the request type for the /// Query/EpochMintProvision RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryEpochMintProvisionRequest {} +pub struct QueryEpochMintProvisionRequest { +} /// QueryEpochMintProvisionResponse is the response type for the /// Query/EpochMintProvision RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryEpochMintProvisionResponse { /// epoch_mint_provision is the current minting per epoch provision value. - #[prost(message, optional, tag = "1")] - pub epoch_mint_provision: - ::core::option::Option, + #[prost(message, optional, tag="1")] + pub epoch_mint_provision: ::core::option::Option, } /// QuerySkippedEpochsRequest is the request type for the Query/SkippedEpochs RPC /// method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QuerySkippedEpochsRequest {} +pub struct QuerySkippedEpochsRequest { +} /// QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs /// RPC method. #[allow(clippy::derive_partial_eq_without_eq)] @@ -109,48 +101,50 @@ pub struct QuerySkippedEpochsRequest {} pub struct QuerySkippedEpochsResponse { /// skipped_epochs is the number of epochs that the inflation module has been /// disabled. - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub skipped_epochs: u64, } /// QueryCirculatingSupplyRequest is the request type for the /// Query/CirculatingSupply RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryCirculatingSupplyRequest {} +pub struct QueryCirculatingSupplyRequest { +} /// QueryCirculatingSupplyResponse is the response type for the /// Query/CirculatingSupply RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryCirculatingSupplyResponse { /// circulating_supply is the total amount of coins in circulation - #[prost(message, optional, tag = "1")] - pub circulating_supply: - ::core::option::Option, + #[prost(message, optional, tag="1")] + pub circulating_supply: ::core::option::Option, } /// QueryInflationRateRequest is the request type for the Query/InflationRate RPC /// method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryInflationRateRequest {} +pub struct QueryInflationRateRequest { +} /// QueryInflationRateResponse is the response type for the Query/InflationRate /// RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryInflationRateResponse { /// inflation_rate by which the total supply increases within one period - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub inflation_rate: ::prost::alloc::string::String, } /// QueryParamsRequest is the request type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryParamsRequest {} +pub struct QueryParamsRequest { +} /// QueryParamsResponse is the response type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryParamsResponse { /// params defines the parameters of the module. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, } -// @@protoc_insertion_point(module) \ No newline at end of file +// @@protoc_insertion_point(module) diff --git a/nibiru-std/src/proto/buf/nibiru.oracle.v1.rs b/nibiru-std/src/proto/buf/nibiru.oracle.v1.rs index c119492..a0ed36e 100644 --- a/nibiru-std/src/proto/buf/nibiru.oracle.v1.rs +++ b/nibiru-std/src/proto/buf/nibiru.oracle.v1.rs @@ -4,50 +4,50 @@ #[derive(Clone, PartialEq, ::prost::Message)] pub struct Params { /// VotePeriod defines the number of blocks during which voting takes place. - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub vote_period: u64, /// VoteThreshold specifies the minimum proportion of votes that must be /// received for a ballot to pass. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub vote_threshold: ::prost::alloc::string::String, /// RewardBand defines a maxium divergence that a price vote can have from the /// weighted median in the ballot. If a vote lies within the valid range /// defined by: - /// μ := weightedMedian, - /// validRange := μ ± (μ * rewardBand / 2), + /// μ := weightedMedian, + /// validRange := μ ± (μ * rewardBand / 2), /// then rewards are added to the validator performance. /// Note that if the reward band is smaller than 1 standard /// deviation, the band is taken to be 1 standard deviation.a price - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub reward_band: ::prost::alloc::string::String, /// The set of whitelisted markets, or asset pairs, for the module. /// Ex. '\["unibi:uusd","ubtc:uusd"\]' - #[prost(string, repeated, tag = "4")] + #[prost(string, repeated, tag="4")] pub whitelist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, /// SlashFraction returns the proportion of an oracle's stake that gets /// slashed in the event of slashing. `SlashFraction` specifies the exact /// penalty for failing a voting period. - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub slash_fraction: ::prost::alloc::string::String, /// SlashWindow returns the number of voting periods that specify a /// "slash window". After each slash window, all oracles that have missed more /// than the penalty threshold are slashed. Missing the penalty threshold is /// synonymous with submitting fewer valid votes than `MinValidPerWindow`. - #[prost(uint64, tag = "6")] + #[prost(uint64, tag="6")] pub slash_window: u64, - #[prost(string, tag = "7")] + #[prost(string, tag="7")] pub min_valid_per_window: ::prost::alloc::string::String, /// Amount of time to look back for TWAP calculations - #[prost(message, optional, tag = "8")] + #[prost(message, optional, tag="8")] pub twap_lookback_window: ::core::option::Option<::prost_types::Duration>, /// The minimum number of voters (i.e. oracle validators) per pair for it to be /// considered a passing ballot. Recommended at least 4. - #[prost(uint64, tag = "9")] + #[prost(uint64, tag="9")] pub min_voters: u64, /// The validator fee ratio that is given to validators every epoch. - #[prost(string, tag = "10")] + #[prost(string, tag="10")] pub validator_fee_ratio: ::prost::alloc::string::String, - #[prost(uint64, tag = "11")] + #[prost(uint64, tag="11")] pub expiration_blocks: u64, } /// Struct for aggregate prevoting on the ExchangeRateVote. @@ -57,11 +57,11 @@ pub struct Params { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AggregateExchangeRatePrevote { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub hash: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub voter: ::prost::alloc::string::String, - #[prost(uint64, tag = "3")] + #[prost(uint64, tag="3")] pub submit_block: u64, } /// MsgAggregateExchangeRateVote - struct for voting on @@ -69,26 +69,26 @@ pub struct AggregateExchangeRatePrevote { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AggregateExchangeRateVote { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub exchange_rate_tuples: ::prost::alloc::vec::Vec, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub voter: ::prost::alloc::string::String, } /// ExchangeRateTuple - struct to store interpreted exchange rates data to store #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ExchangeRateTuple { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub exchange_rate: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DatedPrice { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub exchange_rate: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub created_block: u64, } /// Rewards defines a credit object towards validators @@ -97,26 +97,25 @@ pub struct DatedPrice { #[derive(Clone, PartialEq, ::prost::Message)] pub struct Rewards { /// id uniquely identifies the rewards instance of the pair - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub id: u64, /// vote_periods defines the vote periods left in which rewards will be /// distributed. - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub vote_periods: u64, /// Coins defines the amount of coins to distribute in a single vote period. - #[prost(message, repeated, tag = "3")] - pub coins: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="3")] + pub coins: ::prost::alloc::vec::Vec, } /// Emitted when a price is posted #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventPriceUpdate { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub price: ::prost::alloc::string::String, - #[prost(int64, tag = "3")] + #[prost(int64, tag="3")] pub timestamp_ms: i64, } /// Emitted when a valoper delegates oracle voting rights to a feeder address. @@ -124,11 +123,11 @@ pub struct EventPriceUpdate { #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventDelegateFeederConsent { /// Validator is the Bech32 address that is delegating voting rights. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator: ::prost::alloc::string::String, /// Feeder is the delegate or representative that will be able to send /// vote and prevote transaction messages. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub feeder: ::prost::alloc::string::String, } /// Emitted by MsgAggregateExchangeVote when an aggregate vote is added to state @@ -136,13 +135,13 @@ pub struct EventDelegateFeederConsent { #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventAggregateVote { /// Validator is the Bech32 address to which the vote will be credited. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator: ::prost::alloc::string::String, /// Feeder is the delegate or representative that will send vote and prevote /// transaction messages on behalf of the voting validator. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub feeder: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "3")] + #[prost(message, repeated, tag="3")] pub prices: ::prost::alloc::vec::Vec, } /// Emitted by MsgAggregateExchangePrevote when an aggregate prevote is added @@ -151,34 +150,32 @@ pub struct EventAggregateVote { #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventAggregatePrevote { /// Validator is the Bech32 address to which the vote will be credited. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator: ::prost::alloc::string::String, /// Feeder is the delegate or representative that will send vote and prevote /// transaction messages on behalf of the voting validator. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub feeder: ::prost::alloc::string::String, } /// GenesisState defines the oracle module's genesis state. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisState { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub feeder_delegations: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "3")] + #[prost(message, repeated, tag="3")] pub exchange_rates: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "4")] + #[prost(message, repeated, tag="4")] pub miss_counters: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "5")] - pub aggregate_exchange_rate_prevotes: - ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "6")] - pub aggregate_exchange_rate_votes: - ::prost::alloc::vec::Vec, - #[prost(string, repeated, tag = "7")] + #[prost(message, repeated, tag="5")] + pub aggregate_exchange_rate_prevotes: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="6")] + pub aggregate_exchange_rate_votes: ::prost::alloc::vec::Vec, + #[prost(string, repeated, tag="7")] pub pairs: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - #[prost(message, repeated, tag = "8")] + #[prost(message, repeated, tag="8")] pub rewards: ::prost::alloc::vec::Vec, } /// FeederDelegation is the address for where oracle feeder authority are @@ -187,9 +184,9 @@ pub struct GenesisState { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct FeederDelegation { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub feeder_address: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub validator_address: ::prost::alloc::string::String, } /// MissCounter defines an miss counter and validator address pair used in @@ -197,9 +194,9 @@ pub struct FeederDelegation { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MissCounter { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator_address: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub miss_counter: u64, } /// QueryExchangeRateRequest is the request type for the Query/ExchangeRate RPC @@ -208,7 +205,7 @@ pub struct MissCounter { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryExchangeRateRequest { /// pair defines the pair to query for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, } /// QueryExchangeRateResponse is response type for the @@ -217,14 +214,15 @@ pub struct QueryExchangeRateRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryExchangeRateResponse { /// exchange_rate defines the exchange rate of assets voted by validators - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub exchange_rate: ::prost::alloc::string::String, } /// QueryExchangeRatesRequest is the request type for the Query/ExchangeRates RPC /// method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryExchangeRatesRequest {} +pub struct QueryExchangeRatesRequest { +} /// QueryExchangeRatesResponse is response type for the /// Query/ExchangeRates RPC method. #[allow(clippy::derive_partial_eq_without_eq)] @@ -232,27 +230,29 @@ pub struct QueryExchangeRatesRequest {} pub struct QueryExchangeRatesResponse { /// exchange_rates defines a list of the exchange rate for all whitelisted /// pairs. - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub exchange_rates: ::prost::alloc::vec::Vec, } /// QueryActivesRequest is the request type for the Query/Actives RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryActivesRequest {} +pub struct QueryActivesRequest { +} /// QueryActivesResponse is response type for the /// Query/Actives RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryActivesResponse { /// actives defines a list of the pair which oracle prices agreed upon. - #[prost(string, repeated, tag = "1")] + #[prost(string, repeated, tag="1")] pub actives: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// QueryVoteTargetsRequest is the request type for the Query/VoteTargets RPC /// method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryVoteTargetsRequest {} +pub struct QueryVoteTargetsRequest { +} /// QueryVoteTargetsResponse is response type for the /// Query/VoteTargets RPC method. #[allow(clippy::derive_partial_eq_without_eq)] @@ -260,7 +260,7 @@ pub struct QueryVoteTargetsRequest {} pub struct QueryVoteTargetsResponse { /// vote_targets defines a list of the pairs in which everyone /// should vote in the current vote period. - #[prost(string, repeated, tag = "1")] + #[prost(string, repeated, tag="1")] pub vote_targets: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// QueryFeederDelegationRequest is the request type for the @@ -269,7 +269,7 @@ pub struct QueryVoteTargetsResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryFeederDelegationRequest { /// validator defines the validator address to query for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator_addr: ::prost::alloc::string::String, } /// QueryFeederDelegationResponse is response type for the @@ -278,7 +278,7 @@ pub struct QueryFeederDelegationRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryFeederDelegationResponse { /// feeder_addr defines the feeder delegation of a validator - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub feeder_addr: ::prost::alloc::string::String, } /// QueryMissCounterRequest is the request type for the Query/MissCounter RPC @@ -287,7 +287,7 @@ pub struct QueryFeederDelegationResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryMissCounterRequest { /// validator defines the validator address to query for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator_addr: ::prost::alloc::string::String, } /// QueryMissCounterResponse is response type for the @@ -296,7 +296,7 @@ pub struct QueryMissCounterRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryMissCounterResponse { /// miss_counter defines the oracle miss counter of a validator - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub miss_counter: u64, } /// QueryAggregatePrevoteRequest is the request type for the @@ -305,7 +305,7 @@ pub struct QueryMissCounterResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryAggregatePrevoteRequest { /// validator defines the validator address to query for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator_addr: ::prost::alloc::string::String, } /// QueryAggregatePrevoteResponse is response type for the @@ -315,14 +315,15 @@ pub struct QueryAggregatePrevoteRequest { pub struct QueryAggregatePrevoteResponse { /// aggregate_prevote defines oracle aggregate prevote submitted by a validator /// in the current vote period - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub aggregate_prevote: ::core::option::Option, } /// QueryAggregatePrevotesRequest is the request type for the /// Query/AggregatePrevotes RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryAggregatePrevotesRequest {} +pub struct QueryAggregatePrevotesRequest { +} /// QueryAggregatePrevotesResponse is response type for the /// Query/AggregatePrevotes RPC method. #[allow(clippy::derive_partial_eq_without_eq)] @@ -330,9 +331,8 @@ pub struct QueryAggregatePrevotesRequest {} pub struct QueryAggregatePrevotesResponse { /// aggregate_prevotes defines all oracle aggregate prevotes submitted in the /// current vote period - #[prost(message, repeated, tag = "1")] - pub aggregate_prevotes: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="1")] + pub aggregate_prevotes: ::prost::alloc::vec::Vec, } /// QueryAggregateVoteRequest is the request type for the Query/AggregateVote RPC /// method. @@ -340,7 +340,7 @@ pub struct QueryAggregatePrevotesResponse { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryAggregateVoteRequest { /// validator defines the validator address to query for. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub validator_addr: ::prost::alloc::string::String, } /// QueryAggregateVoteResponse is response type for the @@ -350,14 +350,15 @@ pub struct QueryAggregateVoteRequest { pub struct QueryAggregateVoteResponse { /// aggregate_vote defines oracle aggregate vote submitted by a validator in /// the current vote period - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub aggregate_vote: ::core::option::Option, } /// QueryAggregateVotesRequest is the request type for the Query/AggregateVotes /// RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryAggregateVotesRequest {} +pub struct QueryAggregateVotesRequest { +} /// QueryAggregateVotesResponse is response type for the /// Query/AggregateVotes RPC method. #[allow(clippy::derive_partial_eq_without_eq)] @@ -365,31 +366,32 @@ pub struct QueryAggregateVotesRequest {} pub struct QueryAggregateVotesResponse { /// aggregate_votes defines all oracle aggregate votes submitted in the current /// vote period - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub aggregate_votes: ::prost::alloc::vec::Vec, } /// QueryParamsRequest is the request type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryParamsRequest {} +pub struct QueryParamsRequest { +} /// QueryParamsResponse is the response type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryParamsResponse { /// params defines the parameters of the module. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, } /// a snapshot of the prices at a given point in time #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PriceSnapshot { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub price: ::prost::alloc::string::String, /// milliseconds since unix epoch - #[prost(int64, tag = "3")] + #[prost(int64, tag="3")] pub timestamp_ms: i64, } /// MsgAggregateExchangeRatePrevote represents a message to submit @@ -397,58 +399,61 @@ pub struct PriceSnapshot { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgAggregateExchangeRatePrevote { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub hash: ::prost::alloc::string::String, /// Feeder is the Bech32 address of the price feeder. A validator may /// specify multiple price feeders by delegating them consent. The validator /// address is also a valid feeder by default. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub feeder: ::prost::alloc::string::String, /// Validator is the Bech32 address to which the prevote will be credited. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub validator: ::prost::alloc::string::String, } /// MsgAggregateExchangeRatePrevoteResponse defines the /// Msg/AggregateExchangeRatePrevote response type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgAggregateExchangeRatePrevoteResponse {} +pub struct MsgAggregateExchangeRatePrevoteResponse { +} /// MsgAggregateExchangeRateVote represents a message to submit /// aggregate exchange rate vote. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgAggregateExchangeRateVote { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub salt: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub exchange_rates: ::prost::alloc::string::String, /// Feeder is the Bech32 address of the price feeder. A validator may /// specify multiple price feeders by delegating them consent. The validator /// address is also a valid feeder by default. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub feeder: ::prost::alloc::string::String, /// Validator is the Bech32 address to which the vote will be credited. - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub validator: ::prost::alloc::string::String, } /// MsgAggregateExchangeRateVoteResponse defines the /// Msg/AggregateExchangeRateVote response type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgAggregateExchangeRateVoteResponse {} +pub struct MsgAggregateExchangeRateVoteResponse { +} /// MsgDelegateFeedConsent represents a message to delegate oracle voting rights /// to another address. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgDelegateFeedConsent { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub operator: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub delegate: ::prost::alloc::string::String, } /// MsgDelegateFeedConsentResponse defines the Msg/DelegateFeedConsent response /// type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgDelegateFeedConsentResponse {} +pub struct MsgDelegateFeedConsentResponse { +} // @@protoc_insertion_point(module) diff --git a/nibiru-std/src/proto/buf/nibiru.perp.v2.rs b/nibiru-std/src/proto/buf/nibiru.perp.v2.rs index e611868..67a15ee 100644 --- a/nibiru-std/src/proto/buf/nibiru.perp.v2.rs +++ b/nibiru-std/src/proto/buf/nibiru.perp.v2.rs @@ -4,57 +4,56 @@ pub struct Market { /// the trading pair represented by this market /// always BASE:QUOTE, e.g. BTC:NUSD or ETH:NUSD - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, /// whether or not the market is enabled - #[prost(bool, tag = "2")] + #[prost(bool, tag="2")] pub enabled: bool, /// the version of the Market, only one market can exist per pair, when one is closed it cannot be reactivated, /// so a new market must be created, this is the version of the market - #[prost(uint64, tag = "14")] + #[prost(uint64, tag="14")] pub version: u64, /// the minimum margin ratio which a user must maintain on this market - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub maintenance_margin_ratio: ::prost::alloc::string::String, /// the maximum leverage a user is able to be taken on this market - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub max_leverage: ::prost::alloc::string::String, /// Latest cumulative premium fraction for a given pair. /// Calculated once per funding rate interval. /// A premium fraction is the difference between mark and index, divided by the /// number of payments per day. (mark - index) / # payments in a day - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub latest_cumulative_premium_fraction: ::prost::alloc::string::String, /// the percentage of the notional given to the exchange when trading - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub exchange_fee_ratio: ::prost::alloc::string::String, /// the percentage of the notional transferred to the ecosystem fund when /// trading - #[prost(string, tag = "7")] + #[prost(string, tag="7")] pub ecosystem_fund_fee_ratio: ::prost::alloc::string::String, /// the percentage of liquidated position that will be /// given to out as a reward. Half of the liquidation fee is given to the /// liquidator, and the other half is given to the ecosystem fund. - #[prost(string, tag = "8")] + #[prost(string, tag="8")] pub liquidation_fee_ratio: ::prost::alloc::string::String, /// the portion of the position size we try to liquidate if the available /// margin is higher than liquidation fee - #[prost(string, tag = "9")] + #[prost(string, tag="9")] pub partial_liquidation_ratio: ::prost::alloc::string::String, /// specifies the interval on which the funding rate is updated - #[prost(string, tag = "10")] + #[prost(string, tag="10")] pub funding_rate_epoch_id: ::prost::alloc::string::String, /// amount of time to look back for TWAP calculations - #[prost(message, optional, tag = "11")] + #[prost(message, optional, tag="11")] pub twap_lookback_window: ::core::option::Option<::prost_types::Duration>, /// the amount of collateral already credited from the ecosystem fund - #[prost(message, optional, tag = "12")] - pub prepaid_bad_debt: - ::core::option::Option, + #[prost(message, optional, tag="12")] + pub prepaid_bad_debt: ::core::option::Option, /// the maximum funding rate payment per epoch, this represents the maximum /// amount of funding that can be paid out per epoch as a percentage of the /// position size - #[prost(string, tag = "13")] + #[prost(string, tag="13")] pub max_funding_rate: ::prost::alloc::string::String, } /// MarketLastVersion is used to store the last version of the market @@ -62,88 +61,92 @@ pub struct Market { #[derive(Clone, PartialEq, ::prost::Message)] pub struct MarketLastVersion { /// version of the market - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub version: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Amm { /// identifies the market this AMM belongs to - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, /// the version of the AMM, only one AMM can exist per pair, when one is closed it cannot be reactivated, /// so a new AMM must be created, this is the version of the AMM - #[prost(uint64, tag = "8")] + #[prost(uint64, tag="8")] pub version: u64, /// the amount of base reserves this AMM has - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub base_reserve: ::prost::alloc::string::String, /// the amount of quote reserves this AMM has - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub quote_reserve: ::prost::alloc::string::String, /// sqrt(k) - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub sqrt_depth: ::prost::alloc::string::String, /// the price multiplier of the dynamic AMM - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub price_multiplier: ::prost::alloc::string::String, /// Total long refers to the sum of long open notional in base. - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub total_long: ::prost::alloc::string::String, /// Total short refers to the sum of short open notional in base. - #[prost(string, tag = "7")] + #[prost(string, tag="7")] pub total_short: ::prost::alloc::string::String, + /// The settlement price if the AMM is settled. + #[prost(string, tag="9")] + pub settlement_price: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Position { /// address identifies the address owner of this position - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub trader_address: ::prost::alloc::string::String, /// pair identifies the pair associated with this position - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub pair: ::prost::alloc::string::String, /// the position size - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub size: ::prost::alloc::string::String, /// amount of margin remaining in the position - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub margin: ::prost::alloc::string::String, /// value of position in quote assets when opened - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub open_notional: ::prost::alloc::string::String, /// The most recent cumulative premium fraction this position has. /// Used to calculate the next funding payment. - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub latest_cumulative_premium_fraction: ::prost::alloc::string::String, /// last block number this position was updated - #[prost(int64, tag = "7")] + #[prost(int64, tag="7")] pub last_updated_block_number: i64, } /// a snapshot of the perp.amm's reserves at a given point in time #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ReserveSnapshot { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub amm: ::core::option::Option, /// milliseconds since unix epoch - #[prost(int64, tag = "2")] + #[prost(int64, tag="2")] pub timestamp_ms: i64, } +/// DNRAllocation represents a rebates allocation for a given epoch. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DnrAllocation { + /// epoch defines the reference epoch for the allocation. + #[prost(uint64, tag="1")] + pub epoch: u64, + /// amount of DNR allocated for the epoch. + #[prost(message, repeated, tag="2")] + pub amount: ::prost::alloc::vec::Vec, +} /// The direction that the user is trading in /// LONG means the user is going long the base asset (e.g. buy BTC) /// SHORT means the user is shorting the base asset (e.g. sell BTC) -#[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration, -)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum Direction { Unspecified = 0, @@ -173,17 +176,7 @@ impl Direction { } } /// Enumerates different options of calculating twap. -#[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration, -)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum TwapCalcOption { Unspecified = 0, @@ -222,38 +215,36 @@ impl TwapCalcOption { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PositionChangedEvent { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub final_position: ::core::option::Option, /// Position notional (in quote units) after the change. In general, /// 'notional = baseAmount * priceQuotePerBase', where size is the baseAmount. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub position_notional: ::prost::alloc::string::String, /// Transaction fee paid. A "taker" fee. - #[prost(message, optional, tag = "3")] - pub transaction_fee: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub transaction_fee: ::core::option::Option, /// realize profits and losses after the change - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub realized_pnl: ::prost::alloc::string::String, /// Amount of bad debt cleared by the PerpEF during the change. /// Bad debt is negative net margin past the liquidation point of a position. - #[prost(message, optional, tag = "5")] - pub bad_debt: - ::core::option::Option, + #[prost(message, optional, tag="5")] + pub bad_debt: ::core::option::Option, /// A funding payment made or received by the trader on the current position. /// 'fundingPayment' is positive if 'owner' is the sender and negative if 'owner' /// is the receiver of the payment. Its magnitude is abs(size * fundingRate). /// Funding payments act to converge the mark price and index price /// (average price on major exchanges). - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub funding_payment: ::prost::alloc::string::String, /// The block number at which this position was changed. - #[prost(int64, tag = "7")] + #[prost(int64, tag="7")] pub block_height: i64, /// margin_to_user is the amount of collateral received by the trader during /// the position change. A positve value indicates that the trader received /// funds, while a negative value indicates that the trader spent funds. - #[prost(string, tag = "8")] + #[prost(string, tag="8")] pub margin_to_user: ::prost::alloc::string::String, /// change_reason describes the reason for why the position resulted in a /// change. Change type can take the following values: @@ -263,19 +254,19 @@ pub struct PositionChangedEvent { /// - CHANGE_REASON_REMOVE_MARGIN: Margin was removed from the position. /// - CHANGE_REASON_OPEN_POSITION: A new position was opened. /// - CHANGE_REASON_CLOSE_POSITION: An existing position was closed. - #[prost(string, tag = "9")] + #[prost(string, tag="9")] pub change_reason: ::prost::alloc::string::String, /// exchanged_size represent the change in size for an existing position /// after the change. A positive value indicates that the position size /// increased, while a negative value indicates that the position size /// decreased. - #[prost(string, tag = "10")] + #[prost(string, tag="10")] pub exchanged_size: ::prost::alloc::string::String, /// exchanged_notional represent the change in notional for an existing /// position after the change. A positive value indicates that the position /// notional increased, while a negative value indicates that the position /// notional decreased. - #[prost(string, tag = "11")] + #[prost(string, tag="11")] pub exchanged_notional: ::prost::alloc::string::String, } /// Emitted when a position is liquidated. Wraps a PositionChanged event since a @@ -283,56 +274,53 @@ pub struct PositionChangedEvent { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PositionLiquidatedEvent { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub position_changed_event: ::core::option::Option, /// Address of the account that executed the tx. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub liquidator_address: ::prost::alloc::string::String, /// Commission (in margin units) received by 'liquidator'. - #[prost(message, optional, tag = "3")] - pub fee_to_liquidator: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub fee_to_liquidator: ::core::option::Option, /// Commission (in margin units) given to the ecosystem fund. - #[prost(message, optional, tag = "4")] - pub fee_to_ecosystem_fund: - ::core::option::Option, + #[prost(message, optional, tag="4")] + pub fee_to_ecosystem_fund: ::core::option::Option, } /// Emitted when a position is settled. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PositionSettledEvent { /// Identifier for the virtual pool of the position. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, /// Owner of the position. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub trader_address: ::prost::alloc::string::String, /// Settled coin as dictated by the settlement price of the perp.amm. - #[prost(message, repeated, tag = "3")] - pub settled_coins: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="3")] + pub settled_coins: ::prost::alloc::vec::Vec, } /// Emitted when the funding rate changes for a market. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct FundingRateChangedEvent { /// The pair for which the funding rate was calculated. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, /// The mark price of the pair. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub mark_price_twap: ::prost::alloc::string::String, /// The oracle index price of the pair. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub index_price_twap: ::prost::alloc::string::String, /// The latest premium fraction just calculated. - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub premium_fraction: ::prost::alloc::string::String, /// The market's latest cumulative premium fraction. /// The funding payment a position will pay is the difference between this /// value and the latest cumulative premium fraction on the position, /// multiplied by the position size. - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub cumulative_premium_fraction: ::prost::alloc::string::String, } /// Emitted when liquidation fails. @@ -340,34 +328,21 @@ pub struct FundingRateChangedEvent { #[derive(Clone, PartialEq, ::prost::Message)] pub struct LiquidationFailedEvent { /// The pair for which we are trying to liquidate. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, /// owner of the position. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub trader: ::prost::alloc::string::String, /// Address of the account that executed the tx. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub liquidator: ::prost::alloc::string::String, /// Reason for the liquidation failure. - #[prost( - enumeration = "liquidation_failed_event::LiquidationFailedReason", - tag = "4" - )] + #[prost(enumeration="liquidation_failed_event::LiquidationFailedReason", tag="4")] pub reason: i32, } /// Nested message and enum types in `LiquidationFailedEvent`. pub mod liquidation_failed_event { - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration, - )] + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum LiquidationFailedReason { Unspecified = 0, @@ -388,9 +363,7 @@ pub mod liquidation_failed_event { LiquidationFailedReason::Unspecified => "UNSPECIFIED", LiquidationFailedReason::PositionHealthy => "POSITION_HEALTHY", LiquidationFailedReason::NonexistentPair => "NONEXISTENT_PAIR", - LiquidationFailedReason::NonexistentPosition => { - "NONEXISTENT_POSITION" - } + LiquidationFailedReason::NonexistentPosition => "NONEXISTENT_POSITION", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -415,13 +388,13 @@ pub mod liquidation_failed_event { #[derive(Clone, PartialEq, ::prost::Message)] pub struct AmmUpdatedEvent { /// the final state of the AMM - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub final_amm: ::core::option::Option, /// The mark price of the pair. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub mark_price_twap: ::prost::alloc::string::String, /// The oracle index price of the pair. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub index_price_twap: ::prost::alloc::string::String, } /// This event is emitted at the end of every block for persisting market changes @@ -436,228 +409,312 @@ pub struct AmmUpdatedEvent { #[derive(Clone, PartialEq, ::prost::Message)] pub struct MarketUpdatedEvent { /// the final state of the market - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub final_market: ::core::option::Option, } +/// EventShiftPegMultiplier: ABCI event emitted from MsgShiftPegMultiplier +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventShiftPegMultiplier { + #[prost(string, tag="1")] + pub old_peg_multiplier: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub new_peg_multiplier: ::prost::alloc::string::String, + #[prost(message, optional, tag="3")] + pub cost_paid: ::core::option::Option, +} +/// EventShiftSwapInvariant: ABCI event emitted from MsgShiftSwapInvariant +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EventShiftSwapInvariant { + #[prost(string, tag="1")] + pub old_swap_invariant: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub new_swap_invariant: ::prost::alloc::string::String, + #[prost(message, optional, tag="3")] + pub cost_paid: ::core::option::Option, +} /// GenesisState defines the perp module's genesis state. /// Thge genesis state is used not only to start the network but also useful for /// exporting and importing state during network upgrades. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisState { - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub markets: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "3")] + #[prost(message, repeated, tag="3")] pub amms: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "4")] - pub positions: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "5")] + #[prost(message, repeated, tag="4")] + pub positions: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="5")] pub reserve_snapshots: ::prost::alloc::vec::Vec, - #[prost(uint64, tag = "6")] + #[prost(uint64, tag="6")] pub dnr_epoch: u64, - #[prost(message, repeated, tag = "7")] + /// For testing purposes, we allow the collateral to be set at genesis + #[prost(string, tag="11")] + pub collateral_denom: ::prost::alloc::string::String, + #[prost(message, repeated, tag="7")] pub trader_volumes: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "8")] + #[prost(message, repeated, tag="8")] pub global_discount: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "9")] - pub custom_discounts: - ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "10")] + #[prost(message, repeated, tag="9")] + pub custom_discounts: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="10")] pub market_last_versions: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="13")] + pub global_volumes: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="12")] + pub rebates_allocations: ::prost::alloc::vec::Vec, + #[prost(string, tag="14")] + pub dnr_epoch_name: ::prost::alloc::string::String, } /// Nested message and enum types in `GenesisState`. pub mod genesis_state { #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct TraderVolume { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub trader: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub epoch: u64, - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub volume: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct Discount { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub fee: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub volume: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct CustomDiscount { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub trader: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub discount: ::core::option::Option, } + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] + pub struct GlobalVolume { + #[prost(uint64, tag="1")] + pub epoch: u64, + #[prost(string, tag="2")] + pub volume: ::prost::alloc::string::String, + } } /// GenesisMarketLastVersion is the last version including pair only used for /// genesis #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisMarketLastVersion { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] + pub pair: ::prost::alloc::string::String, + #[prost(uint64, tag="2")] + pub version: u64, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GenesisPosition { + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub version: u64, + #[prost(message, optional, tag="3")] + pub position: ::core::option::Option, } // ---------------------------------------- Positions +/// QueryPositionsRequest: Request type for the +/// "nibiru.perp.v2.Query/Positions" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPositionsRequest { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub trader: ::prost::alloc::string::String, } +/// QueryPositionsResponse: Response type for the +/// "nibiru.perp.v2.Query/Positions" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPositionsResponse { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub positions: ::prost::alloc::vec::Vec, } +/// QueryPositionStoreRequest: Request type for the +/// "nibiru.perp.v2.Query/PositionStore" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPositionStoreRequest { /// pagination defines a paginated request - #[prost(message, optional, tag = "1")] - pub pagination: ::core::option::Option< - crate::proto::cosmos::base::query::v1beta1::PageRequest, - >, + #[prost(message, optional, tag="1")] + pub pagination: ::core::option::Option, } +/// QueryPositionStoreResponse: Response type for the +/// "nibiru.perp.v2.Query/PositionStore" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPositionStoreResponse { /// Position responses: collection of all stored positions (with pagination) - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub positions: ::prost::alloc::vec::Vec, /// pagination defines a paginated response - #[prost(message, optional, tag = "2")] - pub pagination: ::core::option::Option< - crate::proto::cosmos::base::query::v1beta1::PageResponse, - >, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } // ---------------------------------------- Position -/// QueryPositionRequest is the request type for the position of the x/perp -/// module account. +/// QueryPositionRequest: Request type for the +/// "nibiru.perp.v2.Query/Position" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPositionRequest { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub trader: ::prost::alloc::string::String, } +/// QueryPositionResponse: Response type for the +/// "nibiru.perp.v2.Query/Position" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPositionResponse { /// The position as it exists in the blockchain state - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub position: ::core::option::Option, /// The position's current notional value, if it were to be entirely closed (in /// margin units). - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub position_notional: ::prost::alloc::string::String, /// The position's unrealized PnL. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub unrealized_pnl: ::prost::alloc::string::String, /// margin ratio of the position based on the spot price - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub margin_ratio: ::prost::alloc::string::String, } // ---------------------------------------- QueryModuleAccounts +/// QueryModuleAccountsRequest: Request type for the +/// "nibiru.perp.v2.Query/ModuleAccounts" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryModuleAccountsRequest {} +pub struct QueryModuleAccountsRequest { +} +/// QueryModuleAccountsResponse: Response type for the +/// "nibiru.perp.v2.Query/ModuleAccounts" gRPC service method #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryModuleAccountsResponse { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub accounts: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AccountWithBalance { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub name: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub address: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "3")] - pub balance: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="3")] + pub balance: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AmmMarket { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub market: ::core::option::Option, - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub amm: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryMarketsRequest { - #[prost(bool, tag = "1")] + #[prost(bool, tag="1")] pub versioned: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryMarketsResponse { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub amm_markets: ::prost::alloc::vec::Vec, } +// ---------------------------------------- QueryCollateral + +/// QueryCollateralRequest: Request type for the +/// "nibiru.perp.v2.Query/Collateral" gRPC service method +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryCollateralRequest { +} +/// QueryCollateralRequest: Response type for the +/// "nibiru.perp.v2.Query/Collateral" gRPC service method +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryCollateralResponse { + #[prost(string, tag="1")] + pub collateral_denom: ::prost::alloc::string::String, +} +// -------------------------- Settle Position -------------------------- + +/// MsgSettlePosition: Msg to remove margin. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgSettlePosition { + #[prost(string, tag="1")] + pub sender: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub pair: ::prost::alloc::string::String, + #[prost(uint64, tag="3")] + pub version: u64, +} // -------------------------- RemoveMargin -------------------------- -/// MsgRemoveMargin: Msg to remove margin. +/// MsgRemoveMargin: Msg to remove margin. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgRemoveMargin { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub pair: ::prost::alloc::string::String, - #[prost(message, optional, tag = "3")] - pub margin: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub margin: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgRemoveMarginResponse { /// tokens transferred back to the trader - #[prost(message, optional, tag = "1")] - pub margin_out: - ::core::option::Option, + #[prost(message, optional, tag="1")] + pub margin_out: ::core::option::Option, /// the funding payment applied on this position interaction - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub funding_payment: ::prost::alloc::string::String, /// The resulting position - #[prost(message, optional, tag = "3")] + #[prost(message, optional, tag="3")] pub position: ::core::option::Option, } // -------------------------- AddMargin -------------------------- -/// MsgAddMargin: Msg to remove margin. +/// MsgAddMargin: Msg to remove margin. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgAddMargin { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub pair: ::prost::alloc::string::String, - #[prost(message, optional, tag = "3")] - pub margin: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub margin: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgAddMarginResponse { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub funding_payment: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub position: ::core::option::Option, } // -------------------------- Liquidation -------------------------- @@ -665,51 +722,48 @@ pub struct MsgAddMarginResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgMultiLiquidate { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub liquidations: ::prost::alloc::vec::Vec, } /// Nested message and enum types in `MsgMultiLiquidate`. pub mod msg_multi_liquidate { #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct Liquidation { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pair: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub trader: ::prost::alloc::string::String, } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgMultiLiquidateResponse { - #[prost(message, repeated, tag = "1")] - pub liquidations: ::prost::alloc::vec::Vec< - msg_multi_liquidate_response::LiquidationResponse, - >, + #[prost(message, repeated, tag="1")] + pub liquidations: ::prost::alloc::vec::Vec, } /// Nested message and enum types in `MsgMultiLiquidateResponse`. pub mod msg_multi_liquidate_response { #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct LiquidationResponse { - #[prost(bool, tag = "1")] + #[prost(bool, tag="1")] pub success: bool, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub error: ::prost::alloc::string::String, /// nullable since no fee is taken on failed liquidation - #[prost(message, optional, tag = "3")] - pub liquidator_fee: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub liquidator_fee: ::core::option::Option, /// perp ecosystem fund - #[prost(message, optional, tag = "4")] - pub perp_ef_fee: - ::core::option::Option, + #[prost(message, optional, tag="4")] + pub perp_ef_fee: ::core::option::Option, // nullable since no fee is taken on failed liquidation - #[prost(string, tag = "5")] + + #[prost(string, tag="5")] pub trader: ::prost::alloc::string::String, - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub pair: ::prost::alloc::string::String, } } @@ -718,49 +772,49 @@ pub mod msg_multi_liquidate_response { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgMarketOrder { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub pair: ::prost::alloc::string::String, - #[prost(enumeration = "Direction", tag = "3")] + #[prost(enumeration="Direction", tag="3")] pub side: i32, - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub quote_asset_amount: ::prost::alloc::string::String, - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub leverage: ::prost::alloc::string::String, - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub base_asset_amount_limit: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgMarketOrderResponse { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub position: ::core::option::Option, /// The amount of quote assets exchanged. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub exchanged_notional_value: ::prost::alloc::string::String, /// The amount of base assets exchanged. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub exchanged_position_size: ::prost::alloc::string::String, /// The funding payment applied on this position change, measured in quote /// units. - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub funding_payment: ::prost::alloc::string::String, /// The amount of PnL realized on this position changed, measured in quote /// units. - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub realized_pnl: ::prost::alloc::string::String, /// The unrealized PnL in the position after the position change, measured in /// quote units. - #[prost(string, tag = "6")] + #[prost(string, tag="6")] pub unrealized_pnl_after: ::prost::alloc::string::String, /// The amount of margin the trader has to give to the vault. /// A negative value means the vault pays the trader. - #[prost(string, tag = "7")] + #[prost(string, tag="7")] pub margin_to_vault: ::prost::alloc::string::String, /// The position's notional value after the position change, measured in quote /// units. - #[prost(string, tag = "8")] + #[prost(string, tag="8")] pub position_notional: ::prost::alloc::string::String, } // -------------------------- ClosePosition -------------------------- @@ -768,63 +822,63 @@ pub struct MsgMarketOrderResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgClosePosition { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub pair: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgClosePositionResponse { /// The amount of quote assets exchanged. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub exchanged_notional_value: ::prost::alloc::string::String, /// The amount of base assets exchanged. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub exchanged_position_size: ::prost::alloc::string::String, /// The funding payment applied on this position change, measured in quote /// units. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub funding_payment: ::prost::alloc::string::String, /// The amount of PnL realized on this position changed, measured in quote /// units. - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub realized_pnl: ::prost::alloc::string::String, /// The amount of margin the trader receives after closing the position, from /// the vault. Should never be negative. - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub margin_to_trader: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgPartialClose { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub pair: ::prost::alloc::string::String, - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub size: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgPartialCloseResponse { /// The amount of quote assets exchanged. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub exchanged_notional_value: ::prost::alloc::string::String, /// The amount of base assets exchanged. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub exchanged_position_size: ::prost::alloc::string::String, /// The funding payment applied on this position change, measured in quote /// units. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub funding_payment: ::prost::alloc::string::String, /// The amount of PnL realized on this position changed, measured in quote /// units. - #[prost(string, tag = "4")] + #[prost(string, tag="4")] pub realized_pnl: ::prost::alloc::string::String, /// The amount of margin the trader receives after closing the position, from /// the vault. Should never be negative. - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub margin_to_trader: ::prost::alloc::string::String, } // -------------------------- DonateToEcosystemFund -------------------------- @@ -832,14 +886,97 @@ pub struct MsgPartialCloseResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgDonateToEcosystemFund { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, /// donation to the EF - #[prost(message, optional, tag = "2")] - pub donation: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub donation: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgDonateToEcosystemFundResponse {} +pub struct MsgDonateToEcosystemFundResponse { +} +// ----------------------- MsgChangeCollateralDenom ----------------------- + +/// MsgChangeCollateralDenom: Changes the collateral denom for the module. +/// \[Admin\] Only callable by sudoers. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgChangeCollateralDenom { + #[prost(string, tag="1")] + pub sender: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub new_denom: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgChangeCollateralDenomResponse { +} +/// -------------------------- AllocateEpochRebates -------------------------- +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgAllocateEpochRebates { + #[prost(string, tag="1")] + pub sender: ::prost::alloc::string::String, + /// rebates to allocate + #[prost(message, repeated, tag="2")] + pub rebates: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgAllocateEpochRebatesResponse { + #[prost(message, repeated, tag="1")] + pub total_epoch_rebates: ::prost::alloc::vec::Vec, +} +/// -------------------------- WithdrawEpochRebates -------------------------- +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgWithdrawEpochRebates { + #[prost(string, tag="1")] + pub sender: ::prost::alloc::string::String, + #[prost(uint64, repeated, tag="2")] + pub epochs: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgWithdrawEpochRebatesResponse { + #[prost(message, repeated, tag="1")] + pub withdrawn_rebates: ::prost::alloc::vec::Vec, +} +// -------------------------- ShiftPegMultiplier -------------------------- + +/// ShiftPegMultiplier: gRPC tx msg for changing the peg multiplier. +/// Admin-only. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgShiftPegMultiplier { + #[prost(string, tag="1")] + pub sender: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub pair: ::prost::alloc::string::String, + #[prost(string, tag="3")] + pub new_peg_mult: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgShiftPegMultiplierResponse { +} +// -------------------------- ShiftSwapInvariant -------------------------- + +/// ShiftSwapInvariant: gRPC tx msg for changing the swap invariant. +/// Admin-only. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgShiftSwapInvariant { + #[prost(string, tag="1")] + pub sender: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub pair: ::prost::alloc::string::String, + #[prost(string, tag="3")] + pub new_swap_invariant: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgShiftSwapInvariantResponse { +} // @@protoc_insertion_point(module) diff --git a/nibiru-std/src/proto/buf/nibiru.spot.v1.rs b/nibiru-std/src/proto/buf/nibiru.spot.v1.rs index 72f841f..dadedca 100644 --- a/nibiru-std/src/proto/buf/nibiru.spot.v1.rs +++ b/nibiru-std/src/proto/buf/nibiru.spot.v1.rs @@ -3,18 +3,18 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PoolParams { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub swap_fee: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub exit_fee: ::prost::alloc::string::String, /// Amplification Parameter (A): Larger value of A make the curve better /// resemble a straight line in the center (when pool is near balance). Highly /// volatile assets should use a lower value, while assets that are closer /// together may be best with a higher value. This is only used if the /// pool_type is set to 1 (stableswap) - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub a: ::prost::alloc::string::String, - #[prost(enumeration = "PoolType", tag = "4")] + #[prost(enumeration="PoolType", tag="4")] pub pool_type: i32, } /// Which assets the pool contains. @@ -23,51 +23,40 @@ pub struct PoolParams { pub struct PoolAsset { /// Coins we are talking about, /// the denomination must be unique amongst all PoolAssets for this pool. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub token: ::core::option::Option, /// Weight that is not normalized. This weight must be less than 2^50 - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub weight: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Pool { /// The pool id. - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub id: u64, /// The pool account address. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub address: ::prost::alloc::string::String, /// Fees and other pool-specific parameters. - #[prost(message, optional, tag = "3")] + #[prost(message, optional, tag="3")] pub pool_params: ::core::option::Option, /// These are assumed to be sorted by denomiation. /// They contain the pool asset and the information about the weight - #[prost(message, repeated, tag = "4")] + #[prost(message, repeated, tag="4")] pub pool_assets: ::prost::alloc::vec::Vec, /// sum of all non-normalized pool weights - #[prost(string, tag = "5")] + #[prost(string, tag="5")] pub total_weight: ::prost::alloc::string::String, /// sum of all LP tokens sent out - #[prost(message, optional, tag = "6")] - pub total_shares: - ::core::option::Option, + #[prost(message, optional, tag="6")] + pub total_shares: ::core::option::Option, } /// - `balancer`: Balancer are pools defined by the equation xy=k, extended by /// the weighs introduced by Balancer. /// - `stableswap`: Stableswap pools are defined by a combination of /// constant-product and constant-sum pool -#[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration, -)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum PoolType { Balancer = 0, @@ -97,91 +86,79 @@ impl PoolType { #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventPoolCreated { /// the address of the user who created the pool - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub creator: ::prost::alloc::string::String, /// the create pool fee - #[prost(message, repeated, tag = "2")] - pub fees: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="2")] + pub fees: ::prost::alloc::vec::Vec, /// the final state of the pool - #[prost(message, optional, tag = "4")] + #[prost(message, optional, tag="4")] pub final_pool: ::core::option::Option, /// the amount of pool shares that the user received - #[prost(message, optional, tag = "5")] - pub final_user_pool_shares: - ::core::option::Option, + #[prost(message, optional, tag="5")] + pub final_user_pool_shares: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventPoolJoined { /// the address of the user who joined the pool - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// the amount of tokens that the user deposited - #[prost(message, repeated, tag = "2")] - pub tokens_in: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="2")] + pub tokens_in: ::prost::alloc::vec::Vec, /// the amount of pool shares that the user received - #[prost(message, optional, tag = "3")] - pub pool_shares_out: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub pool_shares_out: ::core::option::Option, /// the amount of tokens remaining for the user - #[prost(message, repeated, tag = "4")] - pub rem_coins: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="4")] + pub rem_coins: ::prost::alloc::vec::Vec, /// the final state of the pool - #[prost(message, optional, tag = "5")] + #[prost(message, optional, tag="5")] pub final_pool: ::core::option::Option, /// the final amount of user pool shares - #[prost(message, optional, tag = "6")] - pub final_user_pool_shares: - ::core::option::Option, + #[prost(message, optional, tag="6")] + pub final_user_pool_shares: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventPoolExited { /// the address of the user who exited the pool - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// the amount of pool shares that the user exited with - #[prost(message, optional, tag = "2")] - pub pool_shares_in: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub pool_shares_in: ::core::option::Option, /// the amount of tokens returned to the user - #[prost(message, repeated, tag = "3")] - pub tokens_out: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="3")] + pub tokens_out: ::prost::alloc::vec::Vec, /// the amount of fees collected by the pool - #[prost(message, repeated, tag = "4")] - pub fees: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="4")] + pub fees: ::prost::alloc::vec::Vec, /// the final state of the pool - #[prost(message, optional, tag = "5")] + #[prost(message, optional, tag="5")] pub final_pool: ::core::option::Option, /// the final amount of user pool shares - #[prost(message, optional, tag = "6")] - pub final_user_pool_shares: - ::core::option::Option, + #[prost(message, optional, tag="6")] + pub final_user_pool_shares: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventAssetsSwapped { /// the address of the user who swapped tokens - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub address: ::prost::alloc::string::String, /// the amount of tokens that the user deposited - #[prost(message, optional, tag = "2")] - pub token_in: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub token_in: ::core::option::Option, /// the amount of tokens that the user received - #[prost(message, optional, tag = "3")] - pub token_out: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub token_out: ::core::option::Option, /// the amount of fees collected by the pool - #[prost(message, optional, tag = "4")] + #[prost(message, optional, tag="4")] pub fee: ::core::option::Option, /// the final state of the pool - #[prost(message, optional, tag = "5")] + #[prost(message, optional, tag="5")] pub final_pool: ::core::option::Option, } /// Params defines the parameters for the module. @@ -189,142 +166,137 @@ pub struct EventAssetsSwapped { #[derive(Clone, PartialEq, ::prost::Message)] pub struct Params { /// The start pool number, i.e. the first pool number that isn't taken yet. - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub starting_pool_number: u64, /// The cost of creating a pool, taken from the pool creator's account. - #[prost(message, repeated, tag = "2")] - pub pool_creation_fee: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="2")] + pub pool_creation_fee: ::prost::alloc::vec::Vec, /// The assets that can be used to create liquidity pools - #[prost(string, repeated, tag = "3")] - pub whitelisted_asset: - ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(string, repeated, tag="3")] + pub whitelisted_asset: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// GenesisState defines the spot module's genesis state. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisState { /// params defines all the parameters of the module. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, /// pools defines all the pools of the module. - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub pools: ::prost::alloc::vec::Vec, } /// QueryParamsRequest is request type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryParamsRequest {} +pub struct QueryParamsRequest { +} /// QueryParamsResponse is response type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryParamsResponse { /// params holds all the parameters of this module. - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryPoolNumberRequest {} +pub struct QueryPoolNumberRequest { +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPoolNumberResponse { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPoolRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPoolResponse { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub pool: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPoolsRequest { /// pagination defines an optional pagination for the request. - #[prost(message, optional, tag = "1")] - pub pagination: ::core::option::Option< - crate::proto::cosmos::base::query::v1beta1::PageRequest, - >, + #[prost(message, optional, tag="1")] + pub pagination: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPoolsResponse { - #[prost(message, repeated, tag = "1")] + #[prost(message, repeated, tag="1")] pub pools: ::prost::alloc::vec::Vec, /// pagination defines the pagination in the response. - #[prost(message, optional, tag = "2")] - pub pagination: ::core::option::Option< - crate::proto::cosmos::base::query::v1beta1::PageResponse, - >, + #[prost(message, optional, tag="2")] + pub pagination: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPoolParamsRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryPoolParamsResponse { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub pool_params: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryNumPoolsRequest {} +pub struct QueryNumPoolsRequest { +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryNumPoolsResponse { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub num_pools: u64, } /// -------------------------------------------- /// Query total liquidity the protocol #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryTotalLiquidityRequest {} +pub struct QueryTotalLiquidityRequest { +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryTotalLiquidityResponse { - #[prost(message, repeated, tag = "1")] - pub liquidity: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="1")] + pub liquidity: ::prost::alloc::vec::Vec, } /// -------------------------------------------- /// Query total liquidity for a pool #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryTotalPoolLiquidityRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryTotalPoolLiquidityResponse { - #[prost(message, repeated, tag = "1")] - pub liquidity: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="1")] + pub liquidity: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryTotalSharesRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryTotalSharesResponse { /// sum of all LP tokens sent out - #[prost(message, optional, tag = "1")] - pub total_shares: - ::core::option::Option, + #[prost(message, optional, tag="1")] + pub total_shares: ::core::option::Option, } /// Returns the amount of tokenInDenom to produce 1 tokenOutDenom /// For example, if the price of NIBI = 9.123 NUSD, then setting @@ -332,19 +304,19 @@ pub struct QueryTotalSharesResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySpotPriceRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, /// the denomination of the token you are giving into the pool - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub token_in_denom: ::prost::alloc::string::String, /// the denomination of the token you are taking out of the pool - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub token_out_denom: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySpotPriceResponse { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub spot_price: ::prost::alloc::string::String, } /// Given an exact amount of tokens in and a target tokenOutDenom, calculates @@ -352,21 +324,19 @@ pub struct QuerySpotPriceResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySwapExactAmountInRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, - #[prost(message, optional, tag = "2")] - pub token_in: - ::core::option::Option, - #[prost(string, tag = "3")] + #[prost(message, optional, tag="2")] + pub token_in: ::core::option::Option, + #[prost(string, tag="3")] pub token_out_denom: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySwapExactAmountInResponse { - #[prost(message, optional, tag = "2")] - pub token_out: - ::core::option::Option, - #[prost(message, optional, tag = "3")] + #[prost(message, optional, tag="2")] + pub token_out: ::core::option::Option, + #[prost(message, optional, tag="3")] pub fee: ::core::option::Option, } /// Given an exact amount of tokens out and a target tokenInDenom, calculates @@ -374,93 +344,89 @@ pub struct QuerySwapExactAmountInResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySwapExactAmountOutRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, - #[prost(message, optional, tag = "2")] - pub token_out: - ::core::option::Option, - #[prost(string, tag = "3")] + #[prost(message, optional, tag="2")] + pub token_out: ::core::option::Option, + #[prost(string, tag="3")] pub token_in_denom: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QuerySwapExactAmountOutResponse { - #[prost(message, optional, tag = "2")] - pub token_in: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub token_in: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryJoinExactAmountInRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, - #[prost(message, repeated, tag = "2")] - pub tokens_in: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="2")] + pub tokens_in: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryJoinExactAmountInResponse { /// amount of pool shares returned to user after join - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub pool_shares_out: ::prost::alloc::string::String, /// coins remaining after pool join - #[prost(message, repeated, tag = "2")] - pub rem_coins: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="2")] + pub rem_coins: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryJoinExactAmountOutRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryJoinExactAmountOutResponse {} +pub struct QueryJoinExactAmountOutResponse { +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryExitExactAmountInRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, /// amount of pool shares to return to pool - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub pool_shares_in: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryExitExactAmountInResponse { /// coins obtained after exiting - #[prost(message, repeated, tag = "1")] - pub tokens_out: - ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "2")] - pub fees: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="1")] + pub tokens_out: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="2")] + pub fees: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryExitExactAmountOutRequest { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryExitExactAmountOutResponse {} +pub struct QueryExitExactAmountOutResponse { +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgCreatePool { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub creator: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub pool_params: ::core::option::Option, - #[prost(message, repeated, tag = "3")] + #[prost(message, repeated, tag="3")] pub pool_assets: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgCreatePoolResponse { - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub pool_id: u64, } /// @@ -468,14 +434,13 @@ pub struct MsgCreatePoolResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgJoinPool { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub pool_id: u64, - #[prost(message, repeated, tag = "3")] - pub tokens_in: - ::prost::alloc::vec::Vec, - #[prost(bool, tag = "4")] + #[prost(message, repeated, tag="3")] + pub tokens_in: ::prost::alloc::vec::Vec, + #[prost(bool, tag="4")] pub use_all_coins: bool, } /// @@ -484,53 +449,47 @@ pub struct MsgJoinPool { #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgJoinPoolResponse { /// the final state of the pool after a join - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub pool: ::core::option::Option, /// sum of LP tokens minted from the join - #[prost(message, optional, tag = "2")] - pub num_pool_shares_out: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub num_pool_shares_out: ::core::option::Option, /// remaining tokens from attempting to join the pool - #[prost(message, repeated, tag = "3")] - pub remaining_coins: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="3")] + pub remaining_coins: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgExitPool { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub pool_id: u64, - #[prost(message, optional, tag = "3")] - pub pool_shares: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub pool_shares: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgExitPoolResponse { - #[prost(message, repeated, tag = "3")] - pub tokens_out: - ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag="3")] + pub tokens_out: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgSwapAssets { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] + #[prost(uint64, tag="2")] pub pool_id: u64, - #[prost(message, optional, tag = "3")] - pub token_in: - ::core::option::Option, - #[prost(string, tag = "4")] + #[prost(message, optional, tag="3")] + pub token_in: ::core::option::Option, + #[prost(string, tag="4")] pub token_out_denom: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgSwapAssetsResponse { - #[prost(message, optional, tag = "3")] - pub token_out: - ::core::option::Option, + #[prost(message, optional, tag="3")] + pub token_out: ::core::option::Option, } -// @@protoc_insertion_point(module) \ No newline at end of file +// @@protoc_insertion_point(module) diff --git a/nibiru-std/src/proto/buf/nibiru.stablecoin.v1.rs b/nibiru-std/src/proto/buf/nibiru.stablecoin.v1.rs deleted file mode 100644 index 756d4cd..0000000 --- a/nibiru-std/src/proto/buf/nibiru.stablecoin.v1.rs +++ /dev/null @@ -1,287 +0,0 @@ -// @generated -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventTransfer { - #[prost(message, optional, tag = "1")] - pub coin: ::core::option::Option, - #[prost(string, tag = "2")] - pub from: ::prost::alloc::string::String, - #[prost(string, tag = "3")] - pub to: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventMintStable { - #[prost(string, tag = "1")] - pub amount: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventBurnStable { - #[prost(string, tag = "1")] - pub amount: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventMintNibi { - #[prost(string, tag = "1")] - pub amount: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventBurnNibi { - #[prost(string, tag = "1")] - pub amount: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventRecollateralize { - #[prost(string, tag = "1")] - pub caller: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] - pub in_coin: - ::core::option::Option, - #[prost(message, optional, tag = "3")] - pub out_coin: - ::core::option::Option, - #[prost(string, tag = "4")] - pub coll_ratio: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EventBuyback { - #[prost(string, tag = "1")] - pub caller: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] - pub in_coin: - ::core::option::Option, - #[prost(message, optional, tag = "3")] - pub out_coin: - ::core::option::Option, - #[prost(string, tag = "4")] - pub coll_ratio: ::prost::alloc::string::String, -} -/// Params defines the parameters for the module. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Params { - /// collRatio is the ratio needed as collateral to exchange for stables - #[prost(int64, tag = "1")] - pub coll_ratio: i64, - /// feeRatio is the ratio taken as fees when minting or burning stables - #[prost(int64, tag = "2")] - pub fee_ratio: i64, - /// efFeeRatio is the ratio taken from the fees that goes to Ecosystem Fund - #[prost(int64, tag = "3")] - pub ef_fee_ratio: i64, - /// BonusRateRecoll is the percentage of extra stablecoin value given to the - /// caller of 'Recollateralize' in units of governance tokens. - #[prost(int64, tag = "4")] - pub bonus_rate_recoll: i64, - /// distr_epoch_identifier defines the frequnecy of update for the collateral - /// ratio - #[prost(string, tag = "5")] - pub distr_epoch_identifier: ::prost::alloc::string::String, - /// adjustmentStep is the size of the step taken when updating the collateral - /// ratio - #[prost(int64, tag = "6")] - pub adjustment_step: i64, - /// priceLowerBound is the lower bound for the stable coin to trigger a - /// collateral ratio update - #[prost(int64, tag = "7")] - pub price_lower_bound: i64, - /// priceUpperBound is the upper bound for the stable coin to trigger a - /// collateral ratio update - #[prost(int64, tag = "8")] - pub price_upper_bound: i64, - /// isCollateralRatioValid checks if the collateral ratio is correctly updated - #[prost(bool, tag = "9")] - pub is_collateral_ratio_valid: bool, -} -/// GenesisState defines the stablecoin module's genesis state. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GenesisState { - #[prost(message, optional, tag = "1")] - pub params: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub module_account_balance: - ::core::option::Option, -} -// ---------------------------------------- Params - -/// QueryParamsRequest is request type for the Query/Params RPC method. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryParamsRequest {} -/// QueryParamsResponse is response type for the Query/Params RPC method. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryParamsResponse { - /// params holds all the parameters of this module. - #[prost(message, optional, tag = "1")] - pub params: ::core::option::Option, -} -// ---------------------------------------- ModuleAccountBalances - -/// QueryModuleAccountBalances is the request type for the balance of the -/// x/stablecoin module account. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryModuleAccountBalances {} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryModuleAccountBalancesResponse { - /// ModuleAccountBalances is the balance of all coins in the x/stablecoin - /// module. - #[prost(message, repeated, tag = "1")] - pub module_account_balances: - ::prost::alloc::vec::Vec, -} -// ---------------------------------------- CirculatingSupplies - -/// QueryCirculatingSupplies is the request type for the circulating supply of -/// both NIBI and NUSD. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryCirculatingSupplies {} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryCirculatingSuppliesResponse { - #[prost(message, optional, tag = "1")] - pub nibi: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub nusd: ::core::option::Option, -} -// ---------------------------------------- GovToMintStable - -/// QueryGovToMintStable is the request type for the Query/GovToMintStable RPC -/// method -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryGovToMintStable { - #[prost(message, optional, tag = "1")] - pub collateral: - ::core::option::Option, -} -/// QueryGovToMintStableResponse is the response type for 'QueryGovToMintStable' -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryGovToMintStableResponse { - #[prost(message, optional, tag = "1")] - pub gov: ::core::option::Option, -} -// ---------------------------------------- Liquidity Ratio Info - -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct LiquidityRatioInfo { - #[prost(string, tag = "1")] - pub liquidity_ratio: ::prost::alloc::string::String, - #[prost(string, tag = "2")] - pub upper_band: ::prost::alloc::string::String, - #[prost(string, tag = "3")] - pub lower_band: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryLiquidityRatioInfoRequest {} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryLiquidityRatioInfoResponse { - #[prost(message, optional, tag = "1")] - pub info: ::core::option::Option, -} -/// -/// MsgMintStable: Msg to mint NUSD. A user deposits NIBI and collateral and gets -/// NUSD in return. The amount of NUSD received depends on the current price set -/// by the oracle library and the current collateral ratio for the protocol. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgMintStable { - #[prost(string, tag = "1")] - pub creator: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] - pub stable: - ::core::option::Option, -} -/// MsgMintStableResponse specifies the amount of NUSD token the user will -/// receive after their mint transaction -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgMintStableResponse { - #[prost(message, optional, tag = "1")] - pub stable: - ::core::option::Option, - #[prost(message, repeated, tag = "2")] - pub used_coins: - ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "3")] - pub fees_payed: - ::prost::alloc::vec::Vec, -} -/// -/// MsgBurnStable allows users to burn NUSD in exchange for NIBI and collateral. -/// The amount of NIBI and Collateral received depends on the current price set by -/// the x/oracle library and the current collateral ratio. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgBurnStable { - #[prost(string, tag = "1")] - pub creator: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] - pub stable: - ::core::option::Option, -} -/// MsgBurnStableResponse specifies the amount of collateral and governance -/// token the user will receive after their burn transaction. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgBurnStableResponse { - #[prost(message, optional, tag = "1")] - pub collateral: - ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub gov: ::core::option::Option, - #[prost(message, repeated, tag = "3")] - pub fees_payed: - ::prost::alloc::vec::Vec, -} -/// MsgRecollateralize -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgRecollateralize { - #[prost(string, tag = "1")] - pub creator: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] - pub coll: ::core::option::Option, -} -/// MsgRecollateralizeResponse is the output of a successful 'Recollateralize' -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgRecollateralizeResponse { - /// Gov (sdk.Coin): Tokens rewarded to the caller in exchange for her - /// collateral. - #[prost(message, optional, tag = "1")] - pub gov: ::core::option::Option, -} -/// MsgBuyback -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgBuyback { - #[prost(string, tag = "1")] - pub creator: ::prost::alloc::string::String, - /// Gov (sdk.Coin): Tokens the caller wants to sell to the protocol in exchange - /// for collateral. - #[prost(message, optional, tag = "2")] - pub gov: ::core::option::Option, -} -/// MsgBuybackResponse is the output of a successful 'Buyback' -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgBuybackResponse { - /// Coll (sdk.Coin): Tokens sold to the caller in exchange for her collateral. - #[prost(message, optional, tag = "1")] - pub coll: ::core::option::Option, -} -// @@protoc_insertion_point(module) \ No newline at end of file diff --git a/nibiru-std/src/proto/buf/nibiru.tokenfactory.v1.rs b/nibiru-std/src/proto/buf/nibiru.tokenfactory.v1.rs index c2024c0..639d81b 100644 --- a/nibiru-std/src/proto/buf/nibiru.tokenfactory.v1.rs +++ b/nibiru-std/src/proto/buf/nibiru.tokenfactory.v1.rs @@ -2,52 +2,51 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventCreateDenom { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub creator: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventChangeAdmin { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub new_admin: ::prost::alloc::string::String, - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub old_admin: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventMint { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub coin: ::core::option::Option, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub to_addr: ::prost::alloc::string::String, - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub caller: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventBurn { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub coin: ::core::option::Option, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub from_addr: ::prost::alloc::string::String, - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub caller: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventSetDenomMetadata { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, /// Metadata: Official x/bank metadata for the denom. All token factory denoms /// are standard, native assets. The "metadata.base" is the denom. - #[prost(message, optional, tag = "2")] - pub metadata: - ::core::option::Option, - #[prost(string, tag = "3")] + #[prost(message, optional, tag="2")] + pub metadata: ::core::option::Option, + #[prost(string, tag="3")] pub caller: ::prost::alloc::string::String, } /// DenomAuthorityMetadata specifies metadata foraddresses that have specific @@ -58,7 +57,7 @@ pub struct EventSetDenomMetadata { pub struct DenomAuthorityMetadata { /// Admin: Bech32 address of the admin for the tokefactory denom. Can be empty /// for no admin. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub admin: ::prost::alloc::string::String, } /// ModuleParams defines the parameters for the tokenfactory module. @@ -92,7 +91,7 @@ pub struct DenomAuthorityMetadata { pub struct ModuleParams { /// Adds gas consumption to the execution of `MsgCreateDenom` as a method of /// spam prevention. Defaults to 10 NIBI. - #[prost(uint64, tag = "1")] + #[prost(uint64, tag="1")] pub denom_creation_gas_consume: u64, } /// TFDenom is a token factory (TF) denom. The canonical representation is @@ -101,11 +100,11 @@ pub struct ModuleParams { #[derive(Clone, PartialEq, ::prost::Message)] pub struct TfDenom { /// Creator: Bech32 address of the creator of the denom. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub creator: ::prost::alloc::string::String, /// Subdenom: Unique suffix of a token factory denom. A subdenom is specific /// to a given creator. It is the name given during a token factory "Mint". - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub subdenom: ::prost::alloc::string::String, } // ---------------------------------------------- @@ -116,51 +115,52 @@ pub struct TfDenom { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisState { - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, - #[prost(message, repeated, tag = "2")] + #[prost(message, repeated, tag="2")] pub factory_denoms: ::prost::alloc::vec::Vec, } /// GenesisDenom defines a tokenfactory denoms in the genesis state. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisDenom { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub authority_metadata: ::core::option::Option, } /// QueryParamsRequest is the request type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryParamsRequest {} +pub struct QueryParamsRequest { +} /// QueryParamsResponse is the response type for the Query/Params RPC method. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryParamsResponse { /// Module parameters stored in state - #[prost(message, optional, tag = "1")] + #[prost(message, optional, tag="1")] pub params: ::core::option::Option, } /// QueryDenomsRequest: gRPC query for all denoms registered for a creator #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomsRequest { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub creator: ::prost::alloc::string::String, } /// QueryDenomsResponse: All registered denoms for a creator #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomsResponse { - #[prost(string, repeated, tag = "1")] + #[prost(string, repeated, tag="1")] pub denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// QueryDenomInfoRequest: gRPC query for the denom admin and x/bank metadata #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomInfoRequest { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub denom: ::prost::alloc::string::String, } /// QueryDenomInfoResponse: All registered denoms for a creator @@ -168,13 +168,12 @@ pub struct QueryDenomInfoRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryDenomInfoResponse { /// Admin of the token factory denom - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub admin: ::prost::alloc::string::String, /// Metadata: Official x/bank metadata for the denom. All token factory denoms /// are standard, native assets. - #[prost(message, optional, tag = "2")] - pub metadata: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub metadata: ::core::option::Option, } /// MsgCreateDenom: sdk.Msg that registers an a token factory denom. /// A denom has the form "tf/\[creatorAddr]/[subdenom\]". @@ -185,10 +184,10 @@ pub struct QueryDenomInfoResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgCreateDenom { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, /// subdenom can be up to 44 "alphanumeric" characters long. - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub subdenom: ::prost::alloc::string::String, } /// MsgCreateDenomResponse is the return value of MsgCreateDenom @@ -196,7 +195,7 @@ pub struct MsgCreateDenom { #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgCreateDenomResponse { /// NewTokenDenom: identifier for the newly created token factory denom. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub new_token_denom: ::prost::alloc::string::String, } /// MsgChangeAdmin is the sdk.Msg type for allowing an admin account to change @@ -204,50 +203,52 @@ pub struct MsgCreateDenomResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgChangeAdmin { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, - #[prost(string, tag = "2")] + #[prost(string, tag="2")] pub denom: ::prost::alloc::string::String, - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub new_admin: ::prost::alloc::string::String, } /// MsgChangeAdminResponse is the gRPC response for the MsgChangeAdmin TxMsg. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgChangeAdminResponse {} +pub struct MsgChangeAdminResponse { +} /// MsgUpdateModuleParams: sdk.Msg for updating the x/tokenfactory module params #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgUpdateModuleParams { /// Authority: Address of the governance module account. - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub authority: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub params: ::core::option::Option, } /// MsgUpdateModuleParamsResponse is the gRPC response for the /// MsgUpdateModuleParams TxMsg. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgUpdateModuleParamsResponse {} +pub struct MsgUpdateModuleParamsResponse { +} /// MsgMint: sdk.Msg (TxMsg) where an denom admin mints more of the token. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgMint { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, /// coin: The denom identifier and amount to mint. - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub coin: ::core::option::Option, /// mint_to_addr: An address to which tokens will be minted. If blank, /// tokens are minted to the "sender". - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub mint_to: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgMintResponse { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub mint_to: ::prost::alloc::string::String, } /// MsgBurn: sdk.Msg (TxMsg) where a denom admin burns some of the token. @@ -258,32 +259,33 @@ pub struct MsgMintResponse { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgBurn { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, /// coin: The denom identifier and amount to burn. - #[prost(message, optional, tag = "2")] + #[prost(message, optional, tag="2")] pub coin: ::core::option::Option, /// burn_from: The address from which tokens will be burned. - #[prost(string, tag = "3")] + #[prost(string, tag="3")] pub burn_from: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgBurnResponse {} +pub struct MsgBurnResponse { +} /// MsgSetDenomMetadata: sdk.Msg (TxMsg) enabling the denom admin to change its /// bank metadata. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgSetDenomMetadata { - #[prost(string, tag = "1")] + #[prost(string, tag="1")] pub sender: ::prost::alloc::string::String, /// Metadata: Official x/bank metadata for the denom. All token factory denoms /// are standard, native assets. The "metadata.base" is the denom. - #[prost(message, optional, tag = "2")] - pub metadata: - ::core::option::Option, + #[prost(message, optional, tag="2")] + pub metadata: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgSetDenomMetadataResponse {} -// @@protoc_insertion_point(module) \ No newline at end of file +pub struct MsgSetDenomMetadataResponse { +} +// @@protoc_insertion_point(module) diff --git a/nibiru-std/src/proto/type_url_nibiru.rs b/nibiru-std/src/proto/type_url_nibiru.rs index d8685d9..dee864a 100644 --- a/nibiru-std/src/proto/type_url_nibiru.rs +++ b/nibiru-std/src/proto/type_url_nibiru.rs @@ -52,8 +52,8 @@ impl Name for nibiru::tokenfactory::QueryDenomInfoRequest { const PACKAGE_EPOCHS: &str = "nibiru.epochs.v1"; -impl Name for nibiru::epochs::QueryEpochsInfoRequest { - const NAME: &'static str = "QueryEpochsInfoRequest"; +impl Name for nibiru::epochs::QueryEpochInfosRequest { + const NAME: &'static str = "QueryEpochInfosRequest"; const PACKAGE: &'static str = PACKAGE_EPOCHS; } From 2da837a8117e217524fcdc38fadc5a15b77f5490 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Fri, 24 Nov 2023 15:05:32 -0600 Subject: [PATCH 04/22] chore(deps-nibi-stargate): update deps to workspace --- Cargo.lock | 1058 ++++++++++++++++++++++++++-- Cargo.toml | 4 +- contracts/nibi-stargate/Cargo.toml | 18 +- 3 files changed, 1022 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c94764..76a7e33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli", + "gimli 0.28.0", ] [[package]] @@ -72,7 +72,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -82,7 +82,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -94,6 +94,12 @@ dependencies = [ "backtrace", ] +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "assert_cmd" version = "2.0.12" @@ -218,6 +224,18 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -268,6 +286,28 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +[[package]] +name = "bytecheck" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -335,6 +375,12 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +[[package]] +name = "clru" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" + [[package]] name = "colorchoice" version = "1.0.0" @@ -377,6 +423,19 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "corosensei" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80128832c58ea9cbd041d2a759ec449224487b2c1e400453d99d244eead87a8e" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "scopeguard", + "windows-sys 0.33.0", +] + [[package]] name = "cosmos-sdk-proto" version = "0.14.0" @@ -478,6 +537,31 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cosmwasm-vm" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ce190445de4a64d1b046f453b1f52e1e3df1fb481ad5cb039f82d7d47375cb9" +dependencies = [ + "bitflags 1.3.2", + "bytecheck", + "bytes", + "clru", + "cosmwasm-crypto", + "cosmwasm-std", + "crc32fast", + "derivative", + "enumset", + "hex", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", + "wasmer", + "wasmer-middlewares", +] + [[package]] name = "cpufeatures" version = "0.2.9" @@ -487,6 +571,141 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-bforest" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" +dependencies = [ + "arrayvec", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-egraph", + "cranelift-entity", + "cranelift-isle", + "gimli 0.26.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown 0.12.3", + "indexmap", + "log", + "smallvec", +] + +[[package]] +name = "cranelift-entity" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" + +[[package]] +name = "cranelift-frontend" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-bigint" version = "0.4.9" @@ -579,7 +798,7 @@ dependencies = [ "cw-utils", "derivative", "itertools 0.11.0", - "prost 0.12.1", + "prost 0.12.3", "schemars", "serde", "sha2 0.10.8", @@ -588,17 +807,18 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e2c2f2c0877b839c5cad85e67811074e854a50c1ff3085eb8290b1c27809c" +checksum = "561604d987be2ef3e34db1f01f0c98544106d84d8be2af92c0737bb199af452c" dependencies = [ "anyhow", + "bech32", "cosmwasm-std", "cw-storage-plus", "cw-utils", "derivative", - "itertools 0.11.0", - "prost 0.12.1", + "itertools 0.12.0", + "prost 0.12.3", "schemars", "serde", "sha2 0.10.8", @@ -633,9 +853,9 @@ dependencies = [ [[package]] name = "cw-storage-plus" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0e92a069d62067f3472c62e30adedb4cab1754725c0f2a682b3128d2bf3c79" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" dependencies = [ "cosmwasm-std", "schemars", @@ -644,9 +864,9 @@ dependencies = [ [[package]] name = "cw-utils" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9f351a4e4d81ef7c890e44d903f8c0bdcdc00f094fd3a181eaf70c0eec7a3a" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -786,6 +1006,53 @@ dependencies = [ "thiserror", ] +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.1" @@ -856,6 +1123,32 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +[[package]] +name = "dynasm" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dynasmrt" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" +dependencies = [ + "byteorder", + "dynasm", + "memmap2 0.5.10", +] + [[package]] name = "ecdsa" version = "0.14.8" @@ -910,7 +1203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek", - "hashbrown", + "hashbrown 0.12.3", "hex", "rand_core 0.6.4", "serde", @@ -972,6 +1265,47 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enum-iterator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumset" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "errno" version = "0.3.4" @@ -980,7 +1314,7 @@ checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" dependencies = [ "errno-dragonfly", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1003,6 +1337,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fastrand" version = "2.0.1" @@ -1075,6 +1415,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.29" @@ -1164,6 +1510,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1188,6 +1543,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + [[package]] name = "gimli" version = "0.28.0" @@ -1244,6 +1610,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "headers" version = "0.3.9" @@ -1301,7 +1673,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1412,6 +1784,12 @@ dependencies = [ "tokio-native-tls", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.4.0" @@ -1428,7 +1806,7 @@ version = "0.2.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-multi-test 0.18.0", + "cw-multi-test 0.19.0", "cw-storage-plus", "cw-utils", "cw2", @@ -1453,7 +1831,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] @@ -1480,6 +1858,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -1537,6 +1924,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "libc" version = "0.2.149" @@ -1549,6 +1942,16 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45786cec4d5e54a224b15cb9f06751883103a27c19c93eda09b0b4f5f08fefac" +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "lockup" version = "0.2.0" @@ -1570,6 +1973,15 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + [[package]] name = "memchr" version = "2.6.4" @@ -1577,7 +1989,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] -name = "mime" +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" @@ -1599,9 +2047,15 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] +[[package]] +name = "more-asserts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" + [[package]] name = "native-tls" version = "0.2.11" @@ -1651,6 +2105,23 @@ dependencies = [ "thiserror", ] +[[package]] +name = "nibi-stargate-perp" +version = "0.2.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-vm", + "cw-storage-plus", + "cw-utils", + "cw2", + "nibiru-std", + "schemars", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "nibiru-macro" version = "0.1.0" @@ -1669,7 +2140,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "nibiru-macro", - "prost 0.12.1", + "prost 0.12.3", "prost-types 0.12.1", "serde", "serde_json", @@ -1798,6 +2269,19 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets", +] + [[package]] name = "paste" version = "1.0.14" @@ -1947,6 +2431,30 @@ dependencies = [ "thiserror", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.68" @@ -1968,12 +2476,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive 0.12.1", + "prost-derive 0.12.3", ] [[package]] @@ -1991,9 +2499,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", @@ -2017,7 +2525,27 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" dependencies = [ - "prost 0.12.1", + "prost 0.12.3", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -2029,6 +2557,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand_core" version = "0.5.1" @@ -2044,6 +2578,26 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -2053,6 +2607,27 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regalloc2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + [[package]] name = "regex" version = "1.9.6" @@ -2082,6 +2657,27 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags 1.3.2", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "rend" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.11.22" @@ -2176,6 +2772,35 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "rkyv" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +dependencies = [ + "bitvec", + "bytecheck", + "hashbrown 0.12.3", + "indexmap", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid 1.6.1", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2192,7 +2817,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2241,14 +2866,14 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "schemars" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "dyn-clone", "schemars_derive", @@ -2258,9 +2883,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", @@ -2268,6 +2893,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "scripts" version = "0.1.0" @@ -2292,6 +2923,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "sec1" version = "0.3.0" @@ -2343,6 +2980,12 @@ dependencies = [ "libc", ] +[[package]] +name = "self_cell" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e388332cd64eb80cd595a00941baf513caffae8dce9cfd0467fc9c66397dade6" + [[package]] name = "semver" version = "1.0.20" @@ -2351,9 +2994,9 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -2376,6 +3019,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_bytes" version = "0.11.12" @@ -2387,9 +3041,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -2486,6 +3140,16 @@ dependencies = [ "keccak", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "shifter" version = "0.2.0" @@ -2520,6 +3184,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "slab" version = "0.4.9" @@ -2529,6 +3199,18 @@ dependencies = [ "autocfg", ] +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + [[package]] name = "socket2" version = "0.4.9" @@ -2546,7 +3228,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2575,6 +3257,12 @@ dependencies = [ "der 0.7.8", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2645,6 +3333,18 @@ dependencies = [ "libc", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" + [[package]] name = "tempfile" version = "3.8.0" @@ -2653,9 +3353,9 @@ checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "redox_syscall 0.3.5", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2750,7 +3450,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", "walkdir", ] @@ -2857,7 +3557,7 @@ dependencies = [ "pin-project-lite", "socket2 0.5.4", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2929,9 +3629,21 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "tracing-core" version = "0.1.31" @@ -3003,6 +3715,12 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" + [[package]] name = "vcpkg" version = "0.2.15" @@ -3074,6 +3792,29 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "wasm-bindgen-futures" version = "0.4.37" @@ -3115,6 +3856,177 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +[[package]] +name = "wasmer" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +dependencies = [ + "bytes", + "cfg-if", + "derivative", + "indexmap", + "js-sys", + "more-asserts", + "rustc-demangle", + "serde", + "serde-wasm-bindgen", + "shared-buffer", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-downcast", + "wasmer-compiler", + "wasmer-compiler-cranelift", + "wasmer-compiler-singlepass", + "wasmer-derive", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-compiler" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +dependencies = [ + "backtrace", + "bytes", + "cfg-if", + "enum-iterator", + "enumset", + "lazy_static", + "leb128", + "memmap2 0.5.10", + "more-asserts", + "region", + "rkyv", + "self_cell", + "shared-buffer", + "smallvec", + "thiserror", + "wasmer-types", + "wasmer-vm", + "wasmparser", + "winapi", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.26.2", + "more-asserts", + "rayon", + "smallvec", + "target-lexicon", + "tracing", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler-singlepass" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +dependencies = [ + "byteorder", + "dynasm", + "dynasmrt", + "enumset", + "gimli 0.26.2", + "lazy_static", + "more-asserts", + "rayon", + "smallvec", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-derive" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wasmer-middlewares" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +dependencies = [ + "wasmer", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-types" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +dependencies = [ + "bytecheck", + "enum-iterator", + "enumset", + "indexmap", + "more-asserts", + "rkyv", + "target-lexicon", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "corosensei", + "crossbeam-queue", + "dashmap", + "derivative", + "enum-iterator", + "fnv", + "indexmap", + "lazy_static", + "libc", + "mach", + "memoffset 0.8.0", + "more-asserts", + "region", + "scopeguard", + "thiserror", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.95.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" +dependencies = [ + "indexmap", + "url", +] + [[package]] name = "web-sys" version = "0.3.64" @@ -3175,6 +4087,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" +dependencies = [ + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -3191,12 +4116,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -3205,24 +4130,48 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_i686_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_x86_64_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3235,6 +4184,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3248,7 +4203,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 32e841a..85c0b0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,8 +27,8 @@ bash-rs = { path = "packages/bash-rs" } # deps: CosmWasm cosmwasm-std = { version = "1.5.0", features = ["stargate"] } cosmwasm-schema = "1.5.0" -cw-storage-plus = { version = "1.1.0" } -cw-multi-test = { version = "0.18.0" } +cw-storage-plus = { version = "1.2.0" } +cw-multi-test = { version = "0.19.0" } cw-utils = { version = "1.0.2" } # Macros for controlling ownership of CosmWasm smart contracts cw-ownable = { version = "0.5.1"} diff --git a/contracts/nibi-stargate/Cargo.toml b/contracts/nibi-stargate/Cargo.toml index 8481326..f6c689d 100644 --- a/contracts/nibi-stargate/Cargo.toml +++ b/contracts/nibi-stargate/Cargo.toml @@ -13,15 +13,15 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cw-utils = { version = "1.0.2" } -cw2 = { version = "1.1.1" } -cw20 = { version = "1.1.1" } -cosmwasm-schema = { version = "1.4.0" } -cosmwasm-std = { version = "1.4.0" } -cw-storage-plus = { version = "1.1.0" } -schemars = "0.8.15" -serde = { version = "1.0.188", default-features = false, features = ["derive"] } -thiserror = { version = "1.0.49" } +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } +cw-utils = { workspace = true } +schemars = { workspace = true } +cw2 = { workspace = true } +cw20 = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } anyhow = { workspace = true } nibiru-std = { workspace = true } From f8877c77624010f3792c6f911e6b33191f5141b2 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sat, 25 Nov 2023 01:16:04 -0600 Subject: [PATCH 05/22] chore(nibiru-std): rm bindings --- nibiru-std/src/bindings/mod.rs | 3 - nibiru-std/src/bindings/msg.rs | 86 +-------------------- nibiru-std/src/bindings/querier.rs | 104 ------------------------- nibiru-std/src/bindings/query.rs | 117 ----------------------------- nibiru-std/src/bindings/route.rs | 16 ---- nibiru-std/src/bindings/state.rs | 68 ----------------- nibiru-std/src/proto/mod.rs | 2 +- 7 files changed, 3 insertions(+), 393 deletions(-) delete mode 100644 nibiru-std/src/bindings/querier.rs delete mode 100644 nibiru-std/src/bindings/query.rs delete mode 100644 nibiru-std/src/bindings/route.rs delete mode 100644 nibiru-std/src/bindings/state.rs diff --git a/nibiru-std/src/bindings/mod.rs b/nibiru-std/src/bindings/mod.rs index d0c2522..e623240 100644 --- a/nibiru-std/src/bindings/mod.rs +++ b/nibiru-std/src/bindings/mod.rs @@ -7,6 +7,3 @@ //! which are written in Rust and compiled to WebAssembly (Wasm). pub mod msg; -pub mod querier; -pub mod query; -pub mod state; \ No newline at end of file diff --git a/nibiru-std/src/bindings/msg.rs b/nibiru-std/src/bindings/msg.rs index bcaccfe..49c9b19 100644 --- a/nibiru-std/src/bindings/msg.rs +++ b/nibiru-std/src/bindings/msg.rs @@ -15,12 +15,11 @@ pub struct NibiruMsgWrapper { /// Routes here refer to groups of operations that will be interpreted in /// the x/wasmbinding package. The idea here is to add -/// information on which module or group of modules a particular execute message +/// information on which module or group of modules a particular execute message /// belongs to. #[cw_serde] pub enum NibiruRoute { - /// "perp" is the route corresponding to bindings for the x/perp module. - Perp, + /// "oracle" is the route corresponding to custom bindings for the x/oracle module. Oracle, /// "no_op" is a valid route that doesn't do anything. It's necessary for @@ -69,84 +68,3 @@ pub struct LiquidationArgs { pub pair: String, pub trader: String, } - -impl NibiruMsgWrapper { - pub fn market_order( - pair: String, - is_long: bool, - quote_amount: Uint128, - leverage: Decimal, - base_amount_limit: Uint128, - ) -> CosmosMsg { - NibiruMsgWrapper { - route: NibiruRoute::Perp, - msg: NibiruMsg::MarketOrder { - pair, - is_long, - quote_amount, - leverage, - base_amount_limit, - }, - } - .into() - } - - pub fn close_position(pair: String) -> CosmosMsg { - NibiruMsgWrapper { - route: NibiruRoute::Perp, - msg: NibiruMsg::ClosePosition { pair }, - } - .into() - } - - pub fn add_margin( - pair: String, - margin: Coin, - ) -> CosmosMsg { - NibiruMsgWrapper { - route: NibiruRoute::Perp, - msg: NibiruMsg::AddMargin { pair, margin }, - } - .into() - } - - pub fn remove_margin( - pair: String, - margin: Coin, - ) -> CosmosMsg { - NibiruMsgWrapper { - route: NibiruRoute::Perp, - msg: NibiruMsg::RemoveMargin { pair, margin }, - } - .into() - } - - pub fn multi_liquidate( - pair: String, - liquidations: Vec, - ) -> CosmosMsg { - NibiruMsgWrapper { - route: NibiruRoute::Perp, - msg: NibiruMsg::MultiLiquidate { pair, liquidations }, - } - .into() - } - - pub fn donate_to_insurance_fund( - donation: Coin, - ) -> CosmosMsg { - NibiruMsgWrapper { - route: NibiruRoute::Perp, - msg: NibiruMsg::DonateToInsuranceFund { donation }, - } - .into() - } - - pub fn no_op() -> CosmosMsg { - NibiruMsgWrapper { - route: NibiruRoute::NoOp, - msg: NibiruMsg::NoOp {}, - } - .into() - } -} diff --git a/nibiru-std/src/bindings/querier.rs b/nibiru-std/src/bindings/querier.rs deleted file mode 100644 index f34bafe..0000000 --- a/nibiru-std/src/bindings/querier.rs +++ /dev/null @@ -1,104 +0,0 @@ -use cosmwasm_std::{QuerierWrapper, StdResult, Uint256}; - -use crate::bindings::query::{ - AllMarketsResponse, BasePriceResponse, MetricsResponse, - ModuleAccountsResponse, ModuleParamsResponse, OraclePricesResponse, - PositionResponse, PositionsResponse, PremiumFractionResponse, QueryPerpMsg, - ReservesResponse, -}; -use std::collections::HashMap; - -/// NibiruQuerier makes it easy to export the functions that correspond to each -/// request without needing to know as much about the underlying types. -pub struct NibiruQuerier<'a> { - querier: &'a QuerierWrapper<'a, QueryPerpMsg>, -} - -impl<'a> NibiruQuerier<'a> { - pub fn new(querier: &'a QuerierWrapper) -> Self { - NibiruQuerier { querier } - } - - pub fn all_markets(&self) -> StdResult { - let request = QueryPerpMsg::AllMarkets {}; - self.querier.query(&request.into()) - } - - pub fn base_price( - &self, - pair: String, - is_long: bool, - base_amount: Uint256, - ) -> StdResult { - let request = QueryPerpMsg::BasePrice { - pair, - is_long, - base_amount, - }; - self.querier.query(&request.into()) - } - - pub fn position( - &self, - trader: String, - pair: String, - ) -> StdResult { - let request = QueryPerpMsg::Position { trader, pair }; - self.querier.query(&request.into()) - } - - pub fn positions(&self, trader: String) -> StdResult { - let request = QueryPerpMsg::Positions { trader }; - self.querier.query(&request.into()) - } - - pub fn reserves(&self, pair: String) -> StdResult { - let request = QueryPerpMsg::Reserves { pair }; - self.querier.query(&request.into()) - } - - pub fn oracle_prices( - &self, - pairs: Option>, - ) -> StdResult { - let request = QueryPerpMsg::OraclePrices {}; - let price_map: OraclePricesResponse = - self.querier.query(&request.into())?; - - match pairs { - Some(pair_vec) if !pair_vec.is_empty() => { - let mut out_price_map: OraclePricesResponse = HashMap::new(); - for p in pair_vec.iter() { - if let Some(rate) = price_map.get(p) { - out_price_map.insert(p.clone(), *rate); - } - } - Ok(out_price_map) - } - _ => Ok(price_map), - } - } - - pub fn premium_fraction( - &self, - pair: String, - ) -> StdResult { - let request = QueryPerpMsg::PremiumFraction { pair }; - self.querier.query(&request.into()) - } - - pub fn metrics(&self, pair: String) -> StdResult { - let request = QueryPerpMsg::Metrics { pair }; - self.querier.query(&request.into()) - } - - pub fn module_params(&self) -> StdResult { - let request = QueryPerpMsg::ModuleParams {}; - self.querier.query(&request.into()) - } - - pub fn module_accounts(&self) -> StdResult { - let request = QueryPerpMsg::ModuleAccounts {}; - self.querier.query(&request.into()) - } -} diff --git a/nibiru-std/src/bindings/query.rs b/nibiru-std/src/bindings/query.rs deleted file mode 100644 index f74cef9..0000000 --- a/nibiru-std/src/bindings/query.rs +++ /dev/null @@ -1,117 +0,0 @@ -use std::collections::HashMap; - -use cosmwasm_schema::cw_serde; -use cosmwasm_std::{CustomQuery, Decimal, Uint256, Uint64}; - -use crate::bindings::state::{ - Market, Metrics, ModuleAccountWithBalance, ModuleParams, Position, -}; - -#[cw_serde] -pub enum QueryPerpMsg { - // ----------------------------------------------------------------- - // From x/perp/amm - // ----------------------------------------------------------------- - AllMarkets {}, - - Reserves { - pair: String, - }, - - BasePrice { - pair: String, - is_long: bool, - base_amount: Uint256, - }, - - // ----------------------------------------------------------------- - // From x/perp - // ----------------------------------------------------------------- - Position { - trader: String, - pair: String, - }, - - Positions { - trader: String, - }, - - ModuleParams {}, - - PremiumFraction { - pair: String, - }, - - Metrics { - pair: String, - }, - - ModuleAccounts {}, - - // ----------------------------------------------------------------- - // From x/oracle - // ----------------------------------------------------------------- - OraclePrices {}, -} - -impl CustomQuery for QueryPerpMsg {} - -#[cw_serde] -pub struct AllMarketsResponse { - pub market_map: HashMap, -} - -#[cw_serde] -pub struct ReservesResponse { - pub pair: String, - pub base_reserve: Decimal, - pub quote_reserve: Decimal, -} - -// #[cw_serde] -pub type OraclePricesResponse = HashMap; - -#[cw_serde] -pub struct BasePriceResponse { - pub pair: String, - pub base_amount: Decimal, - pub quote_amount: Decimal, - pub is_long: bool, -} - -#[cw_serde] -pub struct PositionResponse { - pub position: Position, - pub notional: String, // signed dec - pub upnl: String, // signed dec - pub margin_ratio_mark: Decimal, - pub margin_ratio_index: Decimal, - pub block_number: Uint64, -} - -#[cw_serde] -pub struct PositionsResponse { - pub positions: HashMap, -} - -#[cw_serde] -pub struct ModuleParamsResponse { - pub module_params: ModuleParams, -} - -#[cw_serde] -pub struct PremiumFractionResponse { - pub pair: String, - pub cpf: Decimal, - pub estimated_next_cpf: Decimal, -} - -#[cw_serde] -pub struct MetricsResponse { - pub metrics: Metrics, -} - -#[cw_serde] -pub struct ModuleAccountsResponse { - pub module_accounts: HashMap, -} diff --git a/nibiru-std/src/bindings/route.rs b/nibiru-std/src/bindings/route.rs deleted file mode 100644 index c6735b8..0000000 --- a/nibiru-std/src/bindings/route.rs +++ /dev/null @@ -1,16 +0,0 @@ -use cosmwasm_schema::cw_serde; - -/// Routes here refer to groups of operations that will be interpreted in -/// the x/wasm/binding packa . The idea here is to add -/// information on which module or group of modules a particular execute message -/// belongs to. -#[cw_serde] -pub enum NibiruRoute { - /// "perp" is the route corresponding to bindings for the x/perp module. - Perp, - Oracle, - - /// "no_op" is a valid route that doesn't do anything. It's necessary for - /// formatting in the custom Wasm execute handler. - NoOp, -} diff --git a/nibiru-std/src/bindings/state.rs b/nibiru-std/src/bindings/state.rs deleted file mode 100644 index 61d1eab..0000000 --- a/nibiru-std/src/bindings/state.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::collections::HashSet; - -use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Addr, Coin, Decimal, Uint256, Uint64}; - -#[cw_serde] -pub struct Position { - pub trader_addr: Addr, - pub pair: String, - pub size: String, // signed dec - pub margin: Decimal, - pub open_notional: Decimal, - pub latest_cpf: Decimal, - pub block_number: Uint64, -} - -#[cw_serde] -pub struct Market { - pub pair: String, - pub version: Uint64, - pub base_reserve: Decimal, - pub quote_reserve: Decimal, - pub sqrt_depth: Decimal, - pub depth: Uint256, - pub total_long: Decimal, - pub total_short: Decimal, - pub peg_mult: Decimal, - pub config: MarketConfig, - pub mark_price: Decimal, - pub index_price: String, - pub twap_mark: String, - pub block_number: Uint64, -} - -#[cw_serde] -pub struct MarketConfig { - pub maintenance_margin_ratio: Decimal, - pub max_leverage: Decimal, -} - -#[cw_serde] -pub struct ModuleParams { - pub stopped: bool, - pub fee_pool_fee_ratio: Decimal, - pub ecosystem_fund_fee_ratio: Decimal, - pub liquidation_fee_ratio: Decimal, - pub partial_liquidation_ratio: Decimal, - pub funding_rate_interval: String, - pub twap_lookback_window: Uint64, - pub whitelisted_liquidators: HashSet, -} - -#[cw_serde] -pub struct Metrics { - pub pair: String, - pub net_size: Decimal, - pub volume_quote: Decimal, - pub volume_base: Decimal, - pub block_number: Uint64, -} - -#[cw_serde] -#[derive(Eq)] -pub struct ModuleAccountWithBalance { - pub name: String, - pub addr: Addr, - pub balance: Vec, -} diff --git a/nibiru-std/src/proto/mod.rs b/nibiru-std/src/proto/mod.rs index 214e81a..584fe16 100644 --- a/nibiru-std/src/proto/mod.rs +++ b/nibiru-std/src/proto/mod.rs @@ -192,4 +192,4 @@ mod tests { }], }; } -} \ No newline at end of file +} From 2e7da9ef98ec5a6e1c3edaa6a6bef65be9a08173 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sat, 25 Nov 2023 01:16:38 -0600 Subject: [PATCH 06/22] feat(nibiru-std): add prost::Name impls for new protobuf types --- nibiru-std/src/proto/type_url_nibiru.rs | 61 +++++++++++++++---------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/nibiru-std/src/proto/type_url_nibiru.rs b/nibiru-std/src/proto/type_url_nibiru.rs index dee864a..6ada9ed 100644 --- a/nibiru-std/src/proto/type_url_nibiru.rs +++ b/nibiru-std/src/proto/type_url_nibiru.rs @@ -239,55 +239,66 @@ impl Name for nibiru::perp::MsgDonateToEcosystemFund { const NAME: &'static str = "MsgDonateToEcosystemFund"; const PACKAGE: &'static str = PACKAGE_PERP; } -// TODO: Msg not included yet in protobuf types: MsgSettlePosition -// impl Name for nibiru::perp::MsgSettlePosition { -// const NAME: &'static str = "MsgSettlePosition"; -// const PACKAGE: &'static str = PACKAGE_PERP; -// } -// TODO: Msg not included yet in protobuf types: MsgChangeCollateralDenom -// impl Name for nibiru::perp::MsgChangeCollateralDenom { -// const NAME: &'static str = "MsgChangeCollateralDenom"; -// const PACKAGE: &'static str = PACKAGE_PERP; -// } +impl Name for nibiru::perp::MsgSettlePosition { + const NAME: &'static str = "MsgSettlePosition"; + const PACKAGE: &'static str = PACKAGE_PERP; +} -// TODO: Msg not included yet in protobuf types: MsgAllocateEpochRebates -// impl Name for nibiru::perp::MsgAllocateEpochRebates { -// const NAME: &'static str = "MsgAllocateEpochRebates"; -// const PACKAGE: &'static str = PACKAGE_PERP; -// } +impl Name for nibiru::perp::MsgChangeCollateralDenom { + const NAME: &'static str = "MsgChangeCollateralDenom"; + const PACKAGE: &'static str = PACKAGE_PERP; +} -// TODO: Msg not included yet in protobuf types: MsgWithdrawEpochRebates -// impl Name for nibiru::perp::MsgWithdrawEpochRebates { -// const NAME: &'static str = "MsgWithdrawEpochRebates"; -// const PACKAGE: &'static str = PACKAGE_PERP; -// } +impl Name for nibiru::perp::MsgAllocateEpochRebates { + const NAME: &'static str = "MsgAllocateEpochRebates"; + const PACKAGE: &'static str = PACKAGE_PERP; +} + +impl Name for nibiru::perp::MsgWithdrawEpochRebates { + const NAME: &'static str = "MsgWithdrawEpochRebates"; + const PACKAGE: &'static str = PACKAGE_PERP; +} + +impl Name for nibiru::perp::MsgShiftPegMultiplier { + const NAME: &'static str = "MsgShiftPegMultiplier"; + const PACKAGE: &'static str = PACKAGE_PERP; +} + +impl Name for nibiru::perp::MsgShiftSwapInvariant { + const NAME: &'static str = "MsgShiftSwapInvariant"; + const PACKAGE: &'static str = PACKAGE_PERP; +} impl Name for nibiru::perp::QueryPositionRequest { const NAME: &'static str = "QueryPositionRequest"; const PACKAGE: &'static str = PACKAGE_PERP; } + impl Name for nibiru::perp::QueryPositionsRequest { const NAME: &'static str = "QueryPositionsRequest"; const PACKAGE: &'static str = PACKAGE_PERP; } + impl Name for nibiru::perp::QueryPositionStoreRequest { const NAME: &'static str = "QueryPositionStoreRequest"; const PACKAGE: &'static str = PACKAGE_PERP; } + impl Name for nibiru::perp::QueryModuleAccountsRequest { const NAME: &'static str = "QueryModuleAccountsRequest"; const PACKAGE: &'static str = PACKAGE_PERP; } + impl Name for nibiru::perp::QueryMarketsRequest { const NAME: &'static str = "QueryMarketsRequest"; const PACKAGE: &'static str = PACKAGE_PERP; } -// TODO: included in v1 but not v0.21 -// impl Name for nibiru::perp::QueryCollateralRequest { -// const NAME: &'static str = "QueryCollateralRequest"; -// const PACKAGE: &'static str = PACKAGE_PERP; -// } + +impl Name for nibiru::perp::QueryCollateralRequest { + const NAME: &'static str = "QueryCollateralRequest"; + const PACKAGE: &'static str = PACKAGE_PERP; +} #[cfg(test)] pub mod tests { From 8eaab351717448d666d8243a63725eff502fbe3d Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sat, 25 Nov 2023 01:19:13 -0600 Subject: [PATCH 07/22] feat(nibi-stargate-perp): revive perp bindings contract using CosmosMsg::Stargate --- Cargo.lock | 1 + contracts/nibi-stargate-perp/.cargo/config | 4 + contracts/nibi-stargate-perp/Cargo.lock | 2081 +++++++++++++++++ contracts/nibi-stargate-perp/Cargo.toml | 31 + contracts/nibi-stargate-perp/src/contract.rs | 565 +++++ .../src/integration_test.rs | 53 + contracts/nibi-stargate-perp/src/lib.rs | 3 + contracts/nibi-stargate-perp/src/msg.rs | 96 + contracts/nibi-stargate-perp/src/state.rs | 94 + 9 files changed, 2928 insertions(+) create mode 100644 contracts/nibi-stargate-perp/.cargo/config create mode 100644 contracts/nibi-stargate-perp/Cargo.lock create mode 100644 contracts/nibi-stargate-perp/Cargo.toml create mode 100644 contracts/nibi-stargate-perp/src/contract.rs create mode 100644 contracts/nibi-stargate-perp/src/integration_test.rs create mode 100644 contracts/nibi-stargate-perp/src/lib.rs create mode 100644 contracts/nibi-stargate-perp/src/msg.rs create mode 100644 contracts/nibi-stargate-perp/src/state.rs diff --git a/Cargo.lock b/Cargo.lock index 76a7e33..0276c00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2109,6 +2109,7 @@ dependencies = [ name = "nibi-stargate-perp" version = "0.2.0" dependencies = [ + "anyhow", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", diff --git a/contracts/nibi-stargate-perp/.cargo/config b/contracts/nibi-stargate-perp/.cargo/config new file mode 100644 index 0000000..b613a59 --- /dev/null +++ b/contracts/nibi-stargate-perp/.cargo/config @@ -0,0 +1,4 @@ +[alias] +wasm = "build --release --target wasm32-unknown-unknown" +wasm-debug = "build --target wasm32-unknown-unknown" +schema = "run --example schema" diff --git a/contracts/nibi-stargate-perp/Cargo.lock b/contracts/nibi-stargate-perp/Cargo.lock new file mode 100644 index 0000000..c4f0af6 --- /dev/null +++ b/contracts/nibi-stargate-perp/Cargo.lock @@ -0,0 +1,2081 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli 0.27.2", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bindings-perp" +version = "0.2.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-vm", + "cw-storage-plus", + "cw-utils", + "cw2", + "cw20", + "dummy", + "nibiru-macro", + "nibiru-std", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[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 = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" + +[[package]] +name = "bumpalo" +version = "3.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" + +[[package]] +name = "bytecheck" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clru" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" + +[[package]] +name = "const-oid" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" + +[[package]] +name = "controller" +version = "0.2.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "nibiru-macro", + "nibiru-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "corosensei" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "scopeguard", + "windows-sys", +] + +[[package]] +name = "cosmwasm-crypto" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6fb22494cf7d23d0c348740e06e5c742070b2991fd41db77bba0bcfbae1a723" +dependencies = [ + "digest 0.10.6", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e199424486ea97d6b211db6387fd72e26b4a439d40cc23140b2d8305728055b" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef683a9c1c4eabd6d31515719d0d2cc66952c4c87f7eb192bfc90384517dc34" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9567025acbb4c0c008178393eb53b3ac3c2e492c25949d3bf415b9cbe80772d8" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d89d680fb60439b7c5947b15f9c84b961b88d1f8a3b20c4bd178a3f87db8bae" +dependencies = [ + "base64", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.6", + "thiserror", +] + +[[package]] +name = "cosmwasm-vm" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e8faf91cc62b0657a8a6bdaa47b66e3f655082ee3b3ea8dd9708ef9016739e" +dependencies = [ + "bitflags", + "bytecheck", + "bytes", + "clru", + "cosmwasm-crypto", + "cosmwasm-std", + "crc32fast", + "derivative", + "enumset", + "hex", + "schemars", + "serde", + "serde_json", + "sha2 0.10.6", + "thiserror", + "wasmer", + "wasmer-middlewares", +] + +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" +dependencies = [ + "arrayvec", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-egraph", + "cranelift-entity", + "cranelift-isle", + "gimli 0.26.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] + +[[package]] +name = "cranelift-entity" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" + +[[package]] +name = "cranelift-frontend" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "cw-storage-plus" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f0e92a069d62067f3472c62e30adedb4cab1754725c0f2a682b3128d2bf3c79" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-utils" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9f351a4e4d81ef7c890e44d903f8c0bdcdc00f094fd3a181eaf70c0eec7a3a" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9431d14f64f49e41c6ef5561ed11a5391c417d0cb16455dea8cdcb9037a8d197" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw20" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786e9da5e937f473cecd2463e81384c1af65d0f6398bbd851be7655487c55492" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils", + "schemars", + "serde", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dummy" +version = "0.1.0" +dependencies = [ + "bindings-perp", + "controller", + "cosmwasm-schema", + "cosmwasm-std", + "nibiru-std", + "shifter", +] + +[[package]] +name = "dyn-clone" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" + +[[package]] +name = "dynasm" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dynasmrt" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" +dependencies = [ + "byteorder", + "dynasm", + "memmap2", +] + +[[package]] +name = "ecdsa" +version = "0.16.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +dependencies = [ + "der", + "digest 0.10.6", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "elliptic-curve" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.6", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-iterator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumset" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19be8061a06ab6f3a6cf21106c873578bf01bd42ad15e0311a9c76161cb1c753" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e7b551eba279bf0fa88b83a46330168c1560a52a94f5126f892f0b364ab3e0" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.6", + "signature", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "libc" +version = "0.2.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "more-asserts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" + +[[package]] +name = "nibiru-macro" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "nibiru-std" +version = "0.0.2" +dependencies = [ + "anyhow", + "cosmwasm-schema", + "cosmwasm-std", + "nibiru-macro", + "prost", + "prost-types", + "serde", + "thiserror", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "prost-types" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +dependencies = [ + "prost", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regalloc2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "rend" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rkyv" +version = "0.7.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" +dependencies = [ + "bytecheck", + "hashbrown", + "indexmap", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "schemars" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + +[[package]] +name = "serde" +version = "1.0.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "shifter" +version = "0.2.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "nibiru-macro", + "nibiru-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest 0.10.6", + "rand_core 0.6.4", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" + +[[package]] +name = "thiserror" +version = "1.0.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tracing" +version = "0.1.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "wasmer" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +dependencies = [ + "bytes", + "cfg-if", + "derivative", + "indexmap", + "js-sys", + "more-asserts", + "rustc-demangle", + "serde", + "serde-wasm-bindgen", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-downcast", + "wasmer-compiler", + "wasmer-compiler-cranelift", + "wasmer-compiler-singlepass", + "wasmer-derive", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-compiler" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", + "enumset", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "smallvec", + "thiserror", + "wasmer-types", + "wasmer-vm", + "wasmparser", + "winapi", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.26.2", + "more-asserts", + "rayon", + "smallvec", + "target-lexicon", + "tracing", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler-singlepass" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +dependencies = [ + "byteorder", + "dynasm", + "dynasmrt", + "enumset", + "gimli 0.26.2", + "lazy_static", + "more-asserts", + "rayon", + "smallvec", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-derive" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wasmer-middlewares" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +dependencies = [ + "wasmer", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-types" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +dependencies = [ + "bytecheck", + "enum-iterator", + "enumset", + "indexmap", + "more-asserts", + "rkyv", + "target-lexicon", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "corosensei", + "dashmap", + "derivative", + "enum-iterator", + "fnv", + "indexmap", + "lazy_static", + "libc", + "mach", + "memoffset", + "more-asserts", + "region", + "scopeguard", + "thiserror", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.95.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" +dependencies = [ + "indexmap", + "url", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" +dependencies = [ + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/contracts/nibi-stargate-perp/Cargo.toml b/contracts/nibi-stargate-perp/Cargo.toml new file mode 100644 index 0000000..2a3941c --- /dev/null +++ b/contracts/nibi-stargate-perp/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "nibi-stargate-perp" +version = "0.2.0" +edition = "2021" +homepage = "https://nibiru.fi" +repository = "https://github.com/NibiruChain/cw-nibiru" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +backtraces = ["cosmwasm-std/backtraces"] +# use library feature to disable all instantiate/execute/query exports +library = [] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } +cw-utils = { workspace = true } +schemars = { workspace = true } +cw2 = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } +nibiru-std = { workspace = true } + +[dev-dependencies] +cosmwasm-vm = "1.5.0" +serde_json = "1.0.108" +anyhow = { workspace = true } \ No newline at end of file diff --git a/contracts/nibi-stargate-perp/src/contract.rs b/contracts/nibi-stargate-perp/src/contract.rs new file mode 100644 index 0000000..acf469a --- /dev/null +++ b/contracts/nibi-stargate-perp/src/contract.rs @@ -0,0 +1,565 @@ +use cosmwasm_std::{ + entry_point, AllBalanceResponse, BankMsg, BankQuery, Binary, CosmosMsg, + Deps, DepsMut, Env, MessageInfo, QueryRequest, Response, StdError, + StdResult, +}; + +use cw2::set_contract_version; + +use nibiru_std::proto::nibiru::perp::Direction; +use nibiru_std::proto::{nibiru, NibiruStargateMsg}; + +use crate::{ + msg::{ExecuteMsg, InitMsg, QueryMsg}, + state::{Sudoers, SUDOERS}, +}; + +const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +#[entry_point] +pub fn instantiate( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: InitMsg, +) -> StdResult { + set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + let admin: String = match msg.admin { + Some(msg_admin) => msg_admin, + None => info.sender.to_string(), + }; + let sudoers = Sudoers { + members: vec![admin.clone()].into_iter().collect(), + admin, + }; + SUDOERS.save(deps.storage, &sudoers)?; + Ok(Response::new() + .add_attribute("action", "instantiate") + .add_attribute("owner", info.sender)) +} + +// TODO: impl query entry point +#[entry_point] +pub fn query(_deps: Deps, _env: Env, _msg: QueryMsg) -> StdResult { + todo!(); + // let querier = NibiruQuerier::new(&deps.querier); + // match msg { + // QueryMsg::AllMarkets {} => { + // to_json_binary(&querier.all_markets().unwrap()) + // } + // QueryMsg::BasePrice { + // pair, + // is_long, + // base_amount, + // } => to_json_binary( + // &querier.base_price(pair, is_long, base_amount).unwrap(), + // ), + // QueryMsg::Position { trader, pair } => { + // to_json_binary(&querier.position(trader, pair).unwrap()) + // } + // QueryMsg::Positions { trader } => { + // to_json_binary(&querier.positions(trader).unwrap()) + // } + // QueryMsg::Metrics { pair } => { + // to_json_binary(&querier.metrics(pair).unwrap()) + // } + // QueryMsg::ModuleAccounts {} => { + // to_json_binary(&querier.module_accounts()?) + // } + // QueryMsg::ModuleParams {} => to_json_binary(&querier.module_params()?), + // QueryMsg::PremiumFraction { pair } => { + // to_json_binary(&querier.premium_fraction(pair)?) + // } + // QueryMsg::Reserves { pair } => to_json_binary(&querier.reserves(pair)?), + // QueryMsg::OraclePrices { pairs } => { + // to_json_binary(&querier.oracle_prices(pairs)?) + // } + + // // TODO test + // QueryMsg::Sudoers {} => { + // let sudoers = SUDOERS.load(deps.storage)?; + // let res = SudoersQueryResponse { sudoers }; + // cosmwasm_std::to_json_binary(&res) + // } + // } +} + +#[entry_point] +pub fn execute( + deps: DepsMut, + env_ctx: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> StdResult { + let deps_for_check = &deps; + let can_execute: CanExecute = + check_can_execute(deps_for_check.as_ref(), info.sender.as_ref())?; + let contract_addr = env_ctx.contract.address.to_string(); + match msg { + ExecuteMsg::MarketOrder { + pair, + is_long, + quote_amount, + leverage, + base_amount_limit, + } => { + can_execute.check_member()?; + let side: Direction = if is_long { + Direction::Long + } else { + Direction::Short + }; + + // TODO: feat(nibiru-std): Fn to convert cosmwasm_std::Decimal to + // protobuf strings for sdk.Dec [with tests] | https://github.com/NibiruChain/cw-nibiru/issues/99 + let cosmos_msg: CosmosMsg = nibiru::perp::MsgMarketOrder { + sender: contract_addr, + pair, + side: side.into(), + // TODO: sdk.Dec https://github.com/NibiruChain/cw-nibiru/issues/99 + quote_asset_amount: quote_amount.to_string(), + // TODO: sdk.Dec https://github.com/NibiruChain/cw-nibiru/issues/99 + leverage: leverage.to_string(), + // TODO: sdk.Dec https://github.com/NibiruChain/cw-nibiru/issues/99 + base_asset_amount_limit: base_amount_limit.to_string(), + } + .into_stargate_msg(); + Ok(Response::new().add_message(cosmos_msg)) + } + + ExecuteMsg::ClosePosition { pair } => { + can_execute.check_member()?; + let cosmos_msg: CosmosMsg = nibiru::perp::MsgClosePosition { + sender: contract_addr, + pair, + } + .into_stargate_msg(); + Ok(Response::new().add_message(cosmos_msg)) + } + + ExecuteMsg::AddMargin { pair, margin } => { + can_execute.check_member()?; + let cosmos_msg: CosmosMsg = nibiru::perp::MsgAddMargin { + sender: contract_addr, + pair, + margin: Some(margin.into()), + } + .into_stargate_msg(); + Ok(Response::new().add_message(cosmos_msg)) + } + + ExecuteMsg::RemoveMargin { pair, margin } => { + can_execute.check_member()?; + let cosmos_msg: CosmosMsg = nibiru::perp::MsgRemoveMargin { + sender: contract_addr, + pair, + margin: Some(margin.into()), + } + .into_stargate_msg(); + Ok(Response::new().add_message(cosmos_msg)) + } + + // TODO:test ExecuteMsg::MultiLiquidate + ExecuteMsg::MultiLiquidate { liquidations } => { + can_execute.check_member()?; + let cosmos_msg: CosmosMsg = nibiru::perp::MsgMultiLiquidate { + sender: contract_addr, + liquidations: liquidations + .iter() + .map(|la| nibiru::perp::msg_multi_liquidate::Liquidation { + pair: la.pair.clone(), + trader: la.trader.clone(), + }) + .collect(), + } + .into_stargate_msg(); + Ok(Response::new().add_message(cosmos_msg)) + } + + // TODO:test ExecuteMsg::DonateToInsuranceFund + ExecuteMsg::DonateToInsuranceFund { donation } => { + can_execute.check_member()?; + let cosmos_msg: CosmosMsg = nibiru::perp::MsgDonateToEcosystemFund { + sender: contract_addr, + donation: Some(donation.into()), + } + .into_stargate_msg(); + Ok(Response::new().add_message(cosmos_msg)) + } + + ExecuteMsg::Claim { + funds, + claim_all, + to, + } => { + can_execute.check_admin()?; + let event_key = "execute_claim"; + if let Some(claim_all_value) = claim_all { + if !claim_all_value { + return Err(StdError::generic_err( + "setting 'claim_all' to false causes an error: " + .to_string() + + "try removing claim_all as an argument entirely.", + )); + } + let contract_address = env_ctx.contract.address; + let balances = query_contract_balance( + contract_address.to_string(), + deps.as_ref(), + )?; + + // Send all funds to the specified recipient. + let transfer_msg = BankMsg::Send { + to_address: to.clone(), + amount: balances.amount, + }; + Ok(Response::new().add_message(transfer_msg).add_attribute( + event_key, + format!("successfully claimed to {}", to), + )) + } else if let Some(funds_value) = funds { + // Send all funds to the specified recipient. + let transfer_msg = BankMsg::Send { + to_address: to.clone(), + amount: vec![funds_value], + }; + return Ok(Response::new() + .add_message(transfer_msg) + .add_attribute( + event_key, + format!("successfully claimed to {}", to), + )); + } else { + return Err(StdError::generic_err( + "either the 'funds' or 'claim_all' arguments must be specified")); + } + } // TODO test: add member + // TODO test: remove member + // TODO test: change admin + } +} + +struct CanExecute { + is_admin: bool, + is_member: bool, + sender: String, +} + +impl CanExecute { + pub fn check_admin(&self) -> Result<(), cosmwasm_std::StdError> { + match self.is_admin { + true => Ok(()), + false => Err(cosmwasm_std::StdError::generic_err(format!( + "unauthorized : sender {} is not an admin", + self.sender, + ))), + } + } + + pub fn check_member(&self) -> Result<(), cosmwasm_std::StdError> { + match self.is_member { + true => Ok(()), + false => Err(cosmwasm_std::StdError::generic_err(format!( + "unauthorized : sender {} is not a sudoers member", + self.sender, + ))), + } + } +} + +fn check_can_execute(deps: Deps, sender: &str) -> StdResult { + let sudoers = SUDOERS.load(deps.storage).unwrap(); + Ok(CanExecute { + is_admin: sudoers.is_admin(sender), + is_member: sudoers.is_member(sender), + sender: sender.into(), + }) +} + +/// Query all contract balances or return an empty response +fn query_contract_balance( + contract_address: String, + deps: Deps, +) -> StdResult { + let query_result = + deps.querier + .query(&QueryRequest::Bank(BankQuery::AllBalances { + address: contract_address, + }))?; + let balances: AllBalanceResponse = match query_result { + Some(res) => res, + None => AllBalanceResponse::default(), + }; + Ok(balances) +} + +#[cfg(test)] +pub mod tests { + use std::str::FromStr; + + use crate::state; + use cosmwasm_std::{ + coin, coins, + testing::{self, mock_env, MockApi, MockQuerier}, + Coin, CosmosMsg, Decimal, MemoryStorage, OwnedDeps, SubMsg, Uint128, + }; + + use super::*; + + pub type TestResult = anyhow::Result<()>; + + pub const SENDER_NOT_ADMIN: &str = "not-admin"; + pub const SENDER_ADMIN: &str = "admin"; + + #[test] + fn msg_init() -> TestResult { + let mut deps = testing::mock_dependencies(); + let admin = SENDER_ADMIN; + let msg = InitMsg { + admin: Some(admin.to_string()), + }; + let sender = "sender"; + let info: MessageInfo = testing::mock_info(sender, &coins(2, "token")); + + let result = instantiate(deps.as_mut(), testing::mock_env(), info, msg)?; + assert_eq!(result.messages.len(), 0); + + let sudoers = SUDOERS.load(&deps.storage)?; + assert_eq!(sudoers.admin, admin); + Ok(()) + } + + #[test] + fn msg_init_admin_as_sender() -> TestResult { + let mut deps = testing::mock_dependencies(); + let msg = InitMsg { admin: None }; + let sender = "sender"; + let info: MessageInfo = testing::mock_info(sender, &coins(2, "token")); + + let result = instantiate(deps.as_mut(), testing::mock_env(), info, msg)?; + assert_eq!(result.messages.len(), 0); + + let sudoers = SUDOERS.load(&deps.storage)?; + assert_eq!(sudoers.admin, sender); + Ok(()) + } + + fn do_init( + admin: &str, + sender: &str, + mut deps: OwnedDeps, + ) -> ( + state::Sudoers, + OwnedDeps, + cosmwasm_std::MessageInfo, + ) { + let msg_init = InitMsg { + admin: Some(admin.to_string()), + }; + + // let mut deps = testing::mock_dependencies(); + let info: MessageInfo = testing::mock_info(sender, &coins(2, "token")); + + let result = instantiate( + deps.as_mut(), + testing::mock_env(), + info.clone(), + msg_init, + ) + .expect("failed instantiate in the 'do_init' fn"); + assert_eq!(result.messages.len(), 0); + let sudoers = SUDOERS + .load(&deps.storage) + .expect("state should be loadable after InitMsg"); + assert_eq!(sudoers.admin, admin); + (sudoers, deps, info) + } + + #[test] + fn exec_stargate() -> TestResult { + let deps = testing::mock_dependencies(); + + // Instantiate contract + let admin = SENDER_ADMIN; + let sender = admin; + let (_sudoers, mut deps, info) = do_init(admin, sender, deps); + + let pair = "ETH:USD".to_string(); + let dummy_u128 = Uint128::new(420u128); + let dummy_coin = coin(dummy_u128.clone().u128(), "token"); + let exec_msgs: Vec = vec![ + ExecuteMsg::MarketOrder { + pair: pair.clone(), + is_long: true, + quote_amount: dummy_u128, + leverage: Decimal::from_str("5")?, + base_amount_limit: Uint128::zero(), + }, + ExecuteMsg::ClosePosition { pair: pair.clone() }, + ExecuteMsg::AddMargin { + pair: pair.clone(), + margin: dummy_coin.clone(), + }, + ExecuteMsg::RemoveMargin { + pair, + margin: dummy_coin, + }, + ]; + for exec_msg in &exec_msgs { + exec_stargate_test_happy(exec_msg, deps.as_mut(), info.clone())?; + exec_stargate_test_without_permission(exec_msg, deps.as_mut())?; + } + Ok(()) + } + + /// Verifies that an execute message will fail when sent by a non-admin + pub fn exec_stargate_test_without_permission( + exec_msg: &ExecuteMsg, + deps: DepsMut, + ) -> TestResult { + let sender: &str = "not-admin"; + let info: MessageInfo = testing::mock_info(sender, &coins(2, "token")); + let resp = execute(deps, mock_env(), info, exec_msg.clone()); + assert!(resp.is_err(), "resp.err: {:?}", resp.err()); + Ok(()) + } + + /// Verifies that an execute message will succeed and contain a + /// `cosmwasm_std::SubMsg` for the `CosmosMsg::Stargate` to be executed. + pub fn exec_stargate_test_happy( + exec_msg: &ExecuteMsg, + deps: DepsMut, + info: MessageInfo, + ) -> TestResult { + let resp = execute(deps, mock_env(), info, exec_msg.clone())?; + assert_eq!(resp.messages.len(), 1, "resp.messages: {:?}", resp.messages); + Ok(()) + } + + struct TestCaseExecClaim<'a> { + exec_msg: ExecuteMsg, + sender: &'a str, + err: Option<&'a str>, + funds_sent: Option<&'a str>, + } + + /// exec_claim: Test the ExecuteMsg::Claim variant. + #[test] + fn exec_claim() -> TestResult { + // Prepare the test environment + let deps = testing::mock_dependencies(); + let env = mock_env(); + let contract_address = env.contract.address.clone(); + let to_address = String::from("recipient_address"); + + // Instantiate contract + let admin = to_address.as_str(); + let sender = to_address.as_str(); + let (_sudoers, mut deps, _info) = do_init(admin, sender, deps); + + // Set up a mock querier with contract balance + let balances: &[(&str, &[Coin])] = + &[(contract_address.as_str(), &[Coin::new(100, "token")])]; + let querier = testing::MockQuerier::new(balances); + deps.querier = querier; + + let test_cases: Vec = vec![ + // claim with no args + TestCaseExecClaim { + exec_msg: ExecuteMsg::Claim { + funds: None, + claim_all: None, + to: to_address.clone(), + }, + sender: to_address.as_str(), + err: Some("arguments must be specified"), + funds_sent: None, + }, + // claim happy / partial + TestCaseExecClaim { + exec_msg: ExecuteMsg::Claim { + funds: Some(Coin::new(50, "token")), + claim_all: None, + to: to_address.clone(), + }, + sender: to_address.as_str(), + err: None, + funds_sent: Some("50"), + }, + // claim happy / all + TestCaseExecClaim { + exec_msg: ExecuteMsg::Claim { + funds: None, + claim_all: Some(true), + to: to_address.clone(), + }, + sender: to_address.as_str(), + err: None, + funds_sent: Some("100"), + }, + // claim / sad / all set to false + TestCaseExecClaim { + exec_msg: ExecuteMsg::Claim { + funds: None, + claim_all: Some(false), + to: to_address.clone(), + }, + sender: to_address.as_str(), + err: Some("false causes an error"), + funds_sent: None, + }, + ]; + for tc in &test_cases { + // Instantiate contract + let deps = testing::mock_dependencies(); + let sender = tc.sender; + let (_sudoers, mut deps, info) = do_init(admin, sender, deps); + + // Set up a mock querier with contract balance + let balances: &[(&str, &[Coin])] = + &[(contract_address.as_str(), &[Coin::new(100, "token")])]; + let querier = testing::MockQuerier::new(balances); + deps.querier = querier; + + let res = + execute(deps.as_mut(), mock_env(), info, tc.exec_msg.clone()); + if let Some(err) = tc.err { + assert!(res.is_err()); + assert!(res.unwrap_err().to_string().contains(err)); + continue; + } + + // Check for the correct number of SubMsgs + assert!(res.is_ok(), "res: {:?}", res); + let resp = res?; + assert_eq!(resp.messages.len(), 1); + + // Check that the correct amount of funds are sent + if let Some(want_funds_sent) = tc.funds_sent { + let sub_msg: &SubMsg = &resp.messages[0]; + let transfer_msg: &CosmosMsg = &sub_msg.msg; + let msg_json: String = + serde_json::to_string_pretty(&transfer_msg) + .expect("Failed to serialized JSON"); + println!("msg_json: {:?}", msg_json); + + let contract_balance: &Coin = &balances[0].1[0]; + let denom: String = contract_balance.denom.clone(); + let amount: String = want_funds_sent.to_string(); + let expected_json_elements: Vec = vec![ + format!(r#""denom": "{}""#, denom), + format!(r#""amount": "{}""#, amount), + ]; + for elem in &expected_json_elements { + assert!( + msg_json.to_string().clone().contains(elem), + "elem: {}", + elem + ); + } + } + } + Ok(()) + } +} diff --git a/contracts/nibi-stargate-perp/src/integration_test.rs b/contracts/nibi-stargate-perp/src/integration_test.rs new file mode 100644 index 0000000..fc2a0a0 --- /dev/null +++ b/contracts/nibi-stargate-perp/src/integration_test.rs @@ -0,0 +1,53 @@ +#[cfg(test)] +pub mod integration_tests { + use crate::msg::InitMsg; + use cosmwasm_std::{coins, Decimal, Response}; + use cosmwasm_vm::testing::{ + instantiate, mock_env, mock_info, mock_instance, + }; + use std::str::FromStr; + + // TODO test that the file exists + static WASM: &[u8] = include_bytes!("../../../artifacts/bindings_perp.wasm"); + + #[test] + fn msg_init() { + let mut deps = mock_instance(WASM, &[]); + let sender = String::from("sender"); + let info = mock_info(&sender, &coins(1000, "unibi")); + let inst_msg = InitMsg {}; + let result: Response = + instantiate(&mut deps, mock_env(), info, inst_msg).unwrap(); + assert_eq!(result.messages.len(), 0); + } + + #[test] + fn negative_decimal_not_possible() { + let neg = Decimal::from_str("-420"); + assert!(neg.is_err()) + } + + // Example integration test for a custom query + // TODO This requires writing a test querier that registers the custom enum + // + // const DESERIALIZATION_LIMIT: usize = 20_000; + // + // #[test] + // fn query_reserves() { + // let mut deps = mock_instance(WASM, &[]); + // let sender = String::from("sender"); + // let info = mock_info(&sender, &coins(1000, "unibi")); + // let inst_msg = InitMsg {}; + // let result: Response = + // instantiate(&mut deps, mock_env(), info, inst_msg).unwrap(); + // assert_eq!(result.messages.len(), 0); + + // let pair = String::from("ueth:unusd"); + // let query_msg = NibiruQuery::Reserves { pair }; + // let raw_resp = query(&mut deps, mock_env(), query_msg); + // assert!(raw_resp.is_err(), "err: {}", raw_resp.unwrap_err()); + // let resp: ReservesResponse = + // from_slice(&raw_resp.unwrap(), DESERIALIZATION_LIMIT).unwrap(); + // assert_eq!(resp.pair, pair) + // } +} \ No newline at end of file diff --git a/contracts/nibi-stargate-perp/src/lib.rs b/contracts/nibi-stargate-perp/src/lib.rs new file mode 100644 index 0000000..4934c19 --- /dev/null +++ b/contracts/nibi-stargate-perp/src/lib.rs @@ -0,0 +1,3 @@ +pub mod contract; +pub mod msg; +pub mod state; diff --git a/contracts/nibi-stargate-perp/src/msg.rs b/contracts/nibi-stargate-perp/src/msg.rs new file mode 100644 index 0000000..3dc1025 --- /dev/null +++ b/contracts/nibi-stargate-perp/src/msg.rs @@ -0,0 +1,96 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{Coin, Decimal, Uint128}; + +use crate::state::Sudoers; + +/// InitMsg: message type for smart contract instantiation +#[cw_serde] +pub struct InitMsg { + pub admin: Option, +} + +// --------------------------------------------------------------------------- +// Entry Point - Execute +// --------------------------------------------------------------------------- + +/// ExecuteMsg: message type for invoking or executing the smart contract +#[cw_serde] +pub enum ExecuteMsg { + MarketOrder { + pair: String, + is_long: bool, + quote_amount: Uint128, + leverage: Decimal, + base_amount_limit: Uint128, + }, + + ClosePosition { + pair: String, + }, + + AddMargin { + pair: String, + margin: Coin, + }, + + RemoveMargin { + pair: String, + margin: Coin, + }, + + MultiLiquidate { + liquidations: Vec, + }, + + DonateToInsuranceFund { + donation: Coin, + }, + + Claim { + funds: Option, + claim_all: Option, + to: String, + }, +} + +#[cw_serde] +pub struct LiquidationArgs { + pub pair: String, + pub trader: String, +} + +// --------------------------------------------------------------------------- +// Entry Point - Query +// --------------------------------------------------------------------------- + +#[cw_serde] +pub enum QueryMsg { + Sudoers {}, + + /// Query perp markets + Markets {}, + + /// Query a single Nibi-Perps position + Position { + trader: String, + pair: String, + }, + + /// Query all Nibi-Perps positions for the trader + Positions { + trader: String, + }, + + /// Query the Nibi-Perps module accounts + ModuleAccounts {}, + + /// Query prices from the Nibi-Oracle. + OraclePrices { + pairs: Option>, + }, +} + +#[cw_serde] +pub struct SudoersQueryResponse { + pub sudoers: Sudoers, +} diff --git a/contracts/nibi-stargate-perp/src/state.rs b/contracts/nibi-stargate-perp/src/state.rs new file mode 100644 index 0000000..b7f6497 --- /dev/null +++ b/contracts/nibi-stargate-perp/src/state.rs @@ -0,0 +1,94 @@ +use std::collections::HashSet; + +use cosmwasm_schema::cw_serde; +use cw_storage_plus::Item; + +pub const SUDOERS: Item = Item::new("sudoers"); + +#[cw_serde] +pub struct Sudoers { + pub members: HashSet, + pub admin: String, +} + +impl Sudoers { + pub fn has(&self, addr: impl AsRef) -> bool { + let addr = addr.as_ref(); + self.members.contains(addr) || self.admin == addr + } + + pub fn is_admin(&self, addr: impl AsRef) -> bool { + let addr = addr.as_ref(); + self.admin == addr + } + + pub fn is_member(&self, addr: impl AsRef) -> bool { + let addr = addr.as_ref(); + self.members.contains(addr) + } +} + +#[cfg(test)] +pub mod tests { + use cosmwasm_std::testing::MockStorage; + + use super::*; + + pub fn init_mock_sudoers() -> Sudoers { + let member_names = ["alice", "brock", "david"]; + let members: HashSet = + member_names.iter().map(|&s| s.to_string()).collect(); + let admin: String = "cait".to_string(); + Sudoers { members, admin } + } + + #[test] + fn sudoers_is_admin() { + let sudoers = init_mock_sudoers(); + assert!(!sudoers.is_admin("alice")); + assert!(sudoers.is_admin("cait")); + assert!(!sudoers.is_admin("david")); + assert!(!sudoers.is_admin("brock")); + } + + #[test] + fn sudoers_is_member() { + let sudoers = init_mock_sudoers(); + assert!(sudoers.is_member("alice")); + assert!(!sudoers.is_member("cait")); + assert!(sudoers.is_member("david")); + assert!(sudoers.is_member("brock")); + } + + #[test] + fn sudoers_has() { + let sudoers = init_mock_sudoers(); + + let sudoersed_names = ["alice", "brock", "cait", "david"]; + for name in sudoersed_names.iter() { + assert!(sudoers.has(name)); + } + + let other_names = ["xxx", "not-sudoersed"]; + for name in other_names.iter() { + assert!(!sudoers.has(name)); + } + } + + #[test] + fn save_and_load() { + let mut store = MockStorage::new(); + + // Store should start out empty + assert!(SUDOERS.load(&store).is_err()); + assert_eq!(SUDOERS.may_load(&store).unwrap(), None); + + // save to store + let sudoers = init_mock_sudoers(); + let res = SUDOERS.save(&mut store, &sudoers); + assert!(res.is_ok()); + + // load from store + assert_eq!(sudoers, SUDOERS.load(&store).unwrap()); + } +} From 582d3159ab70b2c9004dfc7960efa5b3892cecab Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sat, 25 Nov 2023 01:20:05 -0600 Subject: [PATCH 08/22] refactor(nusd-valuator): run tidy --- contracts/nusd-valuator/src/lib.rs | 2 +- contracts/nusd-valuator/src/msgs.rs | 2 +- contracts/nusd-valuator/src/queries.rs | 2 +- contracts/nusd-valuator/src/testing.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/nusd-valuator/src/lib.rs b/contracts/nusd-valuator/src/lib.rs index 95b91f5..06cf316 100644 --- a/contracts/nusd-valuator/src/lib.rs +++ b/contracts/nusd-valuator/src/lib.rs @@ -11,4 +11,4 @@ pub mod events; pub mod state; #[cfg(test)] -pub mod testing; \ No newline at end of file +pub mod testing; diff --git a/contracts/nusd-valuator/src/msgs.rs b/contracts/nusd-valuator/src/msgs.rs index b3f80de..2ff915d 100644 --- a/contracts/nusd-valuator/src/msgs.rs +++ b/contracts/nusd-valuator/src/msgs.rs @@ -54,4 +54,4 @@ pub struct InstantiateMsg { /// The owner is the only one that can use ExecuteMsg. pub owner: String, pub accepted_denoms: BTreeSet, -} \ No newline at end of file +} diff --git a/contracts/nusd-valuator/src/queries.rs b/contracts/nusd-valuator/src/queries.rs index b68b4c0..cd78957 100644 --- a/contracts/nusd-valuator/src/queries.rs +++ b/contracts/nusd-valuator/src/queries.rs @@ -68,4 +68,4 @@ pub fn query_redeemable_choices( }) .collect(); choices -} \ No newline at end of file +} diff --git a/contracts/nusd-valuator/src/testing.rs b/contracts/nusd-valuator/src/testing.rs index d74f223..c0a95c3 100644 --- a/contracts/nusd-valuator/src/testing.rs +++ b/contracts/nusd-valuator/src/testing.rs @@ -43,4 +43,4 @@ pub fn mock_env_height(height: u64) -> Env { let mut env = mock_env(); env.block.height = height; env -} \ No newline at end of file +} From 82f374d86169ee3c7a1e3744f9c065a2b63037cc Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sat, 25 Nov 2023 01:20:50 -0600 Subject: [PATCH 09/22] fix(core-shifter): use new types + clean up tests --- contracts/core-shifter/src/contract.rs | 106 +++++++++---------------- contracts/core-shifter/src/msgs.rs | 23 ++++-- 2 files changed, 54 insertions(+), 75 deletions(-) diff --git a/contracts/core-shifter/src/contract.rs b/contracts/core-shifter/src/contract.rs index 1d70ed4..92ef9cb 100644 --- a/contracts/core-shifter/src/contract.rs +++ b/contracts/core-shifter/src/contract.rs @@ -1,17 +1,15 @@ -use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - attr, entry_point, Binary, CosmosMsg, CustomMsg, Deps, DepsMut, Env, - MessageInfo, Response, StdResult, + attr, entry_point, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, + Response, StdResult, }; -use nibiru_macro::cw_custom; -use nibiru_std::bindings::msg::NibiruRoute; +use nibiru_std::proto::{nibiru, NibiruStargateMsg}; use crate::{ msgs::{ExecuteMsg, InitMsg, IsMemberResponse, QueryMsg, WhitelistResponse}, state::{Whitelist, WHITELIST}, }; -#[entry_point] +#[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( deps: DepsMut, _env: Env, @@ -46,55 +44,47 @@ fn check_member(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { } } -/// ExecuteResponse allows the execute entry point to return different response -/// types depending on the input. This is possible because we wrap the Response -/// type with variants of ExecuteResponse. These variants store a Response type. -/// -/// In CosmWasm, there are multiple entry points for handling different message -/// types, such as instantiate, execute, query, sudo, and migrate. However, -/// each entry point returns a single type of response. You cannot have multiple -/// entry points return different returning different response types for the -/// same message type. Ref: https://book.cosmwasm.com/basics/entry-points.html -#[cw_serde] -#[cw_custom] -pub struct ContractExecMsg { - pub route: NibiruRoute, - pub msg: ExecuteMsg, -} - -#[entry_point] +#[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( deps: DepsMut, - _env: Env, + env: Env, info: MessageInfo, msg: ExecuteMsg, -) -> StdResult> { +) -> StdResult { let deps_for_check = &deps; let check: CanExecute = can_execute(deps_for_check.as_ref(), info.sender.as_ref())?; let mut whitelist = check.whitelist.clone(); + let contract_addr = env.contract.address.to_string(); match msg { - ExecuteMsg::DepthShift { pair, depth_mult } => { + ExecuteMsg::ShiftSwapInvariant { + pair, + new_swap_invariant, + } => { check_member(check)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::Perp, - msg: ExecuteMsg::DepthShift { pair, depth_mult }, - }; + let cosmos_msg: CosmosMsg = nibiru::perp::MsgShiftSwapInvariant { + sender: contract_addr, + pair, + new_swap_invariant: new_swap_invariant.to_string(), + } + .into_stargate_msg(); let res = Response::new() - .add_message(cw_msg) + .add_message(cosmos_msg) .add_attributes(vec![attr("action", "depth_shift")]); Ok(res) } - ExecuteMsg::PegShift { pair, peg_mult } => { + ExecuteMsg::ShiftPegMultiplier { pair, new_peg_mult } => { check_member(check)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::Perp, - msg: ExecuteMsg::PegShift { pair, peg_mult }, - }; + let cosmos_msg: CosmosMsg = nibiru::perp::MsgShiftPegMultiplier { + sender: contract_addr, + pair, + new_peg_mult: new_peg_mult.to_string(), + } + .into_stargate_msg(); let res = Response::new() - .add_message(cw_msg) + .add_message(cosmos_msg) .add_attributes(vec![attr("action", "peg_shift")]); Ok(res) } @@ -106,11 +96,7 @@ pub fn execute( whitelist.members.insert(addr.into_string()); WHITELIST.save(deps.storage, &whitelist)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::NoOp, - msg: ExecuteMsg::NoOp {}, - }; - let res = Response::new().add_message(cw_msg).add_attributes(vec![ + let res = Response::new().add_attributes(vec![ attr("action", "add_member"), attr("address", address), ]); @@ -122,11 +108,7 @@ pub fn execute( whitelist.members.remove(address.as_str()); WHITELIST.save(deps.storage, &whitelist)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::NoOp, - msg: ExecuteMsg::NoOp {}, - }; - let res = Response::new().add_message(cw_msg).add_attributes(vec![ + let res = Response::new().add_attributes(vec![ attr("action", "remove_member"), attr("address", address), ]); @@ -141,26 +123,12 @@ pub fn execute( whitelist.members.insert(new_admin.to_string()); WHITELIST.save(deps.storage, &whitelist)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::NoOp, - msg: ExecuteMsg::NoOp {}, - }; - let res = Response::new().add_message(cw_msg).add_attributes(vec![ + let res = Response::new().add_attributes(vec![ attr("action", "change_admin"), attr("address", address), ]); Ok(res) } - - // Purely here to satisfy the enum. - ExecuteMsg::NoOp {} => { - let cw_msg = ContractExecMsg { - route: NibiruRoute::NoOp, - msg: ExecuteMsg::NoOp {}, - }; - let res = Response::new().add_message(cw_msg); - Ok(res) - } } } @@ -181,7 +149,7 @@ fn can_execute(deps: Deps, sender: &str) -> StdResult { }) } -#[entry_point] +#[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::IsMember { address } => { @@ -304,10 +272,10 @@ mod tests { }; let execute_info = testing::mock_info(admin.as_str(), &[]); - let check_resp = |resp: Response| { + let check_resp = |resp: Response| { assert_eq!( resp.messages.len(), - 1, + 0, "resp.messages: {:?}", resp.messages ); @@ -375,10 +343,10 @@ mod tests { address: "satoshi".to_string(), }; let execute_info = testing::mock_info(admin.as_str(), &[]); - let check_resp = |resp: Response| { + let check_resp = |resp: Response| { assert_eq!( resp.messages.len(), - 1, + 0, "resp.messages: {:?}", resp.messages ); @@ -439,10 +407,10 @@ mod tests { }; let execute_info = testing::mock_info(admin.as_str(), &[]); - let check_resp = |resp: Response| { + let check_resp = |resp: Response| { assert_eq!( resp.messages.len(), - 1, + 0, "resp.messages: {:?}", resp.messages ); diff --git a/contracts/core-shifter/src/msgs.rs b/contracts/core-shifter/src/msgs.rs index 2dde25d..35d2d63 100644 --- a/contracts/core-shifter/src/msgs.rs +++ b/contracts/core-shifter/src/msgs.rs @@ -12,12 +12,23 @@ pub struct InitMsg { /// ExecuteMsg specifies the args for the execute entry point of the contract. #[cw_serde] pub enum ExecuteMsg { - DepthShift { pair: String, depth_mult: Uint256 }, - PegShift { pair: String, peg_mult: Decimal }, - AddMember { address: String }, - RemoveMember { address: String }, - ChangeAdmin { address: String }, - NoOp {}, + ShiftSwapInvariant { + pair: String, + new_swap_invariant: Uint256, + }, + ShiftPegMultiplier { + pair: String, + new_peg_mult: Decimal, + }, + AddMember { + address: String, + }, + RemoveMember { + address: String, + }, + ChangeAdmin { + address: String, + }, } /// QueryMsg specifies the args for the query entry point of the contract. From 833e15b35387d3f10a694968f0bf4af612b4153e Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sat, 25 Nov 2023 01:21:13 -0600 Subject: [PATCH 10/22] fix(core-controller): use new types + clean up tests [deprecated temp] --- contracts/core-controller/src/contract.rs | 143 ++++++++-------------- contracts/core-controller/src/msgs.rs | 5 + 2 files changed, 59 insertions(+), 89 deletions(-) diff --git a/contracts/core-controller/src/contract.rs b/contracts/core-controller/src/contract.rs index 67e60fa..8507841 100644 --- a/contracts/core-controller/src/contract.rs +++ b/contracts/core-controller/src/contract.rs @@ -1,10 +1,7 @@ -use cosmwasm_schema::cw_serde; use cosmwasm_std::{ - attr, entry_point, Binary, CosmosMsg, CustomMsg, Deps, DepsMut, Env, - MessageInfo, Response, StdResult, + attr, entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Response, + StdResult, }; -use nibiru_macro::cw_custom; -use nibiru_std::bindings::msg::NibiruRoute; use crate::{ msgs::{ExecuteMsg, InitMsg, IsMemberResponse, QueryMsg, WhitelistResponse}, @@ -46,59 +43,42 @@ fn check_member(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { } } -/// ExecuteResponse allows the execute entry point to return different response -/// types depending on the input. This is possible because we wrap the Response -/// type with variants of ExecuteResponse. These variants store a Response type. -/// -/// In CosmWasm, there are multiple entry points for handling different message -/// types, such as instantiate, execute, query, sudo, and migrate. However, -/// each entry point returns a single type of response. You cannot have multiple -/// entry points return different returning different response types for the -/// same message type. Ref: https://book.cosmwasm.com/basics/entry-points.html -#[cw_serde] -#[cw_custom] -pub struct ContractExecMsg { - pub route: NibiruRoute, - pub msg: Option, -} - #[entry_point] pub fn execute( deps: DepsMut, _env: Env, info: MessageInfo, msg: ExecuteMsg, -) -> StdResult> { +) -> StdResult { let deps_for_check = &deps; let check: CanExecute = can_execute(deps_for_check.as_ref(), info.sender.as_ref())?; let mut whitelist = check.whitelist.clone(); match msg { + #[allow(unused_variables, deprecated, unreachable_code)] ExecuteMsg::InsuranceFundWithdraw { amount, to } => { check_member(check)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::Perp, - msg: Some(ExecuteMsg::InsuranceFundWithdraw { amount, to }), - }; - let res = Response::new() - .add_message(cw_msg) - .add_attributes(vec![attr("action", "insurance_fund_withdraw")]); - Ok(res) + todo!(); + let _cw_msg = ExecuteMsg::InsuranceFundWithdraw { amount, to }; + // let res = Response::new() + // .add_message(cw_msg) + // .add_attributes(vec![attr("action", "insurance_fund_withdraw")]); + // Ok(res) } + #[allow(unused_variables, deprecated, unreachable_code)] ExecuteMsg::SetMarketEnabled { pair, enabled } => { check_member(check)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::Perp, - msg: Some(ExecuteMsg::SetMarketEnabled { pair, enabled }), - }; - let res = Response::new() - .add_message(cw_msg) - .add_attributes(vec![attr("action", "toggle_market_enabled")]); - Ok(res) + todo!(); + let _cw_msg = ExecuteMsg::SetMarketEnabled { pair, enabled }; + // let res = Response::new() + // .add_message(cw_msg) + // .add_attributes(vec![attr("action", "toggle_market_enabled")]); + // Ok(res) } + #[allow(unused_variables, deprecated, unreachable_code)] ExecuteMsg::CreateMarket { pair, peg_mult, @@ -106,21 +86,20 @@ pub fn execute( market_params, } => { check_member(check)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::Perp, - msg: Some(ExecuteMsg::CreateMarket { - pair, - peg_mult, - sqrt_depth, - market_params, - }), + todo!(); + let _cw_msg = ExecuteMsg::CreateMarket { + pair, + peg_mult, + sqrt_depth, + market_params, }; - let res = Response::new() - .add_message(cw_msg) - .add_attributes(vec![attr("action", "create_market")]); - Ok(res) + // let res = Response::new() + // .add_message(cw_msg) + // .add_attributes(vec![attr("action", "create_market")]); + // Ok(res) } + #[allow(unused_variables, deprecated, unreachable_code)] ExecuteMsg::EditOracleParams { vote_period, vote_threshold, @@ -134,25 +113,23 @@ pub fn execute( validator_fee_ratio, } => { check_member(check)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::Oracle, - msg: Some(ExecuteMsg::EditOracleParams { - vote_period, - vote_threshold, - reward_band, - whitelist, - slash_fraction, - slash_window, - min_valid_per_window, - twap_lookback_window, - min_voters, - validator_fee_ratio, - }), + todo!(); + let _cw_msg = ExecuteMsg::EditOracleParams { + vote_period, + vote_threshold, + reward_band, + whitelist, + slash_fraction, + slash_window, + min_valid_per_window, + twap_lookback_window, + min_voters, + validator_fee_ratio, }; - let res = Response::new() - .add_message(cw_msg) - .add_attributes(vec![attr("action", "edit_oracle")]); - Ok(res) + // let res = Response::new() + // .add_message(cw_msg) + // .add_attributes(vec![attr("action", "edit_oracle")]); + // Ok(res) } ExecuteMsg::AddMember { address } => { @@ -162,11 +139,7 @@ pub fn execute( whitelist.members.insert(addr.into_string()); WHITELIST.save(deps.storage, &whitelist)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::NoOp, - msg: None, - }; - let res = Response::new().add_message(cw_msg).add_attributes(vec![ + let res = Response::new().add_attributes(vec![ attr("action", "add_member"), attr("address", address), ]); @@ -178,11 +151,7 @@ pub fn execute( whitelist.members.remove(address.as_str()); WHITELIST.save(deps.storage, &whitelist)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::NoOp, - msg: None, - }; - let res = Response::new().add_message(cw_msg).add_attributes(vec![ + let res = Response::new().add_attributes(vec![ attr("action", "remove_member"), attr("address", address), ]); @@ -197,11 +166,7 @@ pub fn execute( whitelist.members.insert(new_admin.to_string()); WHITELIST.save(deps.storage, &whitelist)?; - let cw_msg = ContractExecMsg { - route: NibiruRoute::NoOp, - msg: None, - }; - let res = Response::new().add_message(cw_msg).add_attributes(vec![ + let res = Response::new().add_attributes(vec![ attr("action", "change_admin"), attr("address", address), ]); @@ -350,10 +315,10 @@ mod tests { }; let execute_info = testing::mock_info(admin.as_str(), &[]); - let check_resp = |resp: Response| { + let check_resp = |resp: Response| { assert_eq!( resp.messages.len(), - 1, + 0, "resp.messages: {:?}", resp.messages ); @@ -421,10 +386,10 @@ mod tests { address: "satoshi".to_string(), }; let execute_info = testing::mock_info(admin.as_str(), &[]); - let check_resp = |resp: Response| { + let check_resp = |resp: Response| { assert_eq!( resp.messages.len(), - 1, + 0, "resp.messages: {:?}", resp.messages ); @@ -485,10 +450,10 @@ mod tests { }; let execute_info = testing::mock_info(admin.as_str(), &[]); - let check_resp = |resp: Response| { + let check_resp = |resp: Response| { assert_eq!( resp.messages.len(), - 1, + 0, "resp.messages: {:?}", resp.messages ); diff --git a/contracts/core-controller/src/msgs.rs b/contracts/core-controller/src/msgs.rs index bbcc9fd..5dcb304 100644 --- a/contracts/core-controller/src/msgs.rs +++ b/contracts/core-controller/src/msgs.rs @@ -1,3 +1,4 @@ +#![allow(deprecated)] use cosmwasm_schema::cw_serde; use cosmwasm_std::{Decimal, Uint256, Uint64}; @@ -12,14 +13,17 @@ pub struct InitMsg { /// ExecuteMsg specifies the args for the execute entry point of the contract. #[cw_serde] pub enum ExecuteMsg { + #[deprecated(note = "Needs MsgServer impl added to NibiruChain/nibiru")] SetMarketEnabled { pair: String, enabled: bool, }, + #[deprecated(note = "Needs MsgServer impl added to NibiruChain/nibiru")] InsuranceFundWithdraw { amount: Uint256, to: String, }, + #[deprecated(note = "Needs MsgServer impl added to NibiruChain/nibiru")] EditOracleParams { vote_period: Option, vote_threshold: Option, @@ -32,6 +36,7 @@ pub enum ExecuteMsg { min_voters: Option, validator_fee_ratio: Option, }, + #[deprecated(note = "Needs MsgServer impl added to NibiruChain/nibiru")] CreateMarket { pair: String, peg_mult: Decimal, From c06051795f70e3cb95ef859b83f63e016315cfc4 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sat, 2 Dec 2023 19:48:52 -0600 Subject: [PATCH 11/22] feat(core-shifter): use cw-ownable, set_contract_version, better perission abstraction --- Cargo.lock | 3 + contracts/core-shifter/Cargo.toml | 5 +- contracts/core-shifter/src/contract.rs | 273 +++++++++++++------------ contracts/core-shifter/src/error.rs | 20 ++ contracts/core-shifter/src/lib.rs | 3 +- contracts/core-shifter/src/msgs.rs | 20 +- contracts/core-shifter/src/state.rs | 114 +++++++---- 7 files changed, 261 insertions(+), 177 deletions(-) create mode 100644 contracts/core-shifter/src/error.rs diff --git a/Cargo.lock b/Cargo.lock index 0276c00..df23e9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3155,9 +3155,12 @@ dependencies = [ name = "shifter" version = "0.2.0" dependencies = [ + "anyhow", "cosmwasm-schema", "cosmwasm-std", + "cw-ownable", "cw-storage-plus", + "cw2", "nibiru-macro", "nibiru-std", "schemars", diff --git a/contracts/core-shifter/Cargo.toml b/contracts/core-shifter/Cargo.toml index 1e0f3a9..82e249c 100644 --- a/contracts/core-shifter/Cargo.toml +++ b/contracts/core-shifter/Cargo.toml @@ -23,5 +23,8 @@ nibiru-macro = { workspace = true } thiserror = { workspace = true } schemars = "0.8.15" serde = { version = "1.0.188", default-features = false, features = ["derive"] } +cw-ownable = { workspace = true } +cw2 = { workspace = true } -[dev-dependencies] \ No newline at end of file +[dev-dependencies] +anyhow = { workspace = true } \ No newline at end of file diff --git a/contracts/core-shifter/src/contract.rs b/contracts/core-shifter/src/contract.rs index 92ef9cb..cfc900a 100644 --- a/contracts/core-shifter/src/contract.rs +++ b/contracts/core-shifter/src/contract.rs @@ -1,31 +1,40 @@ use cosmwasm_std::{ attr, entry_point, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, - Response, StdResult, + Response, }; +use cw2::set_contract_version; use nibiru_std::proto::{nibiru, NibiruStargateMsg}; use crate::{ - msgs::{ExecuteMsg, InitMsg, IsMemberResponse, QueryMsg, WhitelistResponse}, - state::{Whitelist, WHITELIST}, + error::ContractError, + msgs::{ + ExecuteMsg, HasPermsResponse, InitMsg, PermissionsResponse, QueryMsg, + }, + state::{instantiate_perms, Permissions, OPERATORS}, }; +pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InitMsg, -) -> StdResult { - let whitelist = Whitelist { - members: vec![msg.admin.clone()].into_iter().collect(), - admin: msg.admin, - }; - WHITELIST.save(deps.storage, &whitelist)?; +) -> Result { + set_contract_version( + deps.storage, + format!("crates.io:{CONTRACT_NAME}"), + CONTRACT_VERSION, + )?; + instantiate_perms(Some(&msg.owner), deps.storage, deps.api)?; Ok(Response::default()) } -fn check_admin(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { - match can.is_admin { +/// Errors if the sender does not have owner permissions. +fn check_perms_owner(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { + match can.is_owner { true => Ok(()), false => Err(cosmwasm_std::StdError::generic_err(format!( "unauthorized : sender {} is not an admin", @@ -34,11 +43,12 @@ fn check_admin(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { } } -fn check_member(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { - match can.is_member { +/// Errors if the sender does not have operator permissions. +fn check_perms_operator(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { + match can.is_operator || can.is_owner { true => Ok(()), false => Err(cosmwasm_std::StdError::generic_err(format!( - "unauthorized : sender {} is not a whitelist member", + "unauthorized : sender {} is not a perms member", can.sender, ))), } @@ -50,11 +60,11 @@ pub fn execute( env: Env, info: MessageInfo, msg: ExecuteMsg, -) -> StdResult { +) -> Result { let deps_for_check = &deps; let check: CanExecute = can_execute(deps_for_check.as_ref(), info.sender.as_ref())?; - let mut whitelist = check.whitelist.clone(); + let mut perms = check.perms.clone(); let contract_addr = env.contract.address.to_string(); match msg { @@ -62,7 +72,7 @@ pub fn execute( pair, new_swap_invariant, } => { - check_member(check)?; + check_perms_operator(check)?; let cosmos_msg: CosmosMsg = nibiru::perp::MsgShiftSwapInvariant { sender: contract_addr, pair, @@ -76,7 +86,7 @@ pub fn execute( } ExecuteMsg::ShiftPegMultiplier { pair, new_peg_mult } => { - check_member(check)?; + check_perms_operator(check)?; let cosmos_msg: CosmosMsg = nibiru::perp::MsgShiftPegMultiplier { sender: contract_addr, pair, @@ -90,11 +100,11 @@ pub fn execute( } ExecuteMsg::AddMember { address } => { - check_admin(check)?; + check_perms_owner(check)?; let api = deps.api; - let addr = api.addr_validate(address.as_str()).unwrap(); - whitelist.members.insert(addr.into_string()); - WHITELIST.save(deps.storage, &whitelist)?; + let addr = api.addr_validate(address.as_str())?; + perms.operators.insert(addr.into_string()); + OPERATORS.save(deps.storage, &perms.operators)?; let res = Response::new().add_attributes(vec![ attr("action", "add_member"), @@ -104,9 +114,9 @@ pub fn execute( } ExecuteMsg::RemoveMember { address } => { - check_admin(check)?; - whitelist.members.remove(address.as_str()); - WHITELIST.save(deps.storage, &whitelist)?; + check_perms_owner(check)?; + perms.operators.remove(address.as_str()); + OPERATORS.save(deps.storage, &perms.operators)?; let res = Response::new().add_attributes(vec![ attr("action", "remove_member"), @@ -116,12 +126,12 @@ pub fn execute( } ExecuteMsg::ChangeAdmin { address } => { - check_admin(check)?; + check_perms_owner(check)?; let api = deps.api; - let new_admin = api.addr_validate(address.as_str()).unwrap(); - whitelist.admin = new_admin.clone().into_string(); - whitelist.members.insert(new_admin.to_string()); - WHITELIST.save(deps.storage, &whitelist)?; + let new_admin = api.addr_validate(address.as_str())?; + perms.owner = Some(new_admin.clone().into_string()); + perms.operators.insert(new_admin.to_string()); + OPERATORS.save(deps.storage, &perms.operators)?; let res = Response::new().add_attributes(vec![ attr("action", "change_admin"), @@ -129,111 +139,132 @@ pub fn execute( ]); Ok(res) } + + ExecuteMsg::UpdateOwnership(action) => { + Ok(execute_update_ownership(deps, env, info, action)?) + } } } +fn execute_update_ownership( + deps: DepsMut, + env: Env, + info: MessageInfo, + action: cw_ownable::Action, +) -> Result { + let ownership = + cw_ownable::update_ownership(deps, &env.block, &info.sender, action)?; + Ok(Response::new().add_attributes(ownership.into_attributes())) +} + struct CanExecute { - is_admin: bool, - is_member: bool, + is_owner: bool, + is_operator: bool, sender: String, - whitelist: Whitelist, + perms: Permissions, } -fn can_execute(deps: Deps, sender: &str) -> StdResult { - let whitelist = WHITELIST.load(deps.storage).unwrap(); +fn can_execute(deps: Deps, sender: &str) -> Result { + let perms = Permissions::load(deps.storage)?; Ok(CanExecute { - is_admin: whitelist.is_admin(sender), - is_member: whitelist.is_member(sender), + is_owner: perms.is_owner(sender), + is_operator: perms.is_operator(sender), sender: sender.into(), - whitelist, + perms, }) } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { +pub fn query( + deps: Deps, + _env: Env, + msg: QueryMsg, +) -> Result { match msg { - QueryMsg::IsMember { address } => { - let whitelist = WHITELIST.load(deps.storage)?; - let is_member: bool = whitelist.is_member(address); - let res = IsMemberResponse { - is_member, - whitelist, + QueryMsg::HasPerms { address } => { + let perms = Permissions::load(deps.storage)?; + let has_perms: bool = perms.is_operator(&address); + let res = HasPermsResponse { + has_perms, + perms, + addr: address, }; - cosmwasm_std::to_json_binary(&res) + Ok(cosmwasm_std::to_json_binary(&res)?) } - QueryMsg::Whitelist {} => { - let whitelist = WHITELIST.load(deps.storage)?; - let res = WhitelistResponse { whitelist }; - cosmwasm_std::to_json_binary(&res) + QueryMsg::Perms {} => { + let perms = Permissions::load(deps.storage)?; + let res = PermissionsResponse { perms }; + Ok(cosmwasm_std::to_json_binary(&res)?) } } } #[cfg(test)] -mod tests { +pub mod tests { use super::*; use crate::{ msgs::{ExecuteMsg, InitMsg}, - state::WHITELIST, + state::OPERATORS, }; use cosmwasm_std::{coins, testing, Addr}; - use std::collections::HashSet; + use std::collections::BTreeSet; + + pub type TestResult = anyhow::Result<()>; // --------------------------------------------------------------------------- // Tests // --------------------------------------------------------------------------- #[test] - fn test_instantiate() { + fn test_instantiate() -> TestResult { let mut deps = testing::mock_dependencies(); let msg = InitMsg { - admin: "admin".to_string(), + owner: "admin".to_string(), }; let info: MessageInfo = testing::mock_info("addr0000", &coins(2, "token")); - let result = - instantiate(deps.as_mut(), testing::mock_env(), info, msg).unwrap(); + let result = instantiate(deps.as_mut(), testing::mock_env(), info, msg)?; assert_eq!(result.messages.len(), 0); + Ok(()) } #[test] - fn test_has_admin_power() { + fn test_has_admin_power() -> TestResult { let admin = Addr::unchecked("admin"); let msg = &InitMsg { - admin: admin.to_string(), + owner: admin.to_string(), }; let sender = "not-admin"; let mut deps = testing::mock_dependencies(); let msg_info = testing::mock_info(sender, &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg.clone()) - .unwrap(); - let whitelist = WHITELIST.load(&deps.storage).unwrap(); - let has: bool = whitelist.is_admin(sender); + instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg.clone())?; + let whitelist = Permissions::load(&deps.storage)?; + let has: bool = whitelist.is_owner(sender); assert!(!has); let sender = "admin"; let mut deps = testing::mock_dependencies(); let msg_info = testing::mock_info(sender, &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg.clone()) - .unwrap(); - let whitelist = WHITELIST.load(&deps.storage).unwrap(); - let has: bool = whitelist.is_admin(sender); + instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg.clone())?; + let whitelist = Permissions::load(&deps.storage)?; + let has: bool = whitelist.is_owner(sender); assert!(has); + Ok(()) } #[test] - fn test_execute_unauthorized() { + fn test_execute_unauthorized() -> TestResult { let mut deps = testing::mock_dependencies(); let admin = Addr::unchecked("admin"); let msg = InitMsg { - admin: admin.as_str().to_string(), + owner: admin.as_str().to_string(), }; let msg_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg).unwrap(); + instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg)?; let execute_msg = ExecuteMsg::AddMember { address: "addr0001".to_string(), @@ -246,27 +277,27 @@ mod tests { execute_msg, ); assert!(result.is_err()); + Ok(()) } #[test] - fn test_execute_add_member() { + fn test_execute_add_member() -> TestResult { // Init contract let mut deps = testing::mock_dependencies(); let admin = Addr::unchecked("admin"); let init_msg = InitMsg { - admin: admin.as_str().to_string(), + owner: admin.as_str().to_string(), }; let init_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg) - .unwrap(); + instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg)?; let new_member = "new_member"; - let whitelist = WHITELIST.load(&deps.storage).unwrap(); - let has: bool = whitelist.is_admin(new_member); + let perms = Permissions::load(&deps.storage)?; + let has: bool = perms.is_owner(new_member); assert!(!has); - // Add a member to whitelist + // Add an operator to the permission set let execute_msg = ExecuteMsg::AddMember { address: new_member.to_string(), }; @@ -292,50 +323,47 @@ mod tests { testing::mock_env(), execute_info, execute_msg, - ) - .unwrap(); + )?; check_resp(result); // Check correctness of the result - let whitelist = WHITELIST.load(&deps.storage).unwrap(); - let has: bool = whitelist.has(new_member); + let perms = Permissions::load(&deps.storage)?; + let has: bool = perms.has(new_member); assert!(has); - let query_req = QueryMsg::IsMember { + let query_req = QueryMsg::HasPerms { address: new_member.to_string(), }; - let binary = - query(deps.as_ref(), testing::mock_env(), query_req).unwrap(); - let response: IsMemberResponse = - cosmwasm_std::from_json(binary).unwrap(); - assert!(response.is_member); + let binary = query(deps.as_ref(), testing::mock_env(), query_req)?; + let response: HasPermsResponse = cosmwasm_std::from_json(binary)?; + assert!(response.has_perms); + Ok(()) } #[test] - fn test_execute_remove_member() { + fn test_execute_remove_member() -> TestResult { // Init contract let _deps = testing::mock_dependencies(); let mut deps = testing::mock_dependencies(); let admin = Addr::unchecked("admin"); let init_msg = InitMsg { - admin: admin.as_str().to_string(), + owner: admin.as_str().to_string(), }; let init_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg) - .unwrap(); + instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg)?; - // Set up initial whitelist - let members_start: Vec = ["vitalik", "musk", "satoshi"] + // Set up initial perms + let opers_start: Vec = ["vitalik", "musk", "satoshi"] .iter() .map(|&s| s.to_string()) .collect(); - let mut whitelist = WHITELIST.load(&deps.storage).unwrap(); - assert_eq!(whitelist.members.len(), 1); // admin remains - for member in members_start.iter() { - whitelist.members.insert(member.clone()); + let mut whitelist = Permissions::load(&deps.storage)?; + assert_eq!(whitelist.operators.len(), 0); // admin remains + for member in opers_start.iter() { + whitelist.operators.insert(member.clone()); } - let res = WHITELIST.save(deps.as_mut().storage, &whitelist); + let res = OPERATORS.save(deps.as_mut().storage, &whitelist.operators); assert!(res.is_ok()); // Remove a member from the whitelist @@ -362,43 +390,38 @@ mod tests { testing::mock_env(), execute_info, execute_msg, - ) - .unwrap(); + )?; check_resp(result); // Check correctness of the result - let query_req = QueryMsg::Whitelist {}; - let binary = - query(deps.as_ref(), testing::mock_env(), query_req).unwrap(); - let response: WhitelistResponse = - cosmwasm_std::from_json(binary).unwrap(); - let expected_members: HashSet = ["vitalik", "musk", "admin"] - .iter() - .map(|&s| s.to_string()) - .collect(); + let query_req = QueryMsg::Perms {}; + let binary = query(deps.as_ref(), testing::mock_env(), query_req)?; + let response: PermissionsResponse = cosmwasm_std::from_json(binary)?; + let expected_opers: BTreeSet = + ["vitalik", "musk"].iter().map(|&s| s.to_string()).collect(); assert_eq!( - response.whitelist.members, expected_members, + response.perms.operators, expected_opers, "got: {:#?}, wanted: {:#?}", - response.whitelist.members, expected_members + response.perms.operators, expected_opers ); + Ok(()) } #[test] - fn test_execute_change_admin() { + fn test_execute_change_admin() -> TestResult { // Init contract let mut deps = testing::mock_dependencies(); let admin = Addr::unchecked("admin"); let init_msg = InitMsg { - admin: admin.as_str().to_string(), + owner: admin.as_str().to_string(), }; let init_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg) - .unwrap(); + instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg)?; let new_admin = "new_admin"; - let whitelist = WHITELIST.load(&deps.storage).unwrap(); - let has: bool = whitelist.is_admin(new_admin); + let whitelist = Permissions::load(&deps.storage)?; + let has: bool = whitelist.is_owner(new_admin); assert!(!has); // Add a member to whitelist @@ -427,23 +450,21 @@ mod tests { testing::mock_env(), execute_info, execute_msg, - ) - .unwrap(); + )?; check_resp(result); // Check correctness of the result - let whitelist = WHITELIST.load(&deps.storage).unwrap(); + let whitelist = Permissions::load(&deps.storage)?; let has: bool = whitelist.has(new_admin); assert!(has); // The new admin should not yet be a member - let query_req = QueryMsg::IsMember { + let query_req = QueryMsg::HasPerms { address: new_admin.to_string(), }; - let binary = - query(deps.as_ref(), testing::mock_env(), query_req).unwrap(); - let response: IsMemberResponse = - cosmwasm_std::from_json(binary).unwrap(); - assert!(response.is_member); + let binary = query(deps.as_ref(), testing::mock_env(), query_req)?; + let response: HasPermsResponse = cosmwasm_std::from_json(binary)?; + assert!(response.has_perms); + Ok(()) } } diff --git a/contracts/core-shifter/src/error.rs b/contracts/core-shifter/src/error.rs new file mode 100644 index 0000000..8853f79 --- /dev/null +++ b/contracts/core-shifter/src/error.rs @@ -0,0 +1,20 @@ +use cosmwasm_std::StdError; + +use thiserror::Error; + +#[derive(Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("{0}")] + Ownership(#[from] cw_ownable::OwnershipError), + + #[error( + "insufficient permissions: sender is not a contract owner ({sender:?})" + )] + NoOwnerPerms { sender: String }, + + #[error("insufficient permissions: sender is not a contract operator ({sender:?})")] + NoOperatorPerms { sender: String }, +} diff --git a/contracts/core-shifter/src/lib.rs b/contracts/core-shifter/src/lib.rs index c18069d..5e272c0 100644 --- a/contracts/core-shifter/src/lib.rs +++ b/contracts/core-shifter/src/lib.rs @@ -1,3 +1,4 @@ pub mod contract; +pub mod error; pub mod msgs; -pub mod state; +pub mod state; \ No newline at end of file diff --git a/contracts/core-shifter/src/msgs.rs b/contracts/core-shifter/src/msgs.rs index 35d2d63..a2979c3 100644 --- a/contracts/core-shifter/src/msgs.rs +++ b/contracts/core-shifter/src/msgs.rs @@ -1,15 +1,16 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::{Decimal, Uint256}; -use crate::state::Whitelist; +use crate::state::Permissions; /// InitMsg specifies the args for the instantiate entry point of the contract. #[cw_serde] pub struct InitMsg { - pub admin: String, + pub owner: String, } /// ExecuteMsg specifies the args for the execute entry point of the contract. +#[cw_ownable::cw_ownable_execute] #[cw_serde] pub enum ExecuteMsg { ShiftSwapInvariant { @@ -34,17 +35,18 @@ pub enum ExecuteMsg { /// QueryMsg specifies the args for the query entry point of the contract. #[cw_serde] pub enum QueryMsg { - IsMember { address: String }, - Whitelist {}, + HasPerms { address: String }, + Perms {}, } #[cw_serde] -pub struct IsMemberResponse { - pub is_member: bool, - pub whitelist: Whitelist, +pub struct HasPermsResponse { + pub has_perms: bool, + pub addr: String, + pub perms: Permissions, } #[cw_serde] -pub struct WhitelistResponse { - pub whitelist: Whitelist, +pub struct PermissionsResponse { + pub perms: Permissions, } diff --git a/contracts/core-shifter/src/state.rs b/contracts/core-shifter/src/state.rs index 51d96f7..5af9ec4 100644 --- a/contracts/core-shifter/src/state.rs +++ b/contracts/core-shifter/src/state.rs @@ -1,94 +1,128 @@ -use std::collections::HashSet; +use std::collections::BTreeSet; use cosmwasm_schema::cw_serde; +use cosmwasm_std::{Api, Storage}; use cw_storage_plus::Item; -pub const WHITELIST: Item = Item::new("whitelist"); +use crate::error::ContractError; + +pub const OPERATORS: Item> = Item::new("operators"); #[cw_serde] -pub struct Whitelist { - pub members: HashSet, - pub admin: String, +pub struct Permissions { + pub owner: Option, + pub operators: BTreeSet, } -impl Whitelist { +impl Permissions { pub fn has(&self, addr: impl AsRef) -> bool { let addr = addr.as_ref(); - self.members.contains(addr) || self.admin == addr + self.operators.contains(addr) || self.is_owner(addr) } - pub fn is_admin(&self, addr: impl AsRef) -> bool { + pub fn is_owner(&self, addr: impl AsRef) -> bool { let addr = addr.as_ref(); - self.admin == addr + if let Some(owner) = &self.owner { + owner == addr + } else { + false + } } - pub fn is_member(&self, addr: impl AsRef) -> bool { + pub fn is_operator(&self, addr: impl AsRef) -> bool { let addr = addr.as_ref(); - self.members.contains(addr) + self.operators.contains(addr) + } + + pub fn load(storage: &dyn Storage) -> Result { + let owner = cw_ownable::get_ownership(storage)?.owner; + let opers = OPERATORS.load(storage)?; + Ok(Permissions { + owner: owner.map(|addr| addr.into_string()), + operators: opers, + }) } } +/// Set the given address as the contract owner and initialize the +/// 'OPERATORS' and 'OWNERSHIP' state. This function is only intended to be used only +/// during contract instantiation. +pub fn instantiate_perms( + owner: Option<&str>, + storage: &mut dyn Storage, + api: &dyn Api, +) -> Result<(), ContractError> { + cw_ownable::initialize_owner(storage, api, owner)?; + Ok(OPERATORS.save(storage, &BTreeSet::default())?) +} + #[cfg(test)] pub mod tests { + use crate::contract::tests::TestResult; use cosmwasm_std::testing::MockStorage; use super::*; - pub fn init_mock_whitelist() -> Whitelist { + pub fn init_mock_perms() -> Permissions { let member_names = ["alice", "brock", "david"]; - let members: HashSet = + let members: BTreeSet = member_names.iter().map(|&s| s.to_string()).collect(); let admin: String = "cait".to_string(); - Whitelist { members, admin } + Permissions { + operators: members, + owner: Some(admin), + } } #[test] - fn whitelist_is_admin() { - let whitelist = init_mock_whitelist(); - assert!(!whitelist.is_admin("alice")); - assert!(whitelist.is_admin("cait")); - assert!(!whitelist.is_admin("david")); - assert!(!whitelist.is_admin("brock")); + fn perms_is_owner() { + let perms = init_mock_perms(); + assert!(!perms.is_owner("alice")); + assert!(perms.is_owner("cait")); + assert!(!perms.is_owner("david")); + assert!(!perms.is_owner("brock")); } #[test] - fn whitelist_is_member() { - let whitelist = init_mock_whitelist(); - assert!(whitelist.is_member("alice")); - assert!(!whitelist.is_member("cait")); - assert!(whitelist.is_member("david")); - assert!(whitelist.is_member("brock")); + fn perms_is_member() { + let perms = init_mock_perms(); + assert!(perms.is_operator("alice")); + assert!(!perms.is_operator("cait")); + assert!(perms.is_operator("david")); + assert!(perms.is_operator("brock")); } #[test] - fn whitelist_has() { - let whitelist = init_mock_whitelist(); + fn perms_has() { + let perms = init_mock_perms(); - let whitelisted_names = ["alice", "brock", "cait", "david"]; - for name in whitelisted_names.iter() { - assert!(whitelist.has(name)); + let permsed_names = ["alice", "brock", "cait", "david"]; + for name in permsed_names.iter() { + assert!(perms.has(name)); } - let other_names = ["xxx", "not-whitelisted"]; + let other_names = ["xxx", "not-permsed"]; for name in other_names.iter() { - assert!(!whitelist.has(name)); + assert!(!perms.has(name)); } } #[test] - fn save_and_load() { + fn save_and_load() -> TestResult { let mut store = MockStorage::new(); // Store should start out empty - assert!(WHITELIST.load(&store).is_err()); - assert_eq!(WHITELIST.may_load(&store).unwrap(), None); + assert!(OPERATORS.load(&store).is_err()); + assert_eq!(OPERATORS.may_load(&store)?, None); // save to store - let whitelist = init_mock_whitelist(); - let res = WHITELIST.save(&mut store, &whitelist); + let perms = init_mock_perms(); + let opers = perms.operators; + let res = OPERATORS.save(&mut store, &opers); assert!(res.is_ok()); // load from store - assert_eq!(whitelist, WHITELIST.load(&store).unwrap()); + assert_eq!(opers, OPERATORS.load(&store)?); + Ok(()) } -} +} \ No newline at end of file From 0039bf48f549bc69faffda7592415bb533cc3568 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Sun, 3 Dec 2023 00:44:35 -0600 Subject: [PATCH 12/22] refactor(core-shifter)!: make CanExecute logic more concise + tests --- contracts/core-shifter/src/contract.rs | 243 +++++++++---------------- contracts/core-shifter/src/error.rs | 5 - contracts/core-shifter/src/msgs.rs | 30 +-- 3 files changed, 103 insertions(+), 175 deletions(-) diff --git a/contracts/core-shifter/src/contract.rs b/contracts/core-shifter/src/contract.rs index cfc900a..c601dcc 100644 --- a/contracts/core-shifter/src/contract.rs +++ b/contracts/core-shifter/src/contract.rs @@ -8,7 +8,8 @@ use nibiru_std::proto::{nibiru, NibiruStargateMsg}; use crate::{ error::ContractError, msgs::{ - ExecuteMsg, HasPermsResponse, InitMsg, PermissionsResponse, QueryMsg, + operator_perms, ExecuteMsg, HasPermsResponse, InitMsg, PermsResponse, + QueryMsg, }, state::{instantiate_perms, Permissions, OPERATORS}, }; @@ -32,28 +33,6 @@ pub fn instantiate( Ok(Response::default()) } -/// Errors if the sender does not have owner permissions. -fn check_perms_owner(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { - match can.is_owner { - true => Ok(()), - false => Err(cosmwasm_std::StdError::generic_err(format!( - "unauthorized : sender {} is not an admin", - can.sender, - ))), - } -} - -/// Errors if the sender does not have operator permissions. -fn check_perms_operator(can: CanExecute) -> Result<(), cosmwasm_std::StdError> { - match can.is_operator || can.is_owner { - true => Ok(()), - false => Err(cosmwasm_std::StdError::generic_err(format!( - "unauthorized : sender {} is not a perms member", - can.sender, - ))), - } -} - #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( deps: DepsMut, @@ -62,8 +41,7 @@ pub fn execute( msg: ExecuteMsg, ) -> Result { let deps_for_check = &deps; - let check: CanExecute = - can_execute(deps_for_check.as_ref(), info.sender.as_ref())?; + let check = CanExecute::new(deps_for_check.as_ref(), info.sender.as_ref())?; let mut perms = check.perms.clone(); let contract_addr = env.contract.address.to_string(); @@ -72,7 +50,7 @@ pub fn execute( pair, new_swap_invariant, } => { - check_perms_operator(check)?; + check.check_perms_operator()?; let cosmos_msg: CosmosMsg = nibiru::perp::MsgShiftSwapInvariant { sender: contract_addr, pair, @@ -81,12 +59,12 @@ pub fn execute( .into_stargate_msg(); let res = Response::new() .add_message(cosmos_msg) - .add_attributes(vec![attr("action", "depth_shift")]); + .add_attributes(vec![attr("action", "shift_swap_invariant")]); Ok(res) } ExecuteMsg::ShiftPegMultiplier { pair, new_peg_mult } => { - check_perms_operator(check)?; + check.check_perms_operator()?; let cosmos_msg: CosmosMsg = nibiru::perp::MsgShiftPegMultiplier { sender: contract_addr, pair, @@ -95,49 +73,37 @@ pub fn execute( .into_stargate_msg(); let res = Response::new() .add_message(cosmos_msg) - .add_attributes(vec![attr("action", "peg_shift")]); - Ok(res) - } - - ExecuteMsg::AddMember { address } => { - check_perms_owner(check)?; - let api = deps.api; - let addr = api.addr_validate(address.as_str())?; - perms.operators.insert(addr.into_string()); - OPERATORS.save(deps.storage, &perms.operators)?; - - let res = Response::new().add_attributes(vec![ - attr("action", "add_member"), - attr("address", address), - ]); - Ok(res) - } - - ExecuteMsg::RemoveMember { address } => { - check_perms_owner(check)?; - perms.operators.remove(address.as_str()); - OPERATORS.save(deps.storage, &perms.operators)?; - - let res = Response::new().add_attributes(vec![ - attr("action", "remove_member"), - attr("address", address), - ]); + .add_attributes(vec![attr("action", "shift_peg_multiplier")]); Ok(res) } - ExecuteMsg::ChangeAdmin { address } => { - check_perms_owner(check)?; + ExecuteMsg::EditOpers(action) => { + check.check_perms_operator()?; let api = deps.api; - let new_admin = api.addr_validate(address.as_str())?; - perms.owner = Some(new_admin.clone().into_string()); - perms.operators.insert(new_admin.to_string()); - OPERATORS.save(deps.storage, &perms.operators)?; - - let res = Response::new().add_attributes(vec![ - attr("action", "change_admin"), - attr("address", address), - ]); - Ok(res) + match action { + operator_perms::Action::AddOper { address } => { + let addr = api.addr_validate(address.as_str())?; + perms.operators.insert(addr.into_string()); + OPERATORS.save(deps.storage, &perms.operators)?; + + let res = Response::new().add_attributes(vec![ + attr("action", "add_operator"), + attr("address", address), + ]); + Ok(res) + } + + operator_perms::Action::RemoveOper { address } => { + perms.operators.remove(address.as_str()); + OPERATORS.save(deps.storage, &perms.operators)?; + + let res = Response::new().add_attributes(vec![ + attr("action", "remove_operator"), + attr("address", address), + ]); + Ok(res) + } + } } ExecuteMsg::UpdateOwnership(action) => { @@ -164,14 +130,26 @@ struct CanExecute { perms: Permissions, } -fn can_execute(deps: Deps, sender: &str) -> Result { - let perms = Permissions::load(deps.storage)?; - Ok(CanExecute { - is_owner: perms.is_owner(sender), - is_operator: perms.is_operator(sender), - sender: sender.into(), - perms, - }) +impl CanExecute { + pub fn new(deps: Deps, sender: &str) -> Result { + let perms = Permissions::load(deps.storage)?; + Ok(CanExecute { + is_owner: perms.is_owner(sender), + is_operator: perms.is_operator(sender), + sender: sender.into(), + perms, + }) + } + + /// Errors if the sender does not have operator permissions. + pub fn check_perms_operator(&self) -> Result<(), ContractError> { + match self.is_operator || self.is_owner { + true => Ok(()), + false => Err(ContractError::NoOperatorPerms { + sender: self.sender.to_string(), + }), + } + } } #[cfg_attr(not(feature = "library"), entry_point)] @@ -193,7 +171,7 @@ pub fn query( } QueryMsg::Perms {} => { let perms = Permissions::load(deps.storage)?; - let res = PermissionsResponse { perms }; + let res = PermsResponse { perms }; Ok(cosmwasm_std::to_json_binary(&res)?) } } @@ -239,24 +217,24 @@ pub mod tests { let sender = "not-admin"; let mut deps = testing::mock_dependencies(); - let msg_info = testing::mock_info(sender, &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg.clone())?; - let whitelist = Permissions::load(&deps.storage)?; - let has: bool = whitelist.is_owner(sender); + let info = testing::mock_info(sender, &coins(2, "token")); + instantiate(deps.as_mut(), testing::mock_env(), info, msg.clone())?; + let perms = Permissions::load(&deps.storage)?; + let has: bool = perms.is_owner(sender); assert!(!has); let sender = "admin"; let mut deps = testing::mock_dependencies(); - let msg_info = testing::mock_info(sender, &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg.clone())?; - let whitelist = Permissions::load(&deps.storage)?; - let has: bool = whitelist.is_owner(sender); + let info = testing::mock_info(sender, &coins(2, "token")); + instantiate(deps.as_mut(), testing::mock_env(), info, msg.clone())?; + let perms = Permissions::load(&deps.storage)?; + let has: bool = perms.is_owner(sender); assert!(has); Ok(()) } #[test] - fn test_execute_unauthorized() -> TestResult { + fn test_exec_unauthorized() -> TestResult { let mut deps = testing::mock_dependencies(); let admin = Addr::unchecked("admin"); @@ -266,9 +244,10 @@ pub mod tests { let msg_info = testing::mock_info("addr0000", &coins(2, "token")); instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg)?; - let execute_msg = ExecuteMsg::AddMember { - address: "addr0001".to_string(), - }; + let execute_msg = + ExecuteMsg::EditOpers(operator_perms::Action::AddOper { + address: "addr0001".to_string(), + }); let unauthorized_info = testing::mock_info("unauthorized", &[]); let result = execute( deps.as_mut(), @@ -281,7 +260,7 @@ pub mod tests { } #[test] - fn test_execute_add_member() -> TestResult { + fn test_exec_edit_opers_add() -> TestResult { // Init contract let mut deps = testing::mock_dependencies(); let admin = Addr::unchecked("admin"); @@ -298,9 +277,10 @@ pub mod tests { assert!(!has); // Add an operator to the permission set - let execute_msg = ExecuteMsg::AddMember { - address: new_member.to_string(), - }; + let execute_msg = + ExecuteMsg::EditOpers(operator_perms::Action::AddOper { + address: new_member.to_string(), + }); let execute_info = testing::mock_info(admin.as_str(), &[]); let check_resp = |resp: Response| { @@ -341,9 +321,8 @@ pub mod tests { } #[test] - fn test_execute_remove_member() -> TestResult { + fn test_exec_edit_opers_remove() -> TestResult { // Init contract - let _deps = testing::mock_dependencies(); let mut deps = testing::mock_dependencies(); let admin = Addr::unchecked("admin"); @@ -358,18 +337,19 @@ pub mod tests { .iter() .map(|&s| s.to_string()) .collect(); - let mut whitelist = Permissions::load(&deps.storage)?; - assert_eq!(whitelist.operators.len(), 0); // admin remains + let mut perms = Permissions::load(&deps.storage)?; + assert_eq!(perms.operators.len(), 0); // admin remains for member in opers_start.iter() { - whitelist.operators.insert(member.clone()); + perms.operators.insert(member.clone()); } - let res = OPERATORS.save(deps.as_mut().storage, &whitelist.operators); + let res = OPERATORS.save(deps.as_mut().storage, &perms.operators); assert!(res.is_ok()); // Remove a member from the whitelist - let execute_msg = ExecuteMsg::RemoveMember { - address: "satoshi".to_string(), - }; + let execute_msg = + ExecuteMsg::EditOpers(operator_perms::Action::RemoveOper { + address: "satoshi".to_string(), + }); let execute_info = testing::mock_info(admin.as_str(), &[]); let check_resp = |resp: Response| { assert_eq!( @@ -396,7 +376,7 @@ pub mod tests { // Check correctness of the result let query_req = QueryMsg::Perms {}; let binary = query(deps.as_ref(), testing::mock_env(), query_req)?; - let response: PermissionsResponse = cosmwasm_std::from_json(binary)?; + let response: PermsResponse = cosmwasm_std::from_json(binary)?; let expected_opers: BTreeSet = ["vitalik", "musk"].iter().map(|&s| s.to_string()).collect(); assert_eq!( @@ -407,64 +387,9 @@ pub mod tests { Ok(()) } + /// TODO: test change owner #[test] - fn test_execute_change_admin() -> TestResult { - // Init contract - let mut deps = testing::mock_dependencies(); - let admin = Addr::unchecked("admin"); - - let init_msg = InitMsg { - owner: admin.as_str().to_string(), - }; - let init_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg)?; - - let new_admin = "new_admin"; - let whitelist = Permissions::load(&deps.storage)?; - let has: bool = whitelist.is_owner(new_admin); - assert!(!has); - - // Add a member to whitelist - let execute_msg = ExecuteMsg::ChangeAdmin { - address: new_admin.to_string(), - }; - let execute_info = testing::mock_info(admin.as_str(), &[]); - - let check_resp = |resp: Response| { - assert_eq!( - resp.messages.len(), - 0, - "resp.messages: {:?}", - resp.messages - ); - assert_eq!( - resp.attributes.len(), - 2, - "resp.attributes: {:#?}", - resp.attributes - ); - }; - - let result = execute( - deps.as_mut(), - testing::mock_env(), - execute_info, - execute_msg, - )?; - check_resp(result); - - // Check correctness of the result - let whitelist = Permissions::load(&deps.storage)?; - let has: bool = whitelist.has(new_admin); - assert!(has); - - // The new admin should not yet be a member - let query_req = QueryMsg::HasPerms { - address: new_admin.to_string(), - }; - let binary = query(deps.as_ref(), testing::mock_env(), query_req)?; - let response: HasPermsResponse = cosmwasm_std::from_json(binary)?; - assert!(response.has_perms); + fn test_exec_change_admin() -> TestResult { Ok(()) } } diff --git a/contracts/core-shifter/src/error.rs b/contracts/core-shifter/src/error.rs index 8853f79..c86bf58 100644 --- a/contracts/core-shifter/src/error.rs +++ b/contracts/core-shifter/src/error.rs @@ -10,11 +10,6 @@ pub enum ContractError { #[error("{0}")] Ownership(#[from] cw_ownable::OwnershipError), - #[error( - "insufficient permissions: sender is not a contract owner ({sender:?})" - )] - NoOwnerPerms { sender: String }, - #[error("insufficient permissions: sender is not a contract operator ({sender:?})")] NoOperatorPerms { sender: String }, } diff --git a/contracts/core-shifter/src/msgs.rs b/contracts/core-shifter/src/msgs.rs index a2979c3..d24a72c 100644 --- a/contracts/core-shifter/src/msgs.rs +++ b/contracts/core-shifter/src/msgs.rs @@ -1,4 +1,4 @@ -use cosmwasm_schema::cw_serde; +use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{Decimal, Uint256}; use crate::state::Permissions; @@ -21,21 +21,29 @@ pub enum ExecuteMsg { pair: String, new_peg_mult: Decimal, }, - AddMember { - address: String, - }, - RemoveMember { - address: String, - }, - ChangeAdmin { - address: String, - }, + EditOpers(operator_perms::Action), +} + +pub mod operator_perms { + use cosmwasm_schema::cw_serde; + + #[cw_serde] + pub enum Action { + AddOper { address: String }, + RemoveOper { address: String }, + } } /// QueryMsg specifies the args for the query entry point of the contract. +#[derive(QueryResponses)] #[cw_serde] pub enum QueryMsg { + /// HasPerms: Query whether the given address has operator permissions. + /// The query response showcases the contract owner and set of operators. + #[returns(HasPermsResponse)] HasPerms { address: String }, + /// Perms: Query the contract owner and set of operators. + #[returns(PermsResponse)] Perms {}, } @@ -47,6 +55,6 @@ pub struct HasPermsResponse { } #[cw_serde] -pub struct PermissionsResponse { +pub struct PermsResponse { pub perms: Permissions, } From 584519532e75ba6778fcc9fc5c46937f37bc51c0 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Mon, 4 Dec 2023 00:34:36 -0600 Subject: [PATCH 13/22] refactor(contracts): mv core-controller to packages to prevent contract build --- {contracts => packages}/core-controller/.cargo/config | 0 {contracts => packages}/core-controller/Cargo.lock | 0 {contracts => packages}/core-controller/Cargo.toml | 0 {contracts => packages}/core-controller/src/contract.rs | 0 {contracts => packages}/core-controller/src/lib.rs | 0 {contracts => packages}/core-controller/src/msgs.rs | 0 {contracts => packages}/core-controller/src/state.rs | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename {contracts => packages}/core-controller/.cargo/config (100%) rename {contracts => packages}/core-controller/Cargo.lock (100%) rename {contracts => packages}/core-controller/Cargo.toml (100%) rename {contracts => packages}/core-controller/src/contract.rs (100%) rename {contracts => packages}/core-controller/src/lib.rs (100%) rename {contracts => packages}/core-controller/src/msgs.rs (100%) rename {contracts => packages}/core-controller/src/state.rs (100%) diff --git a/contracts/core-controller/.cargo/config b/packages/core-controller/.cargo/config similarity index 100% rename from contracts/core-controller/.cargo/config rename to packages/core-controller/.cargo/config diff --git a/contracts/core-controller/Cargo.lock b/packages/core-controller/Cargo.lock similarity index 100% rename from contracts/core-controller/Cargo.lock rename to packages/core-controller/Cargo.lock diff --git a/contracts/core-controller/Cargo.toml b/packages/core-controller/Cargo.toml similarity index 100% rename from contracts/core-controller/Cargo.toml rename to packages/core-controller/Cargo.toml diff --git a/contracts/core-controller/src/contract.rs b/packages/core-controller/src/contract.rs similarity index 100% rename from contracts/core-controller/src/contract.rs rename to packages/core-controller/src/contract.rs diff --git a/contracts/core-controller/src/lib.rs b/packages/core-controller/src/lib.rs similarity index 100% rename from contracts/core-controller/src/lib.rs rename to packages/core-controller/src/lib.rs diff --git a/contracts/core-controller/src/msgs.rs b/packages/core-controller/src/msgs.rs similarity index 100% rename from contracts/core-controller/src/msgs.rs rename to packages/core-controller/src/msgs.rs diff --git a/contracts/core-controller/src/state.rs b/packages/core-controller/src/state.rs similarity index 100% rename from contracts/core-controller/src/state.rs rename to packages/core-controller/src/state.rs From 2d6f37e205478ae969dd4f5fd670cdffd33e5ad0 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Mon, 4 Dec 2023 00:36:27 -0600 Subject: [PATCH 14/22] refactor(core-shifter): make tests more concise and easy to follow --- contracts/core-shifter/src/contract.rs | 68 ++++++-------------------- contracts/core-shifter/src/lib.rs | 4 +- contracts/core-shifter/src/state.rs | 4 +- contracts/core-shifter/src/testing.rs | 37 ++++++++++++++ nibiru-std/Cargo.toml | 2 - nibiru-std/src/lib.rs | 1 - 6 files changed, 58 insertions(+), 58 deletions(-) create mode 100644 contracts/core-shifter/src/testing.rs diff --git a/contracts/core-shifter/src/contract.rs b/contracts/core-shifter/src/contract.rs index c601dcc..a869b57 100644 --- a/contracts/core-shifter/src/contract.rs +++ b/contracts/core-shifter/src/contract.rs @@ -183,13 +183,12 @@ pub mod tests { use crate::{ msgs::{ExecuteMsg, InitMsg}, state::OPERATORS, + testing::{self as t, TestResult}, }; - use cosmwasm_std::{coins, testing, Addr}; + use cosmwasm_std::{coins, testing}; use std::collections::BTreeSet; - pub type TestResult = anyhow::Result<()>; - // --------------------------------------------------------------------------- // Tests // --------------------------------------------------------------------------- @@ -204,30 +203,19 @@ pub mod tests { testing::mock_info("addr0000", &coins(2, "token")); let result = instantiate(deps.as_mut(), testing::mock_env(), info, msg)?; + assert_eq!(result.messages.len(), 0); Ok(()) } #[test] fn test_has_admin_power() -> TestResult { - let admin = Addr::unchecked("admin"); - let msg = &InitMsg { - owner: admin.to_string(), - }; - let sender = "not-admin"; - let mut deps = testing::mock_dependencies(); - let info = testing::mock_info(sender, &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), info, msg.clone())?; - let perms = Permissions::load(&deps.storage)?; - let has: bool = perms.is_owner(sender); - assert!(!has); - - let sender = "admin"; - let mut deps = testing::mock_dependencies(); - let info = testing::mock_info(sender, &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), info, msg.clone())?; + let (deps, _env, _info) = t::setup_contract()?; let perms = Permissions::load(&deps.storage)?; + let not_has: bool = !perms.is_owner(sender); + assert!(not_has); + let sender = t::TEST_OWNER; let has: bool = perms.is_owner(sender); assert!(has); Ok(()) @@ -235,15 +223,7 @@ pub mod tests { #[test] fn test_exec_unauthorized() -> TestResult { - let mut deps = testing::mock_dependencies(); - let admin = Addr::unchecked("admin"); - - let msg = InitMsg { - owner: admin.as_str().to_string(), - }; - let msg_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), msg_info, msg)?; - + let (mut deps, _env, _info) = t::setup_contract()?; let execute_msg = ExecuteMsg::EditOpers(operator_perms::Action::AddOper { address: "addr0001".to_string(), @@ -261,27 +241,19 @@ pub mod tests { #[test] fn test_exec_edit_opers_add() -> TestResult { - // Init contract - let mut deps = testing::mock_dependencies(); - let admin = Addr::unchecked("admin"); - - let init_msg = InitMsg { - owner: admin.as_str().to_string(), - }; - let init_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg)?; - + let (mut deps, _env, _info) = t::setup_contract()?; let new_member = "new_member"; let perms = Permissions::load(&deps.storage)?; - let has: bool = perms.is_owner(new_member); - assert!(!has); + let not_has: bool = !perms.is_owner(new_member); + assert!(not_has); // Add an operator to the permission set let execute_msg = ExecuteMsg::EditOpers(operator_perms::Action::AddOper { address: new_member.to_string(), }); - let execute_info = testing::mock_info(admin.as_str(), &[]); + let sender = t::TEST_OWNER; + let execute_info = testing::mock_info(sender, &[]); let check_resp = |resp: Response| { assert_eq!( @@ -322,16 +294,7 @@ pub mod tests { #[test] fn test_exec_edit_opers_remove() -> TestResult { - // Init contract - let mut deps = testing::mock_dependencies(); - let admin = Addr::unchecked("admin"); - - let init_msg = InitMsg { - owner: admin.as_str().to_string(), - }; - let init_info = testing::mock_info("addr0000", &coins(2, "token")); - instantiate(deps.as_mut(), testing::mock_env(), init_info, init_msg)?; - + let (mut deps, _env, _info) = t::setup_contract()?; // Set up initial perms let opers_start: Vec = ["vitalik", "musk", "satoshi"] .iter() @@ -350,7 +313,8 @@ pub mod tests { ExecuteMsg::EditOpers(operator_perms::Action::RemoveOper { address: "satoshi".to_string(), }); - let execute_info = testing::mock_info(admin.as_str(), &[]); + let sender = t::TEST_OWNER; + let execute_info = testing::mock_info(sender, &[]); let check_resp = |resp: Response| { assert_eq!( resp.messages.len(), diff --git a/contracts/core-shifter/src/lib.rs b/contracts/core-shifter/src/lib.rs index 5e272c0..1cd0de8 100644 --- a/contracts/core-shifter/src/lib.rs +++ b/contracts/core-shifter/src/lib.rs @@ -1,4 +1,6 @@ pub mod contract; pub mod error; pub mod msgs; -pub mod state; \ No newline at end of file +pub mod state; +#[cfg(test)] +pub mod testing; diff --git a/contracts/core-shifter/src/state.rs b/contracts/core-shifter/src/state.rs index 5af9ec4..d6ca58f 100644 --- a/contracts/core-shifter/src/state.rs +++ b/contracts/core-shifter/src/state.rs @@ -58,7 +58,7 @@ pub fn instantiate_perms( #[cfg(test)] pub mod tests { - use crate::contract::tests::TestResult; + use crate::testing::TestResult; use cosmwasm_std::testing::MockStorage; use super::*; @@ -125,4 +125,4 @@ pub mod tests { assert_eq!(opers, OPERATORS.load(&store)?); Ok(()) } -} \ No newline at end of file +} diff --git a/contracts/core-shifter/src/testing.rs b/contracts/core-shifter/src/testing.rs new file mode 100644 index 0000000..e0ba7bc --- /dev/null +++ b/contracts/core-shifter/src/testing.rs @@ -0,0 +1,37 @@ +//! testing.rs: Test helpers for the contract + +use cosmwasm_std::{ + testing::{ + mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, + MockStorage, + }, + Env, MessageInfo, OwnedDeps, +}; + +use crate::{contract::instantiate, msgs::InitMsg}; + +pub type TestResult = anyhow::Result<()>; + +pub const TEST_OWNER: &str = "owner"; + +pub fn setup_contract(// accepted_denoms: Vec, +) -> anyhow::Result<( + OwnedDeps, + Env, + MessageInfo, +)> { + let mut deps = mock_dependencies(); + let env = mock_env(); + let info = mock_info(TEST_OWNER, &[]); + + let msg = InitMsg { + owner: info.sender.to_string(), + }; + let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg)?; + assert_eq!(0, res.messages.len()); + Ok((deps, env, info)) +} + +pub fn mock_info_for_sender(sender: &str) -> MessageInfo { + mock_info(sender, &[]) +} diff --git a/nibiru-std/Cargo.toml b/nibiru-std/Cargo.toml index cd04a11..e715ccf 100644 --- a/nibiru-std/Cargo.toml +++ b/nibiru-std/Cargo.toml @@ -27,8 +27,6 @@ thiserror = { workspace = true } nibiru-macro = { workspace = true } serde_json = { workspace = true } -test-tube = { version = "0.2" } - # cargo run --bin script-name # [[bin]] # name = "rust script name" diff --git a/nibiru-std/src/lib.rs b/nibiru-std/src/lib.rs index 46b46f5..adef90a 100644 --- a/nibiru-std/src/lib.rs +++ b/nibiru-std/src/lib.rs @@ -6,7 +6,6 @@ pub mod wasm; pub mod errors; -pub mod cosmrs; pub mod testing; pub const VERSION_COSMOS_SDK: &str = "v0.47.5"; From 2b1907f91e13f91ece219506bb5c4b09c6818562 Mon Sep 17 00:00:00 2001 From: Unique-Divine Date: Mon, 4 Dec 2023 00:37:12 -0600 Subject: [PATCH 15/22] chore(artifacts): build all contracts --- Cargo.lock | 922 +------------------------- artifacts/bindings_perp.wasm | Bin 371168 -> 0 bytes artifacts/checksums.txt | 16 +- artifacts/checksums_intermediate.txt | 16 +- artifacts/cw3_flex_multisig.wasm | Bin 412030 -> 408904 bytes artifacts/incentives.wasm | Bin 254476 -> 255362 bytes artifacts/lockup.wasm | Bin 205403 -> 205997 bytes artifacts/nibi_stargate.wasm | Bin 168706 -> 169124 bytes artifacts/nibi_stargate_perp.wasm | Bin 0 -> 223111 bytes artifacts/nusd_valuator.wasm | Bin 0 -> 221475 bytes artifacts/pricefeed.wasm | Bin 235187 -> 236172 bytes artifacts/shifter.wasm | Bin 205586 -> 221289 bytes artifacts/token_vesting.wasm | Bin 230053 -> 230078 bytes contracts/nusd-valuator/.cargo/config | 4 + contracts/nusd-valuator/src/msgs.rs | 12 +- 15 files changed, 60 insertions(+), 910 deletions(-) delete mode 100644 artifacts/bindings_perp.wasm create mode 100644 artifacts/nibi_stargate_perp.wasm create mode 100644 artifacts/nusd_valuator.wasm create mode 100644 contracts/nusd-valuator/.cargo/config diff --git a/Cargo.lock b/Cargo.lock index df23e9a..e442fcc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,17 +115,6 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "async-trait" -version = "0.1.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -147,24 +136,12 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.4" @@ -194,24 +171,6 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" -[[package]] -name = "bip32" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" -dependencies = [ - "bs58", - "hmac", - "k256 0.11.6", - "once_cell", - "pbkdf2", - "rand_core 0.6.4", - "ripemd", - "sha2 0.10.8", - "subtle", - "zeroize", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -260,15 +219,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" -dependencies = [ - "sha2 0.9.9", -] - [[package]] name = "bstr" version = "1.6.2" @@ -436,38 +386,6 @@ dependencies = [ "windows-sys 0.33.0", ] -[[package]] -name = "cosmos-sdk-proto" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b42021d8488665b1a0d9748f1f81df7235362d194f44481e2e61bf376b77b4" -dependencies = [ - "prost 0.11.9", - "prost-types 0.11.9", - "tendermint-proto", -] - -[[package]] -name = "cosmrs" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" -dependencies = [ - "bip32", - "cosmos-sdk-proto", - "ecdsa 0.14.8", - "eyre", - "getrandom", - "k256 0.11.6", - "rand_core 0.6.4", - "serde", - "serde_json", - "subtle-encoding", - "tendermint", - "tendermint-rpc", - "thiserror", -] - [[package]] name = "cosmwasm-crypto" version = "1.5.0" @@ -475,9 +393,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8bb3c77c3b7ce472056968c745eb501c440fbc07be5004eba02782c35bfbbe3" dependencies = [ "digest 0.10.7", - "ecdsa 0.16.8", + "ecdsa", "ed25519-zebra", - "k256 0.13.1", + "k256", "rand_core 0.6.4", "thiserror", ] @@ -521,7 +439,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04d6864742e3a7662d024b51a94ea81c9af21db6faea2f9a6d2232bb97c6e53e" dependencies = [ - "base64 0.21.4", + "base64", "bech32", "bnum", "cosmwasm-crypto", @@ -706,18 +624,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.3" @@ -740,15 +646,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct", -] - [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -798,7 +695,7 @@ dependencies = [ "cw-utils", "derivative", "itertools 0.11.0", - "prost 0.12.3", + "prost", "schemars", "serde", "sha2 0.10.8", @@ -818,7 +715,7 @@ dependencies = [ "cw-utils", "derivative", "itertools 0.12.0", - "prost 0.12.3", + "prost", "schemars", "serde", "sha2 0.10.8", @@ -1053,16 +950,6 @@ dependencies = [ "parking_lot_core", ] -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - [[package]] name = "der" version = "0.7.8" @@ -1149,51 +1036,18 @@ dependencies = [ "memmap2 0.5.10", ] -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ - "der 0.7.8", + "der", "digest 0.10.7", - "elliptic-curve 0.13.6", - "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek", - "ed25519", - "sha2 0.9.9", - "zeroize", + "elliptic-curve", + "rfc6979", + "signature", + "spki", ] [[package]] @@ -1217,41 +1071,21 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - [[package]] name = "elliptic-curve" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.3", + "base16ct", + "crypto-bigint", "digest 0.10.7", - "ff 0.13.0", + "ff", "generic-array", - "group 0.13.0", - "pkcs8 0.10.2", + "group", + "pkcs8", "rand_core 0.6.4", - "sec1 0.7.3", + "sec1", "subtle", "zeroize", ] @@ -1327,16 +1161,6 @@ dependencies = [ "libc", ] -[[package]] -name = "eyre" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" -dependencies = [ - "indenter", - "once_cell", -] - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -1349,16 +1173,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "ff" version = "0.13.0" @@ -1369,16 +1183,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "flex-error" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" -dependencies = [ - "eyre", - "paste", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1421,21 +1225,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.29" @@ -1443,7 +1232,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -1452,34 +1240,12 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" -[[package]] -name = "futures-executor" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" -[[package]] -name = "futures-macro" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "futures-sink" version = "0.3.29" @@ -1498,11 +1264,8 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ - "futures-channel", "futures-core", "futures-io", - "futures-macro", - "futures-sink", "futures-task", "memchr", "pin-project-lite", @@ -1537,10 +1300,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -1560,24 +1321,13 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", + "ff", "rand_core 0.6.4", "subtle", ] @@ -1616,30 +1366,6 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -[[package]] -name = "headers" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" -dependencies = [ - "base64 0.21.4", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - [[package]] name = "heck" version = "0.4.1" @@ -1734,43 +1460,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-proxy" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" -dependencies = [ - "bytes", - "futures", - "headers", - "http", - "hyper", - "hyper-rustls", - "rustls-native-certs", - "tokio", - "tokio-rustls", - "tower-service", - "webpki", -] - -[[package]] -name = "hyper-rustls" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" -dependencies = [ - "ct-logs", - "futures-util", - "hyper", - "log", - "rustls", - "rustls-native-certs", - "tokio", - "tokio-rustls", - "webpki", - "webpki-roots", -] - [[package]] name = "hyper-tls" version = "0.5.0" @@ -1818,12 +1507,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - [[package]] name = "indexmap" version = "1.9.3" @@ -1840,15 +1523,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.11.0" @@ -1882,19 +1556,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.8", - "sha3", -] - [[package]] name = "k256" version = "0.13.1" @@ -1902,20 +1563,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", - "ecdsa 0.16.8", - "elliptic-curve 0.13.6", + "ecdsa", + "elliptic-curve", "once_cell", "sha2 0.10.8", - "signature 2.1.0", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", + "signature", ] [[package]] @@ -2141,34 +1793,13 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "nibiru-macro", - "prost 0.12.3", - "prost-types 0.12.1", + "prost", + "prost-types", "serde", "serde_json", - "test-tube", "thiserror", ] -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-traits" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", -] - [[package]] name = "num_cpus" version = "1.16.0" @@ -2179,15 +1810,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "nusd-valuator" version = "0.1.0" @@ -2283,74 +1905,12 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "peg" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" -dependencies = [ - "peg-macros", - "peg-runtime", -] - -[[package]] -name = "peg-macros" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" -dependencies = [ - "peg-runtime", - "proc-macro2", - "quote", -] - -[[package]] -name = "peg-runtime" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" - [[package]] name = "percent-encoding" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "pin-project-lite" version = "0.2.13" @@ -2363,24 +1923,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.8", - "spki 0.7.2", + "der", + "spki", ] [[package]] @@ -2465,16 +2015,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive 0.11.9", -] - [[package]] name = "prost" version = "0.12.3" @@ -2482,20 +2022,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive 0.12.3", -] - -[[package]] -name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools 0.10.5", - "proc-macro2", - "quote", - "syn 1.0.109", + "prost-derive", ] [[package]] @@ -2511,22 +2038,13 @@ dependencies = [ "syn 2.0.38", ] -[[package]] -name = "prost-types" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" -dependencies = [ - "prost 0.11.9", -] - [[package]] name = "prost-types" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" dependencies = [ - "prost 0.12.3", + "prost", ] [[package]] @@ -2685,7 +2203,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.4", + "base64", "bytes", "encoding_rs", "futures-core", @@ -2717,17 +2235,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -2738,41 +2245,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "ripemd160" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "rkyv" version = "0.7.42" @@ -2788,7 +2260,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.6.1", + "uuid", ] [[package]] @@ -2821,31 +2293,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls-native-certs" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" -dependencies = [ - "openssl-probe", - "rustls", - "schannel", - "security-framework", -] - [[package]] name = "ryu" version = "1.0.15" @@ -2914,46 +2361,22 @@ dependencies = [ "walkdir", ] -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "seahash" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct 0.2.0", - "der 0.7.8", + "base16ct", + "der", "generic-array", - "pkcs8 0.10.2", + "pkcs8", "subtle", "zeroize", ] @@ -3031,15 +2454,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "serde_bytes" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" -dependencies = [ - "serde", -] - [[package]] name = "serde_derive" version = "1.0.193" @@ -3073,17 +2487,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3096,17 +2499,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - [[package]] name = "sha2" version = "0.9.9" @@ -3131,16 +2523,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - [[package]] name = "shared-buffer" version = "0.1.3" @@ -3168,16 +2550,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "2.1.0" @@ -3235,22 +2607,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - [[package]] name = "spki" version = "0.7.2" @@ -3258,7 +2614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", - "der 0.7.8", + "der", ] [[package]] @@ -3285,15 +2641,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - [[package]] name = "syn" version = "1.0.109" @@ -3362,123 +2709,12 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "tendermint" -version = "0.23.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467f82178deeebcd357e1273a0c0b77b9a8a0313ef7c07074baebe99d87851f4" -dependencies = [ - "async-trait", - "bytes", - "ed25519", - "ed25519-dalek", - "flex-error", - "futures", - "k256 0.11.6", - "num-traits", - "once_cell", - "prost 0.11.9", - "prost-types 0.11.9", - "ripemd160", - "serde", - "serde_bytes", - "serde_json", - "serde_repr", - "sha2 0.9.9", - "signature 1.6.4", - "subtle", - "subtle-encoding", - "tendermint-proto", - "time", - "zeroize", -] - -[[package]] -name = "tendermint-config" -version = "0.23.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42ee0abc27ef5fc34080cce8d43c189950d331631546e7dfb983b6274fa327" -dependencies = [ - "flex-error", - "serde", - "serde_json", - "tendermint", - "toml", - "url", -] - -[[package]] -name = "tendermint-proto" -version = "0.23.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ce80bf536476db81ecc9ebab834dc329c9c1509a694f211a73858814bfe023" -dependencies = [ - "bytes", - "flex-error", - "num-derive", - "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", - "serde", - "serde_bytes", - "subtle-encoding", - "time", -] - -[[package]] -name = "tendermint-rpc" -version = "0.23.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f14aafe3528a0f75e9f3f410b525617b2de16c4b7830a21f717eee62882ec60" -dependencies = [ - "async-trait", - "bytes", - "flex-error", - "futures", - "getrandom", - "http", - "hyper", - "hyper-proxy", - "hyper-rustls", - "peg", - "pin-project", - "serde", - "serde_bytes", - "serde_json", - "subtle-encoding", - "tendermint", - "tendermint-config", - "tendermint-proto", - "thiserror", - "time", - "tokio", - "tracing", - "url", - "uuid 0.8.2", - "walkdir", -] - [[package]] name = "termtree" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" -[[package]] -name = "test-tube" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e79c7af10967dd3383ee5aae3810637cc3f2fd040f87f862c02151db060628" -dependencies = [ - "base64 0.13.1", - "cosmrs", - "cosmwasm-std", - "prost 0.11.9", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "thiserror" version = "1.0.50" @@ -3499,23 +2735,6 @@ dependencies = [ "syn 2.0.38", ] -[[package]] -name = "time" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" -dependencies = [ - "libc", - "num_threads", - "time-macros", -] - -[[package]] -name = "time-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" - [[package]] name = "tinyvec" version = "1.6.0" @@ -3560,21 +2779,9 @@ dependencies = [ "num_cpus", "pin-project-lite", "socket2 0.5.4", - "tokio-macros", "windows-sys 0.48.0", ] -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "tokio-native-tls" version = "0.3.1" @@ -3585,17 +2792,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls", - "tokio", - "webpki", -] - [[package]] name = "tokio-util" version = "0.7.9" @@ -3610,15 +2806,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - [[package]] name = "tower-service" version = "0.3.2" @@ -3690,12 +2877,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "url" version = "2.4.1" @@ -3713,12 +2894,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" - [[package]] name = "uuid" version = "1.6.1" @@ -4041,25 +3216,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki", -] - [[package]] name = "winapi" version = "0.3.9" @@ -4224,17 +3380,3 @@ name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] diff --git a/artifacts/bindings_perp.wasm b/artifacts/bindings_perp.wasm deleted file mode 100644 index a15f98712354243c6a060027266fc43c373d151b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371168 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

*Rw} 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 z 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 AqyPW_ diff --git a/artifacts/checksums.txt b/artifacts/checksums.txt index 1bdadb7..d9a78bf 100644 --- a/artifacts/checksums.txt +++ b/artifacts/checksums.txt @@ -1,9 +1,11 @@ 65548e00849045afabb51ec80f357dc1306198ffbfd548d03660ef40fba29017 bindings_perp.wasm 382c05baf544f2886de849933ecf59e8bc3bcdcdd552d5a63537bd6d63f2ecf1 controller.wasm -715ee1e374074d61da6f9f31b3c645430099368c40f2d310ecec9035ab36bbb9 cw3_flex_multisig.wasm -d8da804212d8936dd83cabd3a72bdf9736177b860fee90e27bd8cdf19081abe7 incentives.wasm -894be8cd463a9342f8844d7877b6d6b92d31977d3b3b63f75a04dece87ebc794 lockup.wasm -48882c2a3cb6a4d660876956a1f3ed20128aaad0b2a42d28db83ce08c47f2ee1 nibi_stargate.wasm -847b7f4da9f1b4691af6a637980f9076b4d467268f40a628dd5730e10fbbaea4 pricefeed.wasm -ac216371a86908eadbe99f5cfd83785eee30b70d6214a3ea5a112c2fc2b33321 shifter.wasm -daeacf4a9738b716d4447e2e843c41cc4e1d69245334d5f7f409250c2c6ff149 token_vesting.wasm +83d726be3842b4df7179b9cfd84c3c9f8856d4252738cf4a6d27fc699f5b43bf cw3_flex_multisig.wasm +f44fd4d9a266f9281bdbedec277d82484c88688ac436d908d41ded1643b0b3f3 incentives.wasm +4c3932c7bcf99112053da52ab15d7718e827d9e71a64d57181c3816dff141e71 lockup.wasm +691ebc43eb5f65cd27f42cce3a54728de3bf9480c4f5d515577d3f7622c8f230 nibi_stargate.wasm +dd43d196d97a4343f4d78660df7eefb50fac26f25bbc4d105289f04449591d0f nibi_stargate_perp.wasm +eb17c2b336d01e07d4de296d32659f05fcbc77d4d80c3e74893d0d1b9f505bd5 nusd_valuator.wasm +d4b6a34c5c51c1e080b953fcc43b011f6616e7a49b50fb18bf93ec7dddbe9a95 pricefeed.wasm +2a33ecb9f76960dc47fc5149964c967a51b64db7323d3e5140ddd04dc2dc3d81 shifter.wasm +dd8fb20aefaf69951c09f42bfe5d9678678d51b9f3e2bba098f3175fb86785a9 token_vesting.wasm diff --git a/artifacts/checksums_intermediate.txt b/artifacts/checksums_intermediate.txt index 003d3e1..4764b30 100644 --- a/artifacts/checksums_intermediate.txt +++ b/artifacts/checksums_intermediate.txt @@ -1,8 +1,10 @@ 2ab8bde9574144e1c77e28658e2bbb8fe3f650ce893d16c7a0ae09caf4d5f20c target/wasm32-unknown-unknown/release/controller.wasm -5880bd966316aa68c8674017b66a0fe1d969365e91cf7cc6c0f5c9138afc0c7f target/wasm32-unknown-unknown/release/cw3_flex_multisig.wasm -f05b9f9728f6d1beea36b183f790cc02223b9cef3ad17eff627b44614d022a53 target/wasm32-unknown-unknown/release/nibi_stargate.wasm -d0f9b859d13e40e5ba0062c60a31626b2db078d4e7c2d177c30d3cf4c8ec93b4 target/wasm32-unknown-unknown/release/shifter.wasm -9b021b82d0b818dd53888ce8874664c991b13969cf8bcc465fe82093a7e4849b target/wasm32-unknown-unknown/release/incentives.wasm -289eab8de64b6e5e162a2e5f10beb351883f9c5db64d8b6a27909167f5ce6916 target/wasm32-unknown-unknown/release/lockup.wasm -80657dbf13a68f0f36eb6e5e336d034418ee29b226f2404979c9880fa08c3d5a target/wasm32-unknown-unknown/release/pricefeed.wasm -73cf16d252f15867edbe4508d08524654f719fa873ace1fd2f7cfea74228f89c target/wasm32-unknown-unknown/release/token_vesting.wasm +677b73186dd1ee83c6b75af4a81163dc1339018c6e4debf55a3b599d8cb38342 target/wasm32-unknown-unknown/release/cw3_flex_multisig.wasm +9f67eabfa924253c2c952d460445ec88735745ba5e93bbc0a2a7f34c6f9657ce target/wasm32-unknown-unknown/release/incentives.wasm +4714efc1737ae3a5be19d88fcf8adf8c904a3820f82e13ab5d684e2e50b1910a target/wasm32-unknown-unknown/release/lockup.wasm +87e3dbe43bbb9e06212a53bd0886029a94b9c2e1f9a0c0a65fc383c6eb2d582d target/wasm32-unknown-unknown/release/nibi_stargate.wasm +a03d9756f6115ff1ea618cd48ae56cd1ccbd0de2d88bf30ca1c6aa9d39c27290 target/wasm32-unknown-unknown/release/nibi_stargate_perp.wasm +6b9f32dbda5ae59f7eb815e33cbc8a78ea48fff0e684ee37613480424f12eeb5 target/wasm32-unknown-unknown/release/nusd_valuator.wasm +e24d58bfffb5e32d61da22a7571017617376c8ee6018a05a5a8d24a7c0c9cad3 target/wasm32-unknown-unknown/release/pricefeed.wasm +9260a69da29a6ebb0fa99bd5ad3c28f4af5636aae407db70e72fd3c458f72f8c target/wasm32-unknown-unknown/release/shifter.wasm +c2b0bf03c5467fb861465a2ce22235e5bf64e9dcd267036fed387b9a13177ee4 target/wasm32-unknown-unknown/release/token_vesting.wasm diff --git a/artifacts/cw3_flex_multisig.wasm b/artifacts/cw3_flex_multisig.wasm index 9bb62ea93354322df3820112deb9d9f6090439f4..85062c1e879bd571fe5ed4aa4c7be4f02e7b7be4 100644 GIT binary patch delta 154570 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�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
5j8TKZ8#Z9xBJiIu(ZHXo-aS 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 `aXliF``*dXeK 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 U$}l{Sy!<1=X9#a6MjGWDq4ND0G675Ey0# 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 delta 94854 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